Revision: 201033 RCL_3
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:45:49 +0300
branchRCL_3
changeset 20 ca8a1b6995f6
parent 19 07b41fa8d1dd
child 21 52e343bb8f80
Revision: 201033 Kit: 201035
analyzetool/symbian_version.hrh
debugsrv/runmodedebug/build.config.xml
debugsrv/runmodedebug/group/bld.inf
debugsrv/runmodedebug/rmdebug_test/eabi/t_rmdebug_dllu.def
debugsrv/runmodedebug/rmdebug_test/group/bld.inf
debugsrv/runmodedebug/rmdebug_test/group/e32test.bld
debugsrv/runmodedebug/rmdebug_test/group/mk_rmdbg_test.bat
debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/r_kernel_low_memory_security_svr_session.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/r_kernel_low_memory_security_svr_session.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/r_low_memory_security_svr_session.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/r_low_memory_security_svr_session.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/r_user_low_memory_security_svr_session.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/r_user_low_memory_security_svr_session.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/t_rmdebug2.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/t_rmdebug2.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/t_rmdebug2_oemtoken.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/common/t_debug_logging.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/common/t_target_launcher.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/common/t_target_launcher.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_demand_paging.cia
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_demand_paging.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebug_bkpt_test.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebug_bkpt_test.s
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebug_step_test.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebug_step_test.s
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebug_step_test_armv4.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebug_step_test_armv4.s
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebugthread.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebugthread.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebugthread2.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebugthread2.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebugthreadasm.cia
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebugthreadasm2.cia
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/t_rmdebug_app.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/t_rmdebug_app.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/t_rmdebug_dll.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/t_rmdebug_dll.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/t_rmdebug_security.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/t_rmdebug_security.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/bld.inf
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/mytraces_rm_debug.txt
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/mytraces_rm_debug_ekern.txt
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/rmdbg_test.pkg
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/rmdebug.iby
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_multi_agent_launcher.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_performance_test.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug.iby
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2.mmh
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2_allcaps.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2_allcapstoken.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2_oem.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2_oem2.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2_oemtoken.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2_oemtoken2.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app1.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app10.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app2.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app3.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app4.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app5.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app6.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app7.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app8.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app9.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_dll.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_multi_agent.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_multi_target.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_performance_allcapstoken.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_security0.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_security1.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_security2.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_security3.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_target_launcher.mmp
debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_tests.iby
debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_agent_tests/t_agent_eventhandler.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_agent_tests/t_agent_eventhandler.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_agent_tests/t_multi_agent.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_agent_tests/t_multi_agent.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_agent_tests/t_multi_agent_launcher.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_agent_tests/t_multi_agent_launcher.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_target_tests/t_multi_target.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_target_tests/t_multi_target.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/performance_test/t_rmdebug_performance_oemtoken.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/performance_test/t_rmdebug_performance_test.cpp
debugsrv/runmodedebug/rmdebug_test/rm_debug/performance_test/t_rmdebug_performance_test.h
debugsrv/runmodedebug/rmdebug_test/rm_debug/scripts/tef_execute_rtests.script
debugsrv/runmodedebug/rmdriver/group/bld.inf
debugsrv/runmodedebug/rmdriver/group/rm_debug_kerneldriver.mmh
debugsrv/runmodedebug/rmdriver/group/rm_debug_kerneldriver.mmp
debugsrv/runmodedebug/rmdriver/group/rm_debug_svr.iby
debugsrv/runmodedebug/rmdriver/group/sis/eula.txt
debugsrv/runmodedebug/rmdriver/group/sis/mk_rmdbg.bat
debugsrv/runmodedebug/rmdriver/group/sis/rmdbg.pkg
debugsrv/runmodedebug/rmdriver/inc/d_debug_agent.h
debugsrv/runmodedebug/rmdriver/inc/d_debug_agent.inl
debugsrv/runmodedebug/rmdriver/inc/d_debug_functionality.h
debugsrv/runmodedebug/rmdriver/inc/d_driver_event_info.h
debugsrv/runmodedebug/rmdriver/inc/d_list_manager.h
debugsrv/runmodedebug/rmdriver/inc/d_process_tracker.h
debugsrv/runmodedebug/rmdriver/inc/d_rmd_breakpoints.h
debugsrv/runmodedebug/rmdriver/inc/d_rmd_breakpoints_debug.inl
debugsrv/runmodedebug/rmdriver/inc/d_rmd_stepping.h
debugsrv/runmodedebug/rmdriver/inc/d_rmd_stepping.inl
debugsrv/runmodedebug/rmdriver/inc/d_target_process.h
debugsrv/runmodedebug/rmdriver/inc/debug_logging.h
debugsrv/runmodedebug/rmdriver/inc/debug_utils.h
debugsrv/runmodedebug/rmdriver/inc/rm_debug_driver.h
debugsrv/runmodedebug/rmdriver/inc/rm_debug_eventhandler.h
debugsrv/runmodedebug/rmdriver/inc/rm_debug_kerneldriver.h
debugsrv/runmodedebug/rmdriver/src/d_debug_agent.cpp
debugsrv/runmodedebug/rmdriver/src/d_debug_functionality.cpp
debugsrv/runmodedebug/rmdriver/src/d_driver_event_info.cpp
debugsrv/runmodedebug/rmdriver/src/d_list_manager.cpp
debugsrv/runmodedebug/rmdriver/src/d_process_tracker.cpp
debugsrv/runmodedebug/rmdriver/src/d_rmd_breakpoints.cpp
debugsrv/runmodedebug/rmdriver/src/d_rmd_stepping.cpp
debugsrv/runmodedebug/rmdriver/src/d_target_process.cpp
debugsrv/runmodedebug/rmdriver/src/debug_utils.cpp
debugsrv/runmodedebug/rmdriver/src/rm_debug_eventhandler.cpp
debugsrv/runmodedebug/rmdriver/src/rm_debug_kerneldriver.cpp
debugsrv/runmodedebug/securityserver/group/rm_debug_svr.mmp
debugsrv/runmodedebug/securityserver/inc/c_process_pair.h
debugsrv/runmodedebug/securityserver/inc/c_security_svr_async.h
debugsrv/runmodedebug/securityserver/inc/c_security_svr_server.h
debugsrv/runmodedebug/securityserver/inc/c_security_svr_session.h
debugsrv/runmodedebug/securityserver/inc/c_shutdown_timer.h
debugsrv/runmodedebug/securityserver/inc/low_mem_requests.h
debugsrv/runmodedebug/securityserver/inc/rm_debug_api.h
debugsrv/runmodedebug/securityserver/inc/rm_debug_logging.h
debugsrv/runmodedebug/securityserver/src/c_process_pair.cpp
debugsrv/runmodedebug/securityserver/src/c_security_svr_async.cpp
debugsrv/runmodedebug/securityserver/src/c_security_svr_server.cpp
debugsrv/runmodedebug/securityserver/src/c_security_svr_session.cpp
debugsrv/runmodedebug/securityserver/src/c_shutdown_timer.cpp
debugsrv/runmodedebug/securityserver/src/rm_debug_svr.cpp
group/bld.inf
layers.sysdef.xml
memspy/CommandLine/Include/MemSpyCommandLine.h
memspy/CommandLine/Include/MemSpyCommands.h
memspy/CommandLine/Source/MemSpyCommandLine.cpp
memspy/CommandLine/Source/MemSpyCommandLineMain.cpp
memspy/CommandLine/group/MemSpyCommandLine.mmp
memspy/Console/Include/ConsoleMenu.h
memspy/Console/Source/ConsoleDWOperation.cpp
memspy/Console/Source/ConsoleMain.cpp
memspy/Console/Source/ConsoleMenu.cpp
memspy/Console/group/MemSpyConsole.mmp
memspy/Console/group/bld.inf
memspy/Driver/BWINS/memspydriverclientu.def
memspy/Driver/Kernel/Include/MemSpyDriverHeap.h
memspy/Driver/Kernel/Include/MemSpyDriverHeapStatistics.h
memspy/Driver/Kernel/Include/MemSpyDriverHeapWalker.h
memspy/Driver/Kernel/Include/MemSpyDriverInspectedProcess.h
memspy/Driver/Kernel/Include/MemSpyDriverLog.h
memspy/Driver/Kernel/Include/MemSpyDriverOSAdaption.h
memspy/Driver/Kernel/Include/MemSpyDriverObjectIx.h
memspy/Driver/Kernel/Include/SubChannels/MemSpyDriverLogChanContainerBase.h
memspy/Driver/Kernel/Include/SubChannels/MemSpyDriverLogChanHeapBase.h
memspy/Driver/Kernel/Include/SubChannels/MemSpyDriverLogChanHeapInfo.h
memspy/Driver/Kernel/Include/SubChannels/MemSpyDriverLogChanHeapWalk.h
memspy/Driver/Kernel/Source/MemSpyDriverEventMonitor.cpp
memspy/Driver/Kernel/Source/MemSpyDriverHeap.cpp
memspy/Driver/Kernel/Source/MemSpyDriverHeapWalker.cpp
memspy/Driver/Kernel/Source/MemSpyDriverInspectedProcess.cpp
memspy/Driver/Kernel/Source/MemSpyDriverLogicalChannel.cpp
memspy/Driver/Kernel/Source/MemSpyDriverOSAdaption.cpp
memspy/Driver/Kernel/Source/MemSpyDriverObjectIx.cpp
memspy/Driver/Kernel/Source/MemSpyDriverStreamWriter.cpp
memspy/Driver/Kernel/Source/MemSpyDriverSuspensionManager.cpp
memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanBase.cpp
memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanChunks.cpp
memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanClientServer.cpp
memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanContainerBase.cpp
memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanContainers.cpp
memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapBase.cpp
memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapData.cpp
memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapInfo.cpp
memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapWalk.cpp
memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanMisc.cpp
memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanStack.cpp
memspy/Driver/Shared/MemSpyDriverObjectsInternal.h
memspy/Driver/Shared/MemSpyDriverOpCodes.h
memspy/Driver/Shared/heaputils.cpp
memspy/Driver/Shared/heaputils.h
memspy/Driver/User/Include/RBuildQueryableHeap.h
memspy/Driver/User/Source/MemSpyDriverClient.cpp
memspy/Driver/User/Source/RBuildQueryableHeap.cpp
memspy/Driver/eabi/memspydriverclientu.def
memspy/Driver/group/MemSpyDriver.mmp
memspy/Driver/group/MemSpyDriverClient.mmp
memspy/Engine/BWINS/MemSpyEngineu.def
memspy/Engine/Include/ClientServer/MemSpyEngineServer.h
memspy/Engine/Include/Sink/MemSpyEngineOutputSinkFile.h
memspy/Engine/Source/ClientServer/MemSpyEngineServer.cpp
memspy/Engine/Source/DeviceWideOps/MemSpyDeviceWideOperations.cpp
memspy/Engine/Source/Helpers/MemSpyEngineHelperActiveObject.cpp
memspy/Engine/Source/Helpers/MemSpyEngineHelperFbServ.cpp
memspy/Engine/Source/Helpers/MemSpyEngineHelperHeap.cpp
memspy/Engine/Source/Helpers/MemSpyEngineHelperKernelContainers.cpp
memspy/Engine/Source/Helpers/MemSpyEngineHelperStack.cpp
memspy/Engine/Source/MemSpyEngine.cpp
memspy/Engine/Source/MemSpyEngineImp.cpp
memspy/Engine/Source/MemSpyEngineUtils.cpp
memspy/Engine/Source/Sink/MemSpyEngineOutputList.cpp
memspy/Engine/Source/Sink/MemSpyEngineOutputSink.cpp
memspy/Engine/Source/Sink/MemSpyEngineOutputSinkFile.cpp
memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTracker.cpp
memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTrackerEntryHeap.cpp
memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTrackerEntryManager.cpp
memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectContainer.cpp
memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectProcess.cpp
memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectThread.cpp
memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectThreadInfoObjects.cpp
memspy/Engine/eabi/MemSpyEngineu.def
memspy/Engine/group/MemSpyEngine.mmp
memspy/MemSpyClient/bwins/MemSpyClientu.def
memspy/MemSpyClient/eabi/MemSpyClientu.def
memspy/MemSpyClient/group/MemSpyClient.mmp
memspy/MemSpyClient/group/bld.inf
memspy/MemSpyClient/inc/memspyapiheap.h
memspy/MemSpyClient/inc/memspyapikernelobject.h
memspy/MemSpyClient/inc/memspyapikernelobjectitem.h
memspy/MemSpyClient/inc/memspyapimemorytrackingcycle.h
memspy/MemSpyClient/inc/memspyapiprocess.h
memspy/MemSpyClient/inc/memspyapithread.h
memspy/MemSpyClient/inc/memspyapithreadinfoitem.h
memspy/MemSpyClient/inc/memspyheapdata.h
memspy/MemSpyClient/inc/memspykernelobjectdata.h
memspy/MemSpyClient/inc/memspymemorytrackingcycledata.h
memspy/MemSpyClient/inc/memspyprocessdata.h
memspy/MemSpyClient/inc/memspysession.h
memspy/MemSpyClient/inc/memspythreaddata.h
memspy/MemSpyClient/inc/memspythreadinfoitemdata.h
memspy/MemSpyClient/src/memspyapiheap.cpp
memspy/MemSpyClient/src/memspyapikernelobject.cpp
memspy/MemSpyClient/src/memspyapikernelobjectitem.cpp
memspy/MemSpyClient/src/memspyapimemorytrackingcycle.cpp
memspy/MemSpyClient/src/memspyapiprocess.cpp
memspy/MemSpyClient/src/memspyapithread.cpp
memspy/MemSpyClient/src/memspyapithreadinfoitem.cpp
memspy/MemSpyClient/src/memspysession.cpp
memspy/MemSpyServer/Source/MemSpyServerMain.cpp
memspy/MemSpyServer/group/MemSpyServer.mmp
memspy/MemSpyServer/group/bld.inf
memspy/group/ReleaseNotes_MemSpy.txt
memspy/group/bld.inf
memspy/memspy_plat/memspy_api/include/MemSpyEngineClientInterface.h
memspy/memspy_plat/memspy_api/include/memspy/driver/shared/MemSpyDriverEnumerationsShared.h
memspy/memspy_plat/memspy_api/include/memspy/driver/shared/MemSpyDriverObjectsShared.h
memspy/memspy_plat/memspy_api/include/memspy/driver/shared/MemSpyDriverObjectsSharedRHeap.h
memspy/memspy_plat/memspy_api/include/memspy/driver/user/MemSpyDriverClient.h
memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperFbServ.h
memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperHeap.h
memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperKernelContainers.h
memspy/memspy_plat/memspy_api/include/memspy/engine/MemSpyEngine.h
memspy/memspy_plat/memspy_api/include/memspy/engine/MemSpyEngineImp.h
memspy/memspy_plat/memspy_api/include/memspy/engine/Sink/MemSpyEngineOutputSink.h
memspy/memspy_plat/memspy_api/include/memspy/engine/SysMemTracker/MemSpyEngineHelperSysMemTracker.h
memspy/memspy_plat/memspy_api/include/memspy/engine/SysMemTracker/MemSpyEngineHelperSysMemTrackerConfig.h
memspy/memspy_plat/memspy_api/include/memspy/engine/ThreadAndProcess/MemSpyEngineObjectProcess.h
memspy/memspy_plat/memspy_api/include/memspy/engine/ThreadAndProcess/MemSpyEngineObjectThread.h
memspy/memspy_plat/memspy_api/include/memspy/engine/ThreadAndProcess/MemSpyEngineObjectThreadInfoObjects.h
memspy/rom/memspy.iby
memspy/symbian_version.hrh
osrndtools_info/osrndtools_metadata/osrndtools_metadata.mrp
package_definition.xml
piprofiler/group/ReleaseNotes_PIProfiler.txt
piprofiler/group/bld.inf
piprofiler/plugins/GeneralsPlugin/src/GppSamplerImpl.cpp
piprofiler/plugins/PWRplugin/data/2001E5B9.rss
piprofiler/plugins/PWRplugin/group/PWRPlugin.mmp
piprofiler/plugins/PWRplugin/group/bld.inf
piprofiler/plugins/PWRplugin/inc/PwrPlugin.h
piprofiler/plugins/PWRplugin/sis/PWRPlugin.pkg
piprofiler/plugins/PWRplugin/src/PwrPlugin.cpp
piprofiler/plugins/PWRplugin/src/PwrPluginImplementationTable.cpp
piprofiler/rom/piprofiler.iby
piprofiler/rom/piprofiler_s2.iby
piprofiler/symbian_version.hrh
tracefw/tracecompiler/group/bld.inf
tracefw/tracecompiler/group/build.xml
tracefw/tracecompiler/src/com.nokia.tracecompiler/.classpath
tracefw/tracecompiler/src/com.nokia.tracecompiler/.project
tracefw/tracecompiler/src/com.nokia.tracecompiler/.settings/org.eclipse.core.resources.prefs
tracefw/tracecompiler/src/com.nokia.tracecompiler/.settings/org.eclipse.jdt.core.prefs
tracefw/tracecompiler/src/com.nokia.tracecompiler/.settings/org.eclipse.jdt.ui.prefs
tracefw/tracecompiler/src/com.nokia.tracecompiler/about.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/build.properties
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/Messages.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompiler.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerConfiguration.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerConstants.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerGlobals.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerIllegalArgumentsException.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerLogger.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerMain.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerModelListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerRootException.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerView.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryDefRef.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryEngine.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryFile.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryFileConstants.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryFileExport.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryFileRef.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryFileWriter.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryPreferences.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryRef.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/Messages.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/DataType.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/Dictionary.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/LocationStore.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/Options.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TagWriter.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TestEncoder.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/Trace.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TraceComponent.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TraceDataStore.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TraceDictionaryEncoder.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TraceGroup.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TypeDef.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TypeDefStore.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/XMLDataFilter.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/messages.properties
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/document/FileDocument.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/document/FileDocumentMonitor.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/document/Messages.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/document/StringDocument.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/document/StringDocumentFactory.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/document/messages.properties
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/ConfigurationDelegate.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/LocationListBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/LocationMapModelListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/LocationProperties.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/Messages.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/SourceContextManager.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/SourceContextManagerImpl.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngine.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineActions.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineConfiguration.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineConfigurationListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineErrorCodes.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineErrorMessages.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineEvents.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineGlobals.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineInterface.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineView.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceLocation.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceLocationConverter.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceLocationList.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceLocationListListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceLocationMap.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/ViewAdapter.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/event/EventEngine.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/event/Messages.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/event/messages.properties
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/event/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckFormattedTraceExists.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckIsBufferSizeDynamic.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckIsKernelModeEndifNeeded.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckIsKernelModeFlagNeeded.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckIsTraceBufferBuilt.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckIsTraceFormatDuplicate.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckParameterNeedsAlignment.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/ComplexHeaderRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/HeaderConstants.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/HeaderEngine.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/HeaderTemplate.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/IteratorComplexTraces.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/IteratorParameters.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/IteratorTraces.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/Messages.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/SetNewLineCount.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/TemplateCheckBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/TemplateChoice.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/TemplateIterator.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/TemplateIteratorEntry.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/TraceHeader.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/TraceHeaderWriter.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/messages.properties
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/messages.properties
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/plugin/PluginEngine.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/plugin/PluginTracePropertyVerifier.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/plugin/TraceAPIPluginManager.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/plugin/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/Messages.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/ProjectConstants.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/ProjectEngine.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/SortedProperties.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/TraceCompilerProject.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/TraceIDCache.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/messages.properties
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/DocumentElementWrapper.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/EnumElementParser.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/FileElementParser.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/Messages.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/PropertyFileConstants.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/PropertyFileElementParser.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/PropertyFileEngine.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/PropertyFileParser.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/PropertyFileUtils.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/TracePropertyFile.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/ValueElementParser.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/messages.properties
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ArrayParameterRuleImpl.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/AutoAddFunctionParametersRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/AutoAddParameterRuleBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/AutoAddReturnParameterRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/AutoAddThisPtrRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/AutoAddValueRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/AutomaticTraceTextRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ClassNameWrapper.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ComplexHeaderRuleImpl.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/EndOfFunctionLocationRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/EntryTraceRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ExitTracePropertyBuilder.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ExitTraceRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ExtensionBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/FillerParameterRuleImpl.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/Messages.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ParameterTypeMappingRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/PerformanceEventRuleBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/PerformanceEventStartRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/PerformanceEventStopRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ReadOnlyObjectRuleImpl.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RuleBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RuleUtils.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEngine.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEngineConfigurationListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEngineConstants.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEngineModelListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEnginePluginManager.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEngineResetListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/SourceParserRuleBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/StartOfFunctionLocationRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/StateTraceRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ThisPointerParameterTemplate.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/TraceFormatRuleBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/TraceParameterFormattingRuleBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ValueParameterTemplate.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/messages.properties
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/osttrace/OstConstants.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/osttrace/OstTraceFormatRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/osttrace/OstTraceParserRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/osttrace/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/Messages.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceEngine.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceEngineModelExtensionListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceEngineModelListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceFormatter.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceLocationRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceParserResult.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceParserRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceProperties.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/TraceFormattingRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/TraceParameterFormattingRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/messages.properties
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/utils/TraceMultiplierRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/utils/TraceUtils.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/utils/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/file/FileCompareOutputStream.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/file/FileUtils.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/licence.lic
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/licence_hash.lic
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/messages.properties
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/DuplicateParameterNameModifier.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/DuplicateValueModifier.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/Trace.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceCompilerErrorParameters.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceCompilerException.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceConstantTable.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceConstantTableEntry.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceGroup.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModel.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModelExtension.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModelExtensionListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModelListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModelPersistentExtension.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModelResetListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObject.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectFactory.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectModifier.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectProperty.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectPropertyList.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectPropertyVerifier.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectRuleCreateObject.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectRuleFactory.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectRuleOnDelete.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectRuleRemoveOnCreate.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectUtils.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceParameter.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceProcessingListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceAPIFormatter.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceAPIParser.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceAPIPlugin.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceCompilerExport.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceCompilerPlugin.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceFormatConstants.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceHeaderContribution.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/FormattingUtils.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/GroupNameIdPair.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/GroupNames.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/Messages.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/ProjectFileParser.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/ProjectUtils.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/PropertyNames.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/TraceLocationParser.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/TraceProjectAPI.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/TraceProjectAPIList.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/TraceProjectFile.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/messages.properties
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/rules/ArrayParameterRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/rules/FillerParameterRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/rules/HiddenTraceObjectRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/rules/ReadOnlyObjectRule.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/rules/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/ContextAreaParser.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/ContextSearchData.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/ExcludedAreaParser.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/ExcludedAreaSearchData.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/FormatMapping.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/FunctionReturnValueParser.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/FunctionReturnValueSearchData.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/OffsetLength.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/ParsedType.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/PositionArrayComparator.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceConstants.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceContext.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceDocumentFactory.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceDocumentInterface.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceDocumentMonitor.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceDocumentProcessor.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceErrorCodes.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceExcludedArea.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceIterator.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceLocation.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceLocationBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceLocationInterface.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceLocationListener.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceParameter.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceParameterTokenizer.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceParser.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceParserException.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourcePropertyProvider.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceReturn.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceSearch.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceSelector.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceStringSearch.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceUtils.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SymbianConstants.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/TokenizerSearchData.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/TypeMapping.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/package.html
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/DocumentAdapter.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/DocumentFactory.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/DocumentFactoryBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/DocumentMonitorBase.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/SimpleLocation.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/TraceCompilerVersion.java
tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/package.html
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_1.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_2.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_3.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_4.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_5.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_6_0.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_6_1.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_6_2.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_6_3.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_7_0.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_7_1.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_7_2.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_8.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_9.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_tc_output_8.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_tc_output_9.txt
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/group/FixedIdDefinitionsTestApp.mmp
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/group/bld.inf
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/inc/FixedIdDefinitionsTestApp.h
tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/src/FixedIdDefinitionsTestApp.cpp
tracefw/tracecompiler/test/MultipleCppTraceErrorApp/data/referencelog.txt
tracefw/tracecompiler/test/MultipleCppTraceErrorApp/group/MultipleCppTraceErrorApp.mmp
tracefw/tracecompiler/test/MultipleCppTraceErrorApp/group/bld.inf
tracefw/tracecompiler/test/MultipleCppTraceErrorApp/inc/MultipleCppTraceErrorApp.h
tracefw/tracecompiler/test/MultipleCppTraceErrorApp/sis/TraceErrorApp_EKA2.pkg
tracefw/tracecompiler/test/MultipleCppTraceErrorApp/src/ExtraCppFile.cpp
tracefw/tracecompiler/test/MultipleCppTraceErrorApp/src/MultipleCppTraceErrorApp.cpp
tracefw/tracecompiler/test/MultipleCppTraceErrorApp/traces/OstTraceDefinitions.h
tracefw/tracecompiler/test/MultipleCppTraceErrorApp/traces/fixed_id.definitions
tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/data/referencelog.txt
tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/group/MultipleMmpTraceErrorApp1.mmp
tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/group/MultipleMmpTraceErrorApp2.mmp
tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/group/bld.inf
tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/inc/MultipleMmpTraceErrorApp.h
tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/sis/TraceErrorApp_EKA2.pkg
tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/src/ExtraCppFile1.cpp
tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/src/ExtraCppFile2.cpp
tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/src/MultipleMmpTraceErrorApp1.cpp
tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/src/MultipleMmpTraceErrorApp2.cpp
tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/traces/OstTraceDefinitions.h
tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/traces/fixed_id.definitions
tracefw/tracecompiler/test/TraceErrorApp/data/referencelog.txt
tracefw/tracecompiler/test/TraceErrorApp/group/TraceErrorApp.mmp
tracefw/tracecompiler/test/TraceErrorApp/group/bld.inf
tracefw/tracecompiler/test/TraceErrorApp/inc/TraceErrorApp.h
tracefw/tracecompiler/test/TraceErrorApp/sis/TraceErrorApp_EKA2.pkg
tracefw/tracecompiler/test/TraceErrorApp/src/TraceErrorApp.cpp
tracefw/tracecompiler/test/TraceErrorApp/traces/OstTraceDefinitions.h
tracefw/tracecompiler/test/TraceErrorApp/traces/fixed_id.definitions
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/console/group/HelloTraceConsole.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/console/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/console/group/hellotraceconsole.iby
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/console/inc/HelloTraceConsole.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/console/src/HelloTraceConsole.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/bwins/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/eabi/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/group/HelloTraceDll.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/group/HelloTraceDll2.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/group/hellotracedll.iby
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceExample.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceFn.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceFn2.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceInterface.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceInterface2.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTracePanic.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceTypes.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceTypes2.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceFn2Dup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceFn2Dup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceFnDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceFnDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceInterface2Dup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceInterface2Dup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceInterfaceDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceInterfaceDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceTypes2Dup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceTypes2Dup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceTypesDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceTypesDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/src/HelloTraceExample.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/src/HelloTraceFn.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/src/HelloTraceInterface.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/src/HelloTracePanic.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/src/HelloTraceTypes.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/traces/trace.properties
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/console/group/HelloTraceConsole.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/console/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/console/group/hellotraceconsole.iby
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/console/inc/HelloTraceConsole.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/console/src/HelloTraceConsole.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/bwins/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/eabi/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/group/HelloTraceDll.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/group/HelloTraceDll2.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/group/hellotracedll.iby
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/inc/HelloTraceExample.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/inc/HelloTraceFn.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/inc/HelloTraceInterface.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/inc/HelloTracePanic.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/inc/HelloTraceTypes.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/incDup/HelloTraceFnDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/incDup/HelloTraceFnDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/incDup/HelloTraceInterfaceDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/incDup/HelloTraceInterfaceDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/incDup/HelloTraceTypesDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/incDup/HelloTraceTypesDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/src/HelloTraceExample.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/src/HelloTraceFn.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/src/HelloTraceInterface.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/src/HelloTracePanic.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/src/HelloTraceTypes.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/traces/hellotracedll2_dll/trace.properties
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/traces/hellotracedll_dll/trace.properties
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/console/group/HelloTraceConsole.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/console/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/console/group/hellotraceconsole.iby
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/console/inc/HelloTraceConsole.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/console/src/HelloTraceConsole.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/bwins/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/eabi/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/group/HelloTraceDll.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/group/HelloTraceDll2.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/group/hellotracedll.iby
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceExample.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceFn.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceFn2.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceInterface.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceInterface2.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTracePanic.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceTypes.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceTypes2.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceFn2Dup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceFn2Dup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceFnDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceFnDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceInterface2Dup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceInterface2Dup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceInterfaceDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceInterfaceDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceTypes2Dup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceTypes2Dup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceTypesDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceTypesDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceExample.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceExample2.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceFn.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceFn2.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceInterface.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceInterface2.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTracePanic.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTracePanic2.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceTypes.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceTypes2.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/traces/trace.properties
tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/console/group/HelloTraceConsole.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/console/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/console/group/hellotraceconsole.iby
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/console/inc/HelloTraceConsole.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/bwins/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/eabi/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/group/HelloTraceDll.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/group/hellotracedll.iby
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/inc/HelloTraceExample.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/inc/HelloTraceFn.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/inc/HelloTraceInterface.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/inc/HelloTracePanic.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/inc/HelloTraceTypes.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/incDup/HelloTraceFnDup.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/incDup/HelloTraceFnDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/incDup/HelloTraceInterfaceDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/incDup/HelloTraceInterfaceDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/incDup/HelloTraceTypesDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/incDup/HelloTraceTypesDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/src/HelloTraceExample.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/src/HelloTraceFn.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/src/HelloTraceInterface.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/src/HelloTracePanic.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/src/HelloTraceTypes.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/traces/trace.properties
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/console/group/HelloTraceConsole.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/console/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/console/group/hellotraceconsole.iby
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/console/inc/HelloTraceConsole.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/console/src/HelloTraceConsole.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/bwins/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/eabi/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/group/HelloTraceDll.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/group/hellotracedll.iby
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/inc/HelloTraceExample.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/inc/HelloTraceFn.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/inc/HelloTraceInterface.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/inc/HelloTracePanic.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/inc/HelloTraceTypes.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/incDup/HelloTraceFnDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/incDup/HelloTraceFnDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/incDup/HelloTraceInterfaceDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/incDup/HelloTraceInterfaceDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/incDup/HelloTraceTypesDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/incDup/HelloTraceTypesDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/src/HelloTraceExample.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/src/HelloTraceFn.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/src/HelloTraceInterface.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/src/HelloTracePanic.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/src/HelloTraceTypes.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/traces/hellotracedll_dll/trace.properties
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/console/group/HelloTraceConsole.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/console/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/console/group/hellotraceconsole.iby
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/console/inc/HelloTraceConsole.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/console/src/HelloTraceConsole.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/bwins/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/eabi/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/group/HelloTraceDll.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/group/hellotracedll.iby
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/inc/HelloTraceExample.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/inc/HelloTraceInterface.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/inc/HelloTracePanic.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/inc/HelloTraceTypes.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/incDup/HelloTraceFnDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/incDup/HelloTraceFnDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/incDup/HelloTraceInterfaceDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/incDup/HelloTraceInterfaceDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/incDup/HelloTraceTypesDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/incDup/HelloTraceTypesDup2.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/src/HelloTraceExample.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/src/HelloTraceFn.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/src/HelloTraceInterface.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/src/HelloTracePanic.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/src/HelloTraceTypes.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/traces/trace.properties
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/console/group/HelloTraceConsole.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/console/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/console/group/hellotraceconsole.iby
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/console/inc/HelloTraceConsole.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/console/src/HelloTraceConsole.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/bwins/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/eabi/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/group/HelloTraceDll.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/group/hellotracedll.iby
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/inc/HelloTraceExample.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/inc/HelloTraceFn.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/inc/HelloTraceInterface.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/inc/HelloTracePanic.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/inc/HelloTraceTypes.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/incDup/HelloTraceFn.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/incDup/HelloTraceFnDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/incDup/HelloTraceInterface.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/incDup/HelloTraceInterfaceDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/incDup/HelloTraceTypes.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/incDup/HelloTraceTypesDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/src/HelloTraceExample.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/src/HelloTraceFn.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/src/HelloTraceInterface.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/src/HelloTracePanic.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/src/HelloTraceTypes.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/traces/trace.properties
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/console/group/HelloTraceConsole.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/console/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/console/group/hellotraceconsole.iby
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/console/inc/HelloTraceConsole.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/console/src/HelloTraceConsole.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/bwins/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/eabi/HelloTraceDllu.def
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/group/HelloTraceDll.mmp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/group/bld.inf
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/group/hellotracedll.iby
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/inc/HelloTraceExample.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/inc/HelloTraceFn.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/inc/HelloTraceInterface.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/inc/HelloTracePanic.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/inc/HelloTraceTypes.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/incDup/HelloTraceFn.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/incDup/HelloTraceFnDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/incDup/HelloTraceInterface.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/incDup/HelloTraceInterfaceDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/incDup/HelloTraceTypes.inl
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/incDup/HelloTraceTypesDup.h
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/src/HelloTraceExample.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/src/HelloTraceFn.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/src/HelloTraceInterface.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/src/HelloTracePanic.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/src/HelloTraceTypes.cpp
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/traces/hellotracedll_dll/trace.properties
tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/group/bld.inf
tracefw/tracecompiler/test/group/bld.inf
tracefw/tracecompiler/test/group/build.xml
tracefw/tracecompiler/test/group/ccbuild.xml
tracefw/tracecompiler/test/group/readme.txt
tracefw/tracecompiler/test/lib/junit-4.7.jar
tracefw/tracecompiler/test/multipleMmpTestCases/group/bld.inf
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/group/bld.inf
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/group/mmp_traces1.mmp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/group/mmp_traces2.mmp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/inc/MultipleMmpApp.h
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/src/ExtraCppFile1.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/src/ExtraCppFile2.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/src/MultipleMmpApp1.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/src/MultipleMmpApp2.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/group/bld.inf
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/group/mmp_traces_mixed1.mmp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/group/mmp_traces_mixed2.mmp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/inc/MultipleMmpApp.h
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/src/ExtraCppFile1.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/src/ExtraCppFile2.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/src/MultipleMmpApp1.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/src/MultipleMmpApp2.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/group/bld.inf
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/group/mmp_traces_mmpname1.mmp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/group/mmp_traces_mmpname2.mmp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/inc/MultipleMmpApp.h
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/src/ExtraCppFile1.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/src/ExtraCppFile2.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/src/MultipleMmpApp1.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/src/MultipleMmpApp2.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/group/bld.inf
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/group/mmp_traces_slash_target_ext1.mmp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/group/mmp_traces_slash_target_ext2.mmp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/inc/MultipleMmpApp.h
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/src/ExtraCppFile1.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/src/ExtraCppFile2.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/src/MultipleMmpApp1.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/src/MultipleMmpApp2.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext_commonsource/group/bld.inf
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext_commonsource/group/mmp_traces_slash_target_cs_ext1.mmp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext_commonsource/group/mmp_traces_slash_target_cs_ext2.mmp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext_commonsource/inc/MultipleMmpApp.h
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext_commonsource/src/ExtraCppFile1.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext_commonsource/src/MultipleMmpApp1.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/group/bld.inf
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/group/mmp_traces_target_type1.mmp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/group/mmp_traces_target_type2.mmp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/inc/MultipleMmpApp.h
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/src/ExtraCppFile1.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/src/ExtraCppFile2.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/src/MultipleMmpApp1.cpp
tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/src/MultipleMmpApp2.cpp
tracefw/tracecompiler/test/src/ErrorLogsTestBase.java
tracefw/tracecompiler/test/src/ErrorLogsTestSystem.java
tracefw/tracecompiler/test/src/ErrorLogsTestUnit.java
tracefw/tracecompiler/test/src/FixedIdDefinitionsTest.java
tracefw/tracecompiler/test/src/GroupNamesTest.java
tracefw/tracecompiler/test/src/MacroWrappersTest.java
tracefw/tracecompiler/test/src/MultipleMmpTest.java
tracefw/tracecompiler/test/src/ParseFunctionParametersTest.java
tracefw/tracecompiler/test/src/PluginTracePropertyVerifierTest.java
tracefw/tracecompiler/test/src/TraceHeadersLicenceTest.java
tracefw/tracecompiler/test/src/TraceLocationConverterTest.java
tracefw/tracecompiler/test/src/TracesInHeadersTest.java
tracefw/tracecompiler/test/testdata/test_opensystemtrace_types.h
tracefw/tracecompiler/tracecompiler/readme.txt
tracefw/tracecompiler/tracecompiler/release_note.txt
tracefw/tracecompiler/tracecompiler/tracecompiler.pl
tracefw/tracecompiler/tracecompiler/tracecompiler.pm
tracefw/tracecompiler/tracecompiler/tracecompiler.zip
tracefw/tracecompiler/tracecompiler/tracecompiler_mmp_data.pm
tracefw/tracecompiler/tracecompiler/tracecompiler_parse_mmp.pl
--- a/analyzetool/symbian_version.hrh	Thu Aug 19 11:25:43 2010 +0300
+++ b/analyzetool/symbian_version.hrh	Tue Aug 31 16:45:49 2010 +0300
@@ -37,7 +37,7 @@
  * used to variate the source code based on the SDK in use. The value of the
  * flag should be always changed to reflect the current build environment.
  */
-#define SYMBIAN_VERSION_SUPPORT                              SYMBIAN_3
+#define SYMBIAN_VERSION_SUPPORT                              SYMBIAN_4
 
 
 #endif  // __SYMBIAN_VERSION_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/build.config.xml	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,109 @@
+<?xml version="1.0"?>
+<!DOCTYPE SystemDefinition [
+ <!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
+  levels CDATA #IMPLIED  
+  span CDATA #IMPLIED
+  level CDATA #IMPLIED>
+ <!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>
+ <!ENTITY layer_real_source_path "sf/dev/devicedbgsrvs/dbgsrv/coredumpserver/rmdebug" >
+]>
+
+<SystemDefinition name="rmdebug" schema="1.4.0">
+  <systemModel>
+    <layer name="os_layer">
+      <module name="RunMode">
+		  <unit name="RunModeComp" unitID="RunMode.Comp" mrp="" bldFile="&layer_real_source_path;/group"/>
+      </module>
+    </layer>
+	<layer name="api_test_layer">
+      <module name="RunMode_test">
+         <unit name="RunModeComp_Test" unitID="RunMode.Comp_test" mrp="" bldFile="&layer_real_source_path;/group"/>
+      </module>
+    </layer>
+  </systemModel>
+</SystemDefinition>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,25 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Run mode component and test top level bld.inf
+// 
+//
+
+/**
+ @file
+*/
+
+#include "../rmdriver/group/bld.inf"
+
+
+#include "../rmdebug_test/group/bld.inf"
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/eabi/t_rmdebug_dllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	_Z9GetDSSUidv @ 1 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,22 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Kernel and User library test code
+// 
+//
+
+/**
+ @file
+*/
+
+#include "../rm_debug/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/group/e32test.bld	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,5 @@
+
+!EXPLICIT
+!INCREMENTAL
+
+e32test		e32test\group
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/group/mk_rmdbg_test.bat	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,18 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description: 
+@rem
+
+makesis rmdbg_test.pkg
+signsis rmdbg_test.sis rmdbg_test.sisx  RDTest_02.der RDTest_02.key
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/r_kernel_low_memory_security_svr_session.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+// 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 the License "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 RKernelLowMemorySecuritySvrSession
+// 
+//
+
+#include "r_kernel_low_memory_security_svr_session.h"
+
+void RKernelLowMemorySecuritySvrSession::FailAlloc(const TInt aCount)
+	{
+	__KHEAP_FAILNEXT(aCount);
+	}
+
+void RKernelLowMemorySecuritySvrSession::HeapReset()
+	{
+	__KHEAP_RESET;
+	}
+
+void RKernelLowMemorySecuritySvrSession::MarkHeap()
+	{
+	__KHEAP_MARK;
+	}
+
+void RKernelLowMemorySecuritySvrSession::MarkHeapEnd()
+	{
+	__KHEAP_MARKEND;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/r_kernel_low_memory_security_svr_session.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+// 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 the License "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:
+// Version of security server session to enable testing of low memory conditions on kernel side
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef R_KERNEL_LOW_MEMORY_SECURITY_SVR_SESSION_H
+#define R_KERNEL_LOW_MEMORY_SECURITY_SVR_SESSION_H
+
+#include "r_low_memory_security_svr_session.h"
+
+class RKernelLowMemorySecuritySvrSession : public RLowMemorySecuritySvrSession
+	{
+protected:
+	void FailAlloc(const TInt aCount);
+	void HeapReset();
+	void MarkHeap();
+	void MarkHeapEnd();
+	};
+
+#endif //R_KERNEL_LOW_MEMORY_SECURITY_SVR_SESSION_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/r_low_memory_security_svr_session.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,86 @@
+// 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 the License "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 RLowMemorySecuritySvrSession
+// 
+//
+
+#include "r_low_memory_security_svr_session.h"
+#include <e32debug.h>
+
+// test the effects of heap failure on global RSecuritySvrSession::GetList() in debug mode,
+// in release mode normal call is made (heap checking not applicable)
+TInt RLowMemorySecuritySvrSession::GetList(const Debug::TListId aListId, TDes8& aListData, TUint32& aDataSize)
+	{
+	TInt failAt = 0;
+	TInt err = KErrNoMemory;
+	while(err == KErrNoMemory)
+		{
+		failAt++;
+		FailAlloc(failAt);
+		MarkHeap();
+		err = this->RSecuritySvrSession::GetList(aListId, aListData, aDataSize);
+		if(KErrNoMemory == err)
+			{
+			MarkHeapEnd();
+			}
+		HeapReset();
+		//RDebug::Printf("Debug::RLowMemorySecuritySvrSession::GetList(): failAt: %d, err: %d", failAt, err);
+		}
+	return err;
+	}
+
+// test the effects of heap failure on thread-specific RSecuritySvrSession::GetList() in debug mode,
+// in release mode normal call is made (heap checking not applicable)
+TInt RLowMemorySecuritySvrSession::GetList(const TThreadId aThreadId, const Debug::TListId aListId, TDes8& aListData, TUint32& aDataSize)
+	{
+	TInt failAt = 0;
+	TInt err = KErrNoMemory;
+	while(err == KErrNoMemory)
+		{
+		failAt++;
+		FailAlloc(failAt);
+		MarkHeap();
+		err = this->RSecuritySvrSession::GetList(aThreadId, aListId, aListData, aDataSize);
+		if(KErrNoMemory == err)
+			{
+			MarkHeapEnd();
+			}
+		HeapReset();
+		//RDebug::Printf("Debug::RLowMemorySecuritySvrSession::GetList(TThreadId): failAt: %d, err: %d", failAt, err);
+		}
+	return err;
+	}
+
+// test the effects of heap failure on process-specific RSecuritySvrSession::GetList() in debug mode,
+// in release mode normal call is made (heap checking not applicable)
+TInt RLowMemorySecuritySvrSession::GetList(const TProcessId aProcessId, const Debug::TListId aListId, TDes8& aListData, TUint32& aDataSize)
+	{
+	TInt failAt = 0;
+	TInt err = KErrNoMemory;
+	while(err == KErrNoMemory)
+		{
+		failAt++;
+		FailAlloc(failAt);
+		MarkHeap();
+		err = this->RSecuritySvrSession::GetList(aProcessId, aListId, aListData, aDataSize);
+		if(KErrNoMemory == err)
+			{
+			MarkHeapEnd();
+			}
+		HeapReset();
+		//RDebug::Printf("Debug::RLowMemorySecuritySvrSession::GetList(TProcessId): failAt: %d, err: %d", failAt, err);
+		}
+	return err;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/r_low_memory_security_svr_session.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,43 @@
+// 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 the License "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:
+// Version of security server session to enable testing of low memory conditions
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef R_LOW_MEMORY_SECURITY_SVR_SESSION_H
+#define R_LOW_MEMORY_SECURITY_SVR_SESSION_H
+
+#include <rm_debug_api.h>
+
+class RLowMemorySecuritySvrSession : public Debug::RSecuritySvrSession
+	{
+public:
+	TInt GetList(const Debug::TListId aListId, TDes8& aListData, TUint32& aDataSize);
+	TInt GetList(const TThreadId aThreadId, const Debug::TListId aListId, TDes8& aListData, TUint32& aDataSize);
+	TInt GetList(const TProcessId aProcessId, const Debug::TListId aListId, TDes8& aListData, TUint32& aDataSize);
+protected:
+	virtual void FailAlloc(const TInt aCount) = 0;
+	virtual void HeapReset() = 0;
+	virtual void MarkHeap() = 0;
+	virtual void MarkHeapEnd() = 0;
+	};
+
+#endif //R_LOW_MEMORY_SECURITY_SVR_SESSION_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/r_user_low_memory_security_svr_session.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,54 @@
+// 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 the License "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:
+// r_kernel_low_memory_security_svr_session.cpp
+// Implementation of RUserLowMemorySecuritySvrSession
+// 
+//
+
+#include "r_user_low_memory_security_svr_session.h"
+#include <rm_debug_api.h>
+#ifdef _DEBUG
+#include "low_mem_requests.h"
+#endif
+
+void RUserLowMemorySecuritySvrSession::FailAlloc(const TInt aCount)
+	{
+#ifdef _DEBUG
+	TIpcArgs args(aCount);
+	SendReceive(EDebugServFailAlloc, args);
+#endif
+	}
+
+void RUserLowMemorySecuritySvrSession::HeapReset()
+	{
+#ifdef _DEBUG
+	TIpcArgs args(0);
+	SendReceive(EDebugServFailAlloc, args);
+#endif
+	}
+
+void RUserLowMemorySecuritySvrSession::MarkHeap()
+	{
+#ifdef _DEBUG
+	SendReceive(EDebugServMarkHeap);
+#endif
+	}
+
+void RUserLowMemorySecuritySvrSession::MarkHeapEnd()
+	{
+#ifdef _DEBUG
+	SendReceive(EDebugServMarkEnd);
+#endif
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/r_user_low_memory_security_svr_session.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+// 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 the License "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:
+// Version of security server session to enable testing of low memory conditions on user side
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef R_USER_LOW_MEMORY_SECURITY_SVR_SESSION_H
+#define R_USER_LOW_MEMORY_SECURITY_SVR_SESSION_H
+
+#include "r_low_memory_security_svr_session.h"
+
+class RUserLowMemorySecuritySvrSession : public RLowMemorySecuritySvrSession
+	{
+protected:
+	void FailAlloc(const TInt aCount);
+	void HeapReset();
+	void MarkHeap();
+	void MarkHeapEnd();
+	};
+
+#endif //R_USER_LOW_MEMORY_SECURITY_SVR_SESSION_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/t_rmdebug2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,4985 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Tests the functionality of the run mode debug device driver.
+//
+//
+
+#include <e32base.h>
+#include <e32base_private.h>
+#include <e32cons.h>
+#include <e32test.h>
+#include <e32ldr.h>
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include <f32dbg.h>
+#include <f32file.h>
+#include <hal.h>
+#include <u32hal.h>
+#include <e32property.h>
+
+#include "t_rmdebug_dll.h"
+
+#include <rm_debug_api.h>
+#include "d_rmdebugthread2.h"
+#include "t_rmdebug2.h"
+#include "t_rmdebug_app.h"
+
+#ifdef __MARM_ARMV4__
+#include "d_rmdebug_step_test_armv4.h"
+#endif
+
+#ifdef __MARM_ARMV5__
+#include "d_rmdebug_step_test.h"
+#include "d_rmdebug_bkpt_test.h"
+#endif
+
+#include "d_demand_paging.h"
+
+#ifdef KERNEL_OOM_TESTING
+	#ifdef USER_OOM_TESTING
+		#error "Cannot define both KERNEL_OOM_TESTING and USER_OOM_TESTING"
+	#endif
+#endif
+
+#if  defined (NO_DEBUGTOKEN)  || defined (SOMECAPS_DEBUGTOKEN) || defined (FEWCAPS_DEBUGTOKEN)
+_LIT8(KCrashDummyData, "This is a sample write");
+#endif
+
+using namespace Debug;
+
+const TVersion securityServerVersion(0,1,1);
+
+const TVersion testVersion(2,1,0);
+
+IMPORT_C TInt StartDebugThread(RThread& aServerThread, const TDesC& aDebugThreadName);
+ 
+extern TInt TestData;
+extern TTestFunction FunctionChooser;
+extern TBuf8<SYMBIAN_RMDBG_MEMORYSIZE> gMemoryAccessBytes;
+
+IMPORT_C TInt TestFunction();
+IMPORT_C void TestPagedCode();
+IMPORT_C extern TInt RMDebugDemandPagingTest();
+
+// Device driver name
+_LIT(KDebugDriverFileName,"rm_debug.ldd");
+_LIT(KRMDebugAppName, "t_rmdebug_app");
+
+
+#if defined(NO_DEBUGTOKEN)
+    _LIT(KTestName, "T_RMDEBUG2");
+#elif defined(SOMECAPS_DEBUGTOKEN)
+    _LIT(KTestName, "T_RMDEBUG2_OEM");
+#elif defined(FEWCAPS_DEBUGTOKEN)
+    _LIT(KTestName, "T_RMDEBUG2_OEM2");
+#elif defined(ALLCAPS_DEBUGTOKEN)
+    _LIT(KTestName, "T_RMDEBUG2_ALLCAPS");
+#endif
+
+#define TIMED_WAIT(request, timeoutInMs) CRunModeAgent::TimedWait(request, timeoutInMs, __LINE__)
+
+LOCAL_D RTest test(KTestName);
+
+TBool gUseDelay;
+
+CRunModeAgent::CRunModeAgent()
+//
+// CRunModeAgent constructor
+//
+	{
+	FillArray();
+	RProcess thisProcess;
+	iFileName = thisProcess.FileName();
+	thisProcess.Close();
+	}
+
+CRunModeAgent* CRunModeAgent::NewL()
+//
+// CRunModeAgent::NewL
+//
+	{
+	CRunModeAgent* self = new(ELeave) CRunModeAgent();
+
+  	self->ConstructL();
+
+	return self;
+	}
+
+CRunModeAgent::~CRunModeAgent()
+//
+// CRunModeAgent destructor
+//
+	{
+    iTimer.Close();
+    iRunCountSubscribe.Close();
+    
+	User::FreeLogicalDevice(KDebugDriverFileName);
+	iServSession.Close();
+	iDebugThread.Close();
+	}
+
+void CRunModeAgent::ConstructL()
+//
+// CRunModeAgent::ConstructL
+//
+	{
+	// nothing to do here
+	}
+
+void CRunModeAgent::SetupAndAttachToDSS()
+//
+// CRunModeAgent::SetupAndAttachToDSS
+//
+	{
+	TInt err = StartDebugThread(iDebugThread, KDebugThreadName);
+
+	// get the thread id for use in the tests
+	iThreadID = iDebugThread.Id();
+
+	if (err != KErrNone)
+		{
+		User::Panic(_L("Can't start debug thread"), err);
+		}
+
+    err = iRunCountSubscribe.Attach( RProcess().SecureId(), CDebugServThread::ERMDBGRunCountProperty);
+    if (err != KErrNone)
+        {
+        User::Panic(_L("Can't attach to RProperty iRunCountSubscribe"), err);
+        }
+
+    err = iTimer.CreateLocal(); 
+    if (err != KErrNone)
+        {
+        User::Panic(_L("Can't create RTimer::CreateLocal()"), err);
+        }
+    
+	err = iServSession.Connect(securityServerVersion);
+	if (err != KErrNone)
+		{
+		User::Panic(_L("Can't open server session"), err);
+		}
+	}
+
+CRunModeAgent *RunModeAgent;
+
+// helper function to check whether the listing of type aListId is supported for a scope of aListScope
+TBool CRunModeAgent::ListingSupported(const TListId aListId, const TListScope aListScope)
+	{
+	TTag tag = GetTag(ETagHeaderList, aListId);
+
+	return (tag.iValue) & aListScope;
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0426
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test getting the list of XIP libraries
+//! @SYMTestActions The XIP library list should be successfully obtained
+//! @SYMTestExpectedResults The specified ldd file should be present in the obtained listing
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestGetXipLibrariesList()
+	{
+	test.Next(_L("TestGetXipLibrariesList\n"));
+
+	test(ListingSupported(EXipLibraries, EScopeGlobal));
+	test(!ListingSupported(EXipLibraries, EScopeProcessSpecific));
+	test(!ListingSupported(EXipLibraries, EScopeThreadSpecific));
+
+	//allocate a very small buffer so the GetList call initially fails
+	RBuf8 buffer;
+	test(KErrNone == buffer.Create(1));
+	TUint32 size = 0;
+
+	//get the list data
+	DoGetList(EXipLibraries, EScopeGlobal, buffer, size);
+
+	//search the buffer for entry corresponding to the debug kernel driver
+	//which should be in the rom
+	_LIT(KRmDebugLddName, "z:\\sys\\bin\\rm_debug.ldd");
+
+	//iterate through the buffer and set found to ETrue if we find the driver
+	TBool found = EFalse;
+	TUint8* ptr = (TUint8*)buffer.Ptr();
+	const TUint8* ptrEnd = ptr + size;
+	while(ptr < ptrEnd)
+		{
+		TXipLibraryListEntry& xipLibrary = *(TXipLibraryListEntry*)ptr;
+
+		//get the name of the library
+		TPtr name(&xipLibrary.iName[0], xipLibrary.iNameLength, xipLibrary.iNameLength);
+		if(name.CompareF(KRmDebugLddName()) == 0)
+			{
+			//found the library but continue reading the rest of the buffer to
+			//check nothing bad happens towards the end
+			found = ETrue;
+			}
+		//move pointer on to next library
+		ptr += Align4(xipLibrary.GetSize());
+		}
+	test(found);
+
+	//do cleanup
+	buffer.Close();
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0427
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test getting the list of executables
+//! @SYMTestActions The list of debuggable executable files should be obtained
+//! @SYMTestExpectedResults The client exe should appear in the list
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestGetExecutablesList()
+	{
+	test.Next(_L("TestGetExecutablesList\n"));
+
+	test(ListingSupported(EExecutables, EScopeGlobal));
+	test(!ListingSupported(EExecutables, EScopeProcessSpecific));
+	test(!ListingSupported(EExecutables, EScopeThreadSpecific));
+
+	//allocate a very small buffer so the GetList call initially fails
+	RBuf8 buffer;
+	test(KErrNone == buffer.Create(1));
+	TUint32 size = 0;
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+
+	//get the list data
+	DoGetList(EExecutables, EScopeGlobal, buffer, size);
+
+	//get this process' name
+	RProcess thisProcess;
+	TFileName thisProcessName = thisProcess.FileName();
+
+	//look through the buffer and check if the target debug thread is there
+	TBool found = EFalse;
+	TUint8* ptr = (TUint8*)buffer.Ptr();
+	const TUint8* ptrEnd = ptr + size;
+	while(ptr < ptrEnd)
+		{
+		TExecutablesListEntry& entry = *(TExecutablesListEntry*)ptr;
+		//get name
+		TPtr name(&entry.iName[0], entry.iNameLength, entry.iNameLength);
+		if( (entry.iIsActivelyDebugged != 0) && (0 == thisProcessName.CompareF(name)) )
+			{
+			//found this process and asserted it is being actively debugged
+			found = ETrue;
+			}
+		//move pointer on to next entry
+		ptr += Align4(entry.GetSize());
+		}
+	test(found);
+
+	//clean up
+	buffer.Close();
+
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0428
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test error conditions for the GetList calls
+//! @SYMTestActions Multiple calls to test calling GetList with bad arguments
+//! @SYMTestExpectedResults All tests should fail with the appropriate error codes
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestGetListInvalidData()
+	{
+	test.Next(_L("TestGetListInvalidData\n"));
+
+	//allocate a buffer, the size should not matter as expecting all calls to fail
+	RBuf8 buffer;
+	test(KErrNone == buffer.Create(1));
+	TUint32 size = 0;
+
+	//test what happens if we ask for an unsupported list type globally
+	test(KErrNotSupported == iServSession.GetList((TListId)1234, buffer, size));
+
+	//test what happens if we ask for an unsupported list type
+	test(KErrNotSupported == iServSession.GetList(RThread().Id(), (TListId)1234, buffer, size));
+
+	//test what happens if we try to get a non-global libraries list
+	test(KErrArgument == iServSession.GetList(RThread().Id(), EXipLibraries, buffer, size));
+
+	//test what happens if we try to get a non-global executables list
+	test(KErrArgument == iServSession.GetList(RThread().Id(), EExecutables, buffer, size));
+
+	//test what happens if we try to get a non-global process list
+	test(KErrArgument == iServSession.GetList(RThread().Id(), EProcesses, buffer, size));
+
+	//check that using a process id fails
+	test(KErrArgument == iServSession.GetList(RProcess().Id(), EProcesses, buffer, size));
+
+	//check that specifying a non-existant thread id fails
+	test(KErrArgument == iServSession.GetList((TThreadId)0x12345678, EThreads, buffer, size));
+
+	//check that specifying a non-existant process id fails
+	test(KErrArgument == iServSession.GetList((TProcessId)0x12345678, EThreads, buffer, size));
+
+	//check that specifying a non-existant thread id fails
+	test(KErrArgument == iServSession.GetList((TThreadId)0x12345678, ECodeSegs, buffer, size));
+
+	//check that specifying a non-existant process id fails
+	test(KErrArgument == iServSession.GetList((TProcessId)0x12345678, ECodeSegs, buffer, size));
+
+	//cleanup
+	buffer.Close();
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0429
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test getting the process list
+//! @SYMTestActions Get the process listing
+//! @SYMTestExpectedResults The process listing should be successfully obtained and the current process should be present in the list
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestGetProcessList()
+	{
+	test.Next(_L("TestGetProcessList\n"));
+
+	test(ListingSupported(EProcesses, EScopeGlobal));
+	test(!ListingSupported(EProcesses, EScopeProcessSpecific));
+	test(!ListingSupported(EProcesses, EScopeThreadSpecific));
+
+	//allocate a very small buffer so the GetList call fails
+	RBuf8 buffer;
+	test(KErrNone == buffer.Create(1));
+	TUint32 size = 0;
+
+	//get the list data
+	DoGetList(EProcesses, EScopeGlobal, buffer, size);
+
+	//initialise data about the target debug thread to compare the kernel's data against
+	RProcess thisProcess;
+	TFileName thisProcessName = thisProcess.FileName();
+	TUint32 processId = thisProcess.Id().Id();
+
+	//look through the buffer and check if the target debug thread is there
+	TBool found = EFalse;
+	TUint8* ptr = (TUint8*)buffer.Ptr();
+	const TUint8* ptrEnd = ptr + size;
+	while(ptr < ptrEnd)
+		{
+		TProcessListEntry& entry = *(TProcessListEntry*)ptr;
+		if( (RProcess().Id().Id() == entry.iProcessId) &&
+			(0 == thisProcessName.CompareF(TPtr(&(entry.iNames[0]), entry.iFileNameLength, entry.iFileNameLength))) &&
+		 	(0 == thisProcess.FullName().CompareF(TPtr(&(entry.iNames[0]) + entry.iFileNameLength, entry.iDynamicNameLength, entry.iDynamicNameLength))) &&
+			0x4321bbbb /* Magic */ == entry.iUid3)
+			{
+			//if all match then we've found it
+			found = ETrue;
+			}
+		ptr += Align4(entry.GetSize());
+		}
+
+	//check whether the expected result happened
+	test(found);
+
+	//clean up
+	buffer.Close();
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0430
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test getting the thread list
+//! @SYMTestActions Get the thread listing globally and for a specified thread or process
+//! @SYMTestExpectedResults The thread listings should all be successfully obtained and the current thread should be present in all listings
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestGetThreadList()
+	{
+	test.Next(_L("TestGetThreadList\n"));
+
+	test(ListingSupported(EThreads, EScopeGlobal));
+	test(ListingSupported(EThreads, EScopeProcessSpecific));
+	test(ListingSupported(EThreads, EScopeThreadSpecific));
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+	test(KErrNone == iServSession.SuspendThread(iThreadID));
+
+	TBool found = EFalse;
+	
+	/* We need these loops because on some system the kernel run mode debugger does not 
+	 immediately present the thread in the thread list. 
+	 */
+	
+	for(TInt retryCount = 0; retryCount < 10 && !found; retryCount++ )
+		{
+		//test getting this process's thread list, ETrue as should find the target debug thread
+		User::After(50000);
+		found = DoTestGetThreadList(ETrue, EScopeProcessSpecific, RProcess().Id().Id());
+		}
+	test( found );
+	found = EFalse;
+
+	for(TInt retryCount = 0; retryCount < 10 && !found; retryCount++ )
+		{
+		//test getting the global list, ETrue as should find the target debug thread
+		User::After(50000);
+		found = DoTestGetThreadList(ETrue, EScopeGlobal);
+		}
+	test( found );
+
+	found = EFalse;
+	for(TInt retryCount = 0; retryCount < 10 && !found; retryCount++ )
+		{
+		//test getting this thread's thread list, ETrue as should find the target debug thread
+		User::After(50000);
+		found = DoTestGetThreadList(ETrue, EScopeThreadSpecific, RThread().Id().Id());
+		}
+	test( found );
+
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+			
+TBool CRunModeAgent::DoTestGetThreadList(const TBool aShouldPass, const TListScope aListScope, const TUint64 aTargetId)
+	{
+	//create data to pass
+	RBuf8 buffer;
+	TUint32 size = 0;
+
+	//perform the call to get the thread list
+	DoGetList(EThreads, aListScope, buffer, size, aTargetId);
+
+	//initialise data about the target debug thread to compare the kernel's data against
+	TFileName name = iDebugThread.FullName();
+	RProcess thisProcess;
+	TUint64 processId = thisProcess.Id();
+	TUint64 threadId = iDebugThread.Id();
+
+	//look through the buffer and check if the target debug thread is there
+	TBool found = EFalse;
+	TUint8* ptr = (TUint8*)buffer.Ptr();
+	const TUint8* ptrEnd = ptr + size;
+	while(ptr < ptrEnd)
+		{
+		TThreadListEntry* entry = (TThreadListEntry*)ptr;
+		TPtr entryName(&(entry->iName[0]), entry->iNameLength, entry->iNameLength);
+
+		if( (threadId == entry->iThreadId) && (processId == entry->iProcessId) && (0 == name.CompareF(entryName)) )
+			{
+			test(entry->iSupervisorStackBaseValid);
+			test(entry->iSupervisorStackSizeValid);
+			//if all match then we've found it
+			found = ETrue;
+			break;
+			}
+
+		ptr += Align4(entry->GetSize());
+		}
+
+	//clean up
+	buffer.Close();
+	return found;
+
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0431
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test getting the code segment list
+//! @SYMTestActions Get the code segment list global and for a specified thread
+//! @SYMTestExpectedResults The listings should be returned successfully
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestGetCodeSegsList()
+	{
+	test.Next(_L("TestGetCodeSegsList\n"));
+
+	test(ListingSupported(ECodeSegs, EScopeGlobal));
+	test(ListingSupported(ECodeSegs, EScopeProcessSpecific));
+	test(ListingSupported(ECodeSegs, EScopeThreadSpecific));
+
+	// Cannot perform this test with OEM2 debug token, as the t_rmdebug2 app
+	// needs AllFiles, and the OEM2 debug token does not authorise this.
+	// It seems reasonable to suppose that it would work anyway
+
+#ifndef FEWCAPS_DEBUGTOKEN
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+
+ 	//test getting the global list, ETrue as should find this process' main codeSeg
+	DoTestGetCodeSegsList(ETrue, EScopeGlobal);
+
+	//test getting this process' codeSegs, ETrue as should find this process' main codeSeg
+	DoTestGetCodeSegsList(ETrue, EScopeProcessSpecific, RProcess().Id().Id());
+
+	//test getting this thread's codeSegs, ETrue as should find this process' main codeSeg
+	DoTestGetCodeSegsList(ETrue, EScopeThreadSpecific, RThread().Id().Id());
+
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+#endif // FEWCAPS_DEBUGTOKEN
+
+	}
+
+void CRunModeAgent::DoTestGetCodeSegsList(const TBool aShouldPass, const TListScope aListScope, const TUint64 aTargetId)
+	{
+	//create data to pass
+	RBuf8 buffer;
+	TUint32 size = 0;
+
+	//perform the call to get the Code segs
+	DoGetList(ECodeSegs, aListScope, buffer, size, aTargetId);
+
+	//create memoryInfo to contain info about this process
+	RProcess thisProcess;
+	TModuleMemoryInfo memoryInfo;
+	test(KErrNone == thisProcess.GetMemoryInfo(memoryInfo));
+
+	// check whether this process came from a file in ROM so we know whether to
+	// expect the code seg to be XIP or not.
+	RFs fs;
+	test(KErrNone == fs.Connect());
+	TBool thisFileIsInRom = EFalse;
+	if(fs.IsFileInRom(iFileName))
+		{
+		thisFileIsInRom = ETrue;
+		}
+
+	//look through the buffer to find this process' main code seg
+	TBool found = EFalse;
+	TUint8* ptr = (TUint8*)buffer.Ptr();
+	const TUint8* ptrEnd = ptr + size;
+	while(ptr < ptrEnd)
+		{
+		TCodeSegListEntry* codeSeg = (TCodeSegListEntry*)ptr;
+
+		if( (codeSeg->iIsXip == thisFileIsInRom) && (0 == iFileName.CompareF(TPtr(&(codeSeg->iName[0]), codeSeg->iNameLength, codeSeg->iNameLength))) )
+			{
+			if( (memoryInfo.iCodeBase == codeSeg->iCodeBase) &&
+					(memoryInfo.iCodeSize == codeSeg->iCodeSize) &&
+					(memoryInfo.iConstDataSize == codeSeg->iConstDataSize) &&
+					(memoryInfo.iInitialisedDataBase == codeSeg->iInitialisedDataBase) &&
+					(memoryInfo.iInitialisedDataSize == codeSeg->iInitialisedDataSize) &&
+					(memoryInfo.iUninitialisedDataSize == codeSeg->iUninitialisedDataSize))
+				{
+				//all matched so means we've found the codeSeg we're looking for
+				found = ETrue;
+				}
+			}
+		ptr += Align4(codeSeg->GetSize());
+		}
+
+	//check whether the result was as expected
+	test(found == aShouldPass);
+
+	// only care about rm_debug.ldd if we have global scope (belongs to the system not this process)
+	if (aListScope == EScopeGlobal)
+	{
+		// Search for rm_debug.ldd library and check its UID3 is correct
+		found = EFalse;
+
+_LIT(KRMDebugDriverFileName,"Z:\\sys\bin\\rm_debug.ldd");
+
+		TFileName rmdebugFilename(KRMDebugDriverFileName);
+
+		// reset the Ptr
+		ptr = (TUint8*)buffer.Ptr();
+		ptrEnd = ptr+size;
+		while(ptr < ptrEnd)
+		{
+			TCodeSegListEntry* codeSeg = (TCodeSegListEntry*)ptr;
+
+			if( rmdebugFilename.CompareF(TPtr(&(codeSeg->iName[0]), codeSeg->iNameLength, codeSeg->iNameLength)))
+				{
+				if(codeSeg->iUid3 == 0x101f7157 /* Magic */)
+					{
+					//all matched so means we've found the codeSeg we're looking for
+					found = ETrue;
+					}
+				}
+			ptr += Align4(codeSeg->GetSize());
+		}
+		test((TUint32)found == (TUint32)ETrue);
+	}
+
+	//clean up
+	buffer.Close();
+
+	}
+
+
+/**
+ * Get a list from the run mode debug system. Most list calls will initially return KErrTooBig, 
+ * since the initial size of the buffer is 0. However it is sometimes valid for a list to be empty
+ * given its filtering and scope. These calls should return KErrNone.
+ */
+void CRunModeAgent::DoGetList(const TListId aListId, const TListScope aListScope, RBuf8& aBuffer, TUint32& aSize, const TUint64 aTargetId)
+	{
+	//close the buffer in case there's stuff allocated in it
+	aBuffer.Close();
+	//initialise it to be one byte big, which will guarantee data won't fit in it
+	test(KErrNone == aBuffer.Create(1));
+	aSize = 0;
+	
+	TInt ret = KErrNone;
+	//should pass this test (assuming we've passed in sensible arguments above...)
+	if(EScopeGlobal == aListScope)
+		{
+		ret = iServSession.GetList(aListId, aBuffer, aSize);
+		}
+	else if(EScopeThreadSpecific == aListScope)
+		{
+		ret = iServSession.GetList((TThreadId)aTargetId, aListId, aBuffer, aSize);
+		}
+	else if(EScopeProcessSpecific == aListScope)
+		{
+		ret = iServSession.GetList((TProcessId)aTargetId, aListId, aBuffer, aSize);
+		}
+	else
+		{
+		// unknown list scope
+		test(0);
+		}
+
+	if( KErrNone == ret )
+		{
+		/* In the case that there is no data, just return and let the caller check
+		the buffer. It is valid for a caller to not expect any data to be returned.
+		*/
+		return;
+		}
+	
+	// The only other allowed return is KErrTooBig
+	test( ret == KErrTooBig );
+
+	//keep allocating larger buffers, beginning with the aSize returned by the above call,
+	//and hopefully we'll eventually make a large enough one
+	test(KErrNone == aBuffer.ReAlloc(aSize));
+
+	for(;;)
+		{
+		TInt err = KErrNone;
+		if(EScopeGlobal == aListScope)
+			{
+			err = iServSession.GetList(aListId, aBuffer, aSize);
+			}
+		else if(EScopeThreadSpecific == aListScope)
+			{
+			err = iServSession.GetList((TThreadId)aTargetId, aListId, aBuffer, aSize);
+			}
+		else if(EScopeProcessSpecific == aListScope)
+			{
+			err = iServSession.GetList((TProcessId)aTargetId, aListId, aBuffer, aSize);
+			}
+		else
+			{
+			// unknown list scope
+			test(0);
+			}
+		if(err == KErrTooBig)
+			{
+			//wasn't big enough so double it
+			aSize = aSize << 1;
+			err = aBuffer.ReAlloc(aSize);
+			if(err != KErrNone)
+				{
+				//print out a message if couldn't allocate memory and quit
+				test.Printf(_L("Out ot memory when attempting to allocate %d bytes."), aSize);
+				test(KErrNone == err);
+				}
+
+			RDebug::Printf(" List size =%d", aSize );
+			}
+		else
+			{
+			test(KErrNone == err);
+			test(aBuffer.Length() == aSize);
+			//break out of the loop if the list has been successfully read in
+			break;
+			}
+		}
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0432
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test reading and writing memory
+//! @SYMTestActions Multiple calls to read and write memory, with various sizes and at various locations.
+//!	Also test that bad input values cause appropriate errors to be returned.
+//! @SYMTestExpectedResults All tests should pass and the target process should be left unaffected
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestMemoryAccess()
+{
+	TInt err;
+
+	test.Next(_L("TestMemoryAccess - Read Memory\n"));
+
+	//initialise buffer
+	gMemoryAccessBytes.SetLength(0);
+	for (TInt i=0; i<SYMBIAN_RMDBG_MEMORYSIZE; i++)
+		{
+		gMemoryAccessBytes.Append(i);
+		}
+
+	TUint32 address = (TUint32)(&gMemoryAccessBytes[0]);
+	TUint32 dataSize = SYMBIAN_RMDBG_MEMORYSIZE;
+
+	//create size for buffer that is rounded up to nearest 4 bytes if not
+	//already 4 byte aligned
+	TUint32 size = dataSize;
+	if(size % 4 != 0)
+		{
+		size += (4 - (size % 4));
+		}
+
+	RBuf8 dataBlock;
+	err = dataBlock.Create(size);
+	test(err==KErrNone);
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+
+	//suspend the thread prior to memory operations
+	test(KErrNone == iServSession.SuspendThread(iThreadID));
+
+	err = iServSession.ReadMemory(iThreadID, address, size, dataBlock, EAccess32, EEndLE8);
+	test(err==KErrNone);
+
+	for (TInt i=0; i<dataSize; i++)
+		{
+		test(dataBlock.Ptr()[i] == gMemoryAccessBytes[i]);
+		}
+
+	test.Next(_L("TestMemoryAccess - Write Memory\n"));
+
+	// Now reset the buffer
+	for (TInt i=0; i<dataSize; i++)
+		{
+		gMemoryAccessBytes[i] = 0;
+		}
+
+	// Write our data into the buffer
+	err = iServSession.WriteMemory(iThreadID, address, size, dataBlock, EAccess32, EEndLE8);
+	test(err==KErrNone);
+
+	for (TInt i=0; i<dataSize; i++)
+		{
+		test(dataBlock.Ptr()[i] == gMemoryAccessBytes[i]);
+		}
+
+	//final test that everything's not been going wrong
+	test(gMemoryAccessBytes[5] != 0);
+
+	test.Next(_L("TestMemoryAccess - Invalid arguments\n"));
+	test.Printf(_L("This test may emit crash-like information. This is intended.\n"));
+
+	//test address that is not 32 bit aligned
+	err = iServSession.ReadMemory(iThreadID, address + 1, size, dataBlock, EAccess32, EEndLE8);
+	test(err == KErrArgument);
+
+	//test size that is not multiple of 4 bytes
+	err = iServSession.WriteMemory(iThreadID, address, size + 2, dataBlock, EAccess32, EEndLE8);
+	test(err == KErrArgument);
+
+	//test size > max block size
+	err = iServSession.ReadMemory(iThreadID, address, (1<<15), dataBlock, EAccess32, EEndLE8);
+	test(err == KErrArgument);
+
+	//test access size == 2 bytes
+	err = iServSession.ReadMemory(iThreadID, address, size, dataBlock, EAccess16, EEndLE8);
+	test(err == KErrNotSupported);
+
+	//test access size == 1 byte
+	err = iServSession.WriteMemory(iThreadID, address, size, dataBlock, EAccess8, EEndLE8);
+	test(err == KErrNotSupported);
+
+	//test endianess == EEndBE8
+	err = iServSession.ReadMemory(iThreadID, address, size, dataBlock, EAccess32, EEndBE8);
+	test(err == KErrNotSupported);
+
+	//test endianess == EEndBE32
+	err = iServSession.WriteMemory(iThreadID, address, size, dataBlock, EAccess32, EEndBE32);
+	test(err == KErrNotSupported);
+
+	//test reading off end of memory
+	err = iServSession.ReadMemory(iThreadID, 0xffffff00, 0x00000101, dataBlock, EAccess32, EEndLE8);
+	test(err == KErrArgument);
+
+	//The following three tests check that edge conditions in the range check are handled correctly.
+	err = iServSession.ReadMemory(iThreadID, 0xffffff00, 0x000000FF, dataBlock, EAccess32, EEndLE8);
+	test(err == KErrArgument);
+
+	err = iServSession.ReadMemory(iThreadID, 0xffffff00, 0x000000F0, dataBlock, EAccess32, EEndLE8);
+	test(err == KErrBadDescriptor);
+
+	//Third range check test. Check that range check is handled correctly even when base + size wraps to 0.
+	err = iServSession.ReadMemory(iThreadID, 0xffffff00, 0x00000100, dataBlock, EAccess32, EEndLE8);
+	test(err == KErrBadDescriptor);
+	//end of range check tests
+
+	//test size == 0
+	err = iServSession.WriteMemory(iThreadID, address, 0, dataBlock, EAccess32, EEndLE8);
+	test(err == KErrArgument);
+
+	//attempt to write to address outside of process data segments,
+	//this address corresponds to the vectors so shouldn't be able to write
+	err = iServSession.WriteMemory(iThreadID, 0xffff0000, size, dataBlock, EAccess32, EEndLE8);
+	test(err == KErrBadDescriptor);
+
+	//attempt to read and write to address in process code segment
+
+	//open a handle to the thread
+	RThread debugThread;
+	test(debugThread.Open(iThreadID) == KErrNone);
+
+	//get a reference to the debug process
+	RProcess debugProcess;
+	test(debugThread.Process(debugProcess) == KErrNone);
+
+	//get the memory info for the process
+	TProcessMemoryInfo info;
+	test(debugProcess.GetMemoryInfo(info) == KErrNone);
+
+	address = info.iCodeBase;
+	if(size <= info.iCodeSize)
+		{
+		test(KErrNone == iServSession.ReadMemory(iThreadID, address, size, dataBlock, EAccess32, EEndLE8));
+		test(KErrBadDescriptor == iServSession.WriteMemory(iThreadID, address, size, dataBlock, EAccess32, EEndLE8));
+		}
+
+	// Some performance tests now
+	TUint32 bytesRead = 0;
+
+	// Allocate a data buffer
+	TUint32* p = (TUint32*)User::Alloc(size);
+	test(p != 0);
+
+	TInt nanokernel_tick_period;
+	HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period);
+	test (nanokernel_tick_period != 0);
+
+	static const TInt KOneMillion = 1000000;
+
+	TInt nkTicksPerSecond = KOneMillion/nanokernel_tick_period;
+
+	TUint32 stopTickCount = User::NTickCount() + nkTicksPerSecond;
+
+	while (User::NTickCount() < stopTickCount)
+		{
+		err = iServSession.ReadMemory(iThreadID, (TUint32)p, size, dataBlock, EAccess32, EEndLE8);
+		test(err==KErrNone);
+
+		// Increase the count of bytes read
+		bytesRead += size;
+		}
+
+	test(bytesRead != 0);
+	iMemoryReadKbytesPerSecond = bytesRead/1024;
+
+	// write memory test
+	TUint32 bytesWritten = 0;
+
+	stopTickCount = User::NTickCount() + nkTicksPerSecond;
+
+	while (User::NTickCount() < stopTickCount)
+		{
+		err = iServSession.WriteMemory(iThreadID, (TUint32)p, size, dataBlock, EAccess32, EEndLE8);
+		test(err==KErrNone);
+
+		// Increase the count of bytes read
+		bytesWritten += size;
+		}
+
+	test (bytesWritten != 0);
+	iMemoryWriteKbytesPerSecond = bytesWritten/1024;
+
+	User::Free(p);
+
+	//resume the thread
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+
+	debugThread.Close();
+	dataBlock.Close();
+
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0433
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test suspending and resuming threads
+//! @SYMTestActions Multiple calls to suspend and resume threads with and without attaching to the thread
+//! @SYMTestExpectedResults All tests should pass and the target process should be left unaffected
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestSuspendResume()
+	{
+	TInt err;
+
+	test.Next(_L("TestSuspendResume - Suspend\n"));
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+
+	err = iServSession.SuspendThread(iThreadID);
+	test(err==KErrNone);
+	err = TestRunCountSame( iRunCountSubscribe, iTimer );
+	test( KErrNone == err );
+	
+	// Resume the thread
+	test.Next(_L("TestSuspendResume - Resume\n"));
+	err = iServSession.ResumeThread(iThreadID);
+	test(err==KErrNone);
+
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+
+	err = WaitForRunCountChange( iRunCountSubscribe, iTimer );
+	test(KErrNone == err );
+	
+	// check that agent can resume thread which it previously detached from
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+	test(KErrNone == iServSession.SuspendThread(iThreadID));
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+	err = TestRunCountSame( iRunCountSubscribe, iTimer );
+	test( KErrNone == err );
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+
+	err = WaitForRunCountChange( iRunCountSubscribe, iTimer );
+	test( KErrNone == err );
+	
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+	test(KErrNone == iServSession.SuspendThread(iThreadID));
+	err = TestRunCountSame( iRunCountSubscribe, iTimer );
+	test( KErrNone == err );
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	err = TestRunCountSame( iRunCountSubscribe, iTimer );
+	test( KErrNone == err );
+	    
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+	err = TestRunCountSame( iRunCountSubscribe, iTimer );
+	test( KErrNone == err );
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	
+	err = WaitForRunCountChange( iRunCountSubscribe, iTimer );
+    test( KErrNone == err );
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0434
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test getting the debug functionality from the driver
+//! @SYMTestActions Get the size and contents of the debug functionality block
+//! @SYMTestExpectedResults All tests should pass and the expected data should appear in the functionality block
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestDebugFunctionality()
+	{
+
+	TInt err;
+
+	test.Next(_L("TestDebugFunctionality - GetDebugFunctionalityBufSize\n"));
+
+	TUint32 bufsize = 0;	// Safe default size
+
+	// Get functionality block size
+	err = iServSession.GetDebugFunctionalityBufSize(&bufsize);
+	test(err==KErrNone);
+	test.Next(_L("TestDebugFunctionality - GetDebugFunctionality\n"));
+
+	// Ensure we have a finite buffer size
+	test(bufsize!=0);
+
+	// Allocate space for the functionality data
+	HBufC8* dftext = HBufC8::NewLC(bufsize);
+
+	// create an empty TPtr8 refering to dftext
+	TPtr8 dftextPtr(dftext->Des());
+
+	// Get the functionality block
+	err = iServSession.GetDebugFunctionality(dftextPtr);
+	test(err==KErrNone);
+
+	// Check that the first entry is correct
+	TTagHeader RefHdr =
+	{
+		ETagHeaderIdCore,ECoreLast,
+	};
+
+	// First header passed from rm_debug.ldd
+	TTagHeader* TestHdr = (TTagHeader*)dftextPtr.Ptr();
+
+	// Check
+	test(RefHdr.iTagHdrId==TestHdr->iTagHdrId);
+	// this test might fail if the agent is used with a Debug Security Server different from
+	// the one it was compiled against. So removing it for now.
+	//test(RefHdr.iNumTags==TestHdr->iNumTags);
+
+	// read a value from the data to check it has come through as expected
+	TTagHeader* header = GetTagHdr(dftext->Des(), ETagHeaderIdApiConstants);
+	test(header != NULL);
+	TTag* tag = GetTag(header, EApiConstantsTEventInfoSize);
+	test(tag != NULL);
+	// this test might fail if the agent is used with a Debug Security Server different from
+	// the one it was compiled against. So removing it for now.
+	//test(sizeof(TEventInfo) == tag->iValue);
+
+	// Remove our temporary buffer
+	CleanupStack::PopAndDestroy(dftext);
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0435
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test setting and clearing consecutive breakpoints
+//! @SYMTestActions Set and clear consecutive breakpoints of all combinations of breakpoint types
+//! @SYMTestExpectedResults All breakpoints should be set and cleared without error
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestConsecutiveBreakPoints()
+	{
+	test.Next(_L("TestConsecutiveBreakPoints\n"));
+
+	test(KErrNone == iServSession.SuspendThread(iThreadID));
+
+	// just a temporary structure for storing info about a breakpoint
+	struct TBreakPoint
+		{
+	public:
+		TBreakPoint()
+			:iId(0),
+			iMode((TArchitectureMode)0),
+			iAddress(0)
+			{}
+		TBreakId iId;
+		TArchitectureMode iMode;
+		TUint32 iAddress;
+		inline TInt Size() { return (EArmMode == iMode) ? 4 : 2; }
+		};
+
+	//an address in the target debug thread
+	TUint32 address = (TUint32)(&TestFunction);
+
+	// there are six orders in which three breakpoints can be set, these are looped
+	// through below to check setting and clearing consecutive breakpoints works
+	TUint8 order[6][3] =
+		{
+			{0,1,2},
+			{0,2,1},
+			{1,0,2},
+			{1,2,0},
+			{2,0,1},
+			{2,1,0}
+		};
+
+	// The following code checks that setting and clearing consecutive breakpoints works correctly:
+	// It checks that setting all combinations of three arm and thumb breakpoints succeeds, and check that the
+	// breakpoints can be set in any order, and then cleared in any order
+
+	// the 3 least significant bits of i control whether each of the three breakpoints should be arm or thumb
+	for(TInt i=0; i<8; i++)
+		{
+		// controls the order in which the breakpoints should be set
+		for(TInt j=0; j<6; j++)
+			{
+			// create the three breakpoints and set their modes
+			TBreakPoint bp[3];
+			bp[0].iMode = (i&1) ? EArmMode : EThumbMode;
+			bp[1].iMode = (i&2) ? EArmMode : EThumbMode;
+			bp[2].iMode = (i&4) ? EArmMode : EThumbMode;
+
+			// set the address of each of the breakpoints
+			bp[0].iAddress = address;
+			if(EArmMode == bp[0].iMode)
+				{ // if an arm breakpoint then must be on a four byte boundary
+				bp[0].iAddress = Align4(bp[0].iAddress);
+				}
+			bp[1].iAddress = bp[0].iAddress + bp[0].Size();
+			if(EArmMode == bp[1].iMode)
+				{ // if an arm breakpoint then must be on a four byte boundary
+				bp[1].iAddress = Align4(bp[1].iAddress);
+				}
+			bp[2].iAddress = bp[1].iAddress + bp[1].Size();
+			if(EArmMode == bp[2].iMode)
+				{ // if an arm breakpoint then must be on a four byte boundary
+				bp[2].iAddress = Align4(bp[2].iAddress);
+				}
+			for(TInt k=0; k<6; k++)
+				{
+				// set the three breakpoints in the order defined by j and then clear them in the order defined by k
+				test(KErrNone==iServSession.SetBreak(bp[order[j][0]].iId, iThreadID, bp[order[j][0]].iAddress, bp[order[j][0]].iMode));
+				test(KErrNone==iServSession.SetBreak(bp[order[j][1]].iId, iThreadID, bp[order[j][1]].iAddress, bp[order[j][1]].iMode));
+				test(KErrNone==iServSession.SetBreak(bp[order[j][2]].iId, iThreadID, bp[order[j][2]].iAddress, bp[order[j][2]].iMode));
+				test(KErrNone==iServSession.ClearBreak(bp[order[k][0]].iId));
+				test(KErrNone==iServSession.ClearBreak(bp[order[k][1]].iId));
+				test(KErrNone==iServSession.ClearBreak(bp[order[k][2]].iId));
+				}
+			}
+		}
+
+	// resume the thread
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0436
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test breakpoint functionality
+//! @SYMTestActions Multiple calls to set and clear breakpoints. Checking bad input produces appropriate errors.
+//! @SYMTestExpectedResults All tests should pass and the target debug thread should be left unaffected
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestBreakPoints()
+	{
+	TInt err;
+
+	test.Next(_L("TestBreakPoints - Set\n"));
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+
+	TestConsecutiveBreakPoints();
+
+	//an address in the target debug thread
+	TUint32 address = (TUint32)(&TestFunction);
+
+	/*
+	 * Ensure that breakpoint operations don't
+	 * affect memory read/write by checking that reads/writes
+	 * in locations containing breakpoints don't change behaviour
+	 * because of the breakpoints.
+	 */
+
+	TUint32 size = SYMBIAN_RMDBG_MEMORYSIZE;
+
+	RBuf8 originalDataBlock;
+	err = originalDataBlock.Create(size);
+	test(err==KErrNone);
+
+	//suspend the thread
+	test(KErrNone == iServSession.SuspendThread(iThreadID));
+
+	err = iServSession.ReadMemory(iThreadID, address, size, originalDataBlock, EAccess32, EEndLE8);
+	test(err==KErrNone);
+
+	// Test data block for comparison
+	RBuf8 testDataBlock;
+	err = testDataBlock.Create(size);
+	test(err==KErrNone);
+
+	/*
+	 * set an arm breakpoint
+	 */
+	test.Next(_L("TestBreakPoints - set an arm breakpoint1"));
+
+	TBreakId armBreakId = 0;
+	err = iServSession.SetBreak(armBreakId, iThreadID, address, EArmMode);
+	test(err == KErrNone);
+
+	// Ensure that memory read is not corrupted
+	test.Next(_L("TestBreakPoints - read mem 2"));
+	err = iServSession.ReadMemory(iThreadID, address, size, testDataBlock, EAccess32, EEndLE8);
+	test(err==KErrNone);
+
+	test (testDataBlock == originalDataBlock);
+
+	/*
+	 * set a thumb breakpoint
+	 */
+	test.Next(_L("TestBreak- set a thumb breakpoint1"));
+	TBreakId thumbBreakId = 0;
+	err = iServSession.SetBreak(thumbBreakId, iThreadID, address+4, EThumbMode);
+	test(err == KErrNone);
+
+	/*
+	 * set a thumb2EE breakpoint
+	 */
+	test.Next(_L("TestBreak- set a thumb2EE breakpoint"));
+
+	TBreakId thumb2EEBreakId = 0;
+	err = iServSession.SetBreak(thumb2EEBreakId, iThreadID, address+8, EThumb2EEMode);
+	test(err == KErrNotSupported);
+
+	/*
+	 * overlapping breakpoint (same address/threadId/mode)
+	 */
+	test.Next(_L("TestBreak- set overlapping breakpoint 1"));
+	TBreakId overlapBreakId = 0;
+	err = iServSession.SetBreak(overlapBreakId, iThreadID, address, EArmMode);
+	test(err == KErrAlreadyExists);
+
+	/*
+	 * overlapping breakpoint (different address/same threadId/different mode)
+	 *
+	 * address - EArmBreakpoint
+	 * address+2 - EThumbBreakpoint
+	 */
+	test.Next(_L("TestBreak- set overlapping breakpoint 2"));
+	TBreakId overlap2BreakId = 0;
+	err = iServSession.SetBreak(overlap2BreakId, iThreadID, address+2, EThumbMode);
+	test(err == KErrAlreadyExists);
+
+	/*
+	 * Un-aligned address (arm)
+	 */
+	test.Next(_L("TestBreak- set Un-aligned address (arm)"));
+	TBreakId armUnalignedBreakId = 0;
+	err = iServSession.SetBreak(armUnalignedBreakId, iThreadID, address+6, EArmMode);
+	test(err == KErrArgument);
+
+	/*
+	 * Un-aligned address (thumb)
+	 */
+	test.Next(_L("TestBreak- set Un-aligned address (thumb)"));
+	TBreakId thumbUnalignedBreakId = 0;
+	err = iServSession.SetBreak(thumbUnalignedBreakId, iThreadID, address+7, EThumbMode);
+	test(err == KErrArgument);
+
+	/*
+	 * Invalid address (arm)
+	 */
+	test.Next(_L("TestBreak- set Invalid address (arm)"));
+	TBreakId armBadAddressBreakId = 0;
+	err = iServSession.SetBreak(armBadAddressBreakId, iThreadID, 0 /* address */, EThumbMode);
+	test(err == KErrBadDescriptor);
+
+	/*
+	 * Different thread, same address. Should fail for the same process, but succeed
+	 * for a different process.
+	 */
+
+	/*
+	 * Invalid thread
+	 */
+	TBreakId invalidThreadBreakId = 0;
+	err = iServSession.SetBreak(invalidThreadBreakId, 0xbabababa, address, EThumbMode);
+	test(err == KErrPermissionDenied);
+
+	// Clear the ARM breakpoint
+	err = iServSession.ClearBreak(armBreakId);
+	test(err == KErrNone);
+
+	// Clear the Thumb breakpoint
+	err = iServSession.ClearBreak(thumbBreakId);
+	test(err == KErrNone);
+
+	// to do : two threads at the same address
+	// to do : two processes at the same address
+
+	// Ensure that memory read is not corrupted after clearing the breakpoints
+	err = iServSession.ReadMemory(iThreadID, address, size, testDataBlock, EAccess32, EEndLE8);
+	test(err==KErrNone);
+
+	test (testDataBlock == originalDataBlock);
+
+	/*
+	 * How fast can we set breakpoints?
+	 *
+	 * Measure the time by setting/clearing breakpoints for 1 second.
+     */
+	TInt nanokernel_tick_period;
+	HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period);
+	test (nanokernel_tick_period != 0);
+
+	TInt nkTicksPerSecond = HelpTicksPerSecond();
+
+	TInt breaksPerSecond = 0;
+
+	TUint32 stopTickCount = User::NTickCount() + nkTicksPerSecond;
+
+	while (User::NTickCount() < stopTickCount)
+		{
+		// set the breakpoint
+		TBreakId armBreakId = 0;
+		err = iServSession.SetBreak(armBreakId, iThreadID, address, EArmMode);
+		test(err == KErrNone);
+
+		// Clear the breakpoint
+		err = iServSession.ClearBreak(armBreakId);
+		test(err == KErrNone);
+
+		// Update the count of breakpoints
+		breaksPerSecond++;
+
+		// Gone wrong if we wrap to negative breakpoints (cannot set 2billion/second!)
+		test(breaksPerSecond >0);
+		}
+
+	// Store the results for later
+	iBreakpointsPerSecond = breaksPerSecond;
+
+	/*
+	 * How many breakpoints can we set?
+	 */
+
+	TBool done = EFalse;
+
+	// We assume all the breakpoints id's are issued in ascending order
+	TInt maxBreakPoints = 0;
+
+	// Temporary buffer
+	RArray<TBreakId> breakIdList;
+
+	TUint32 testAddress = address;
+
+	while(!done)
+		{
+		TBreakId breakId = 0;
+
+		// set the breakpoint
+		testAddress += 4;	// ensure the addresses don't overlap
+
+		err = iServSession.SetBreak(breakId, iThreadID, testAddress, EArmMode);
+		test (err == KErrNone || err == KErrOverflow);
+		if (err != KErrNone)
+			{
+			// we've reached the limit of the number of breaks we can set
+			done = ETrue;
+			break;
+			}
+
+		// store the id of this breakpoint
+		breakIdList.Append(breakId);
+
+		// Increase the count of breakpoints
+		maxBreakPoints++;
+		test(maxBreakPoints > 0);
+		}
+
+	// How many breakpoints can we set?
+	iMaxBreakpoints = maxBreakPoints;
+
+	// now clear all those breakpoints again
+	while(breakIdList.Count() != 0)
+		{
+		// Place it into a TBreakId
+		TBreakId id = breakIdList[0];
+
+		err = iServSession.ClearBreak(id);
+		test(err == KErrNone);
+
+		// next id
+		breakIdList.Remove(0);
+		}
+
+	breakIdList.Close();
+
+	// close our temporary buffers
+	originalDataBlock.Close();
+	testDataBlock.Close();
+
+	err = iServSession.ResumeThread(iThreadID);
+	test (err == KErrNone);
+
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0437
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test modifying breakpoints
+//! @SYMTestActions Several calls to modify breakpoints
+//! @SYMTestExpectedResults Valid requests should result in the breakpoints being changed, invalid requests should return errors
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestModifyBreak()
+	{
+	test.Next(_L("TestModifyBreak\n"));
+
+	DoTestModifyBreak(ETrue);
+	DoTestModifyBreak(EFalse);
+	}
+
+void CRunModeAgent::DoTestModifyBreak(TBool aThreadSpecific)
+	{
+	test.Printf(_L("DoTestModifyBreak: aThreadSpecific: %d\n"), aThreadSpecific?1:0);
+
+	TInt err;
+
+	RProcess process;
+	TProcessId processId = process.Id();
+	process.Close();
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+
+	//suspend the thread
+	test(KErrNone == iServSession.SuspendThread(iThreadID));
+
+	//an address in the target debug thread
+	TUint32 address = (TUint32)(&TestFunction);
+
+	//set an arm mode break point
+	TBreakId armBreakId = 0;
+	err = aThreadSpecific
+		? iServSession.SetBreak(armBreakId, iThreadID, address, EArmMode)
+		: iServSession.SetProcessBreak(armBreakId, processId, address, EArmMode);
+	test(err == KErrNone);
+
+	/*
+	 * Invalid thread
+	 */
+	err = aThreadSpecific
+		? iServSession.ModifyBreak(armBreakId, 0xbabababa, address, EArmMode)
+		: iServSession.ModifyProcessBreak(armBreakId, 0xbabababa, address, EArmMode);
+	test(err == KErrPermissionDenied);
+
+	/*
+	 * Valid address
+	 */
+	err = aThreadSpecific
+		? iServSession.ModifyBreak(armBreakId, iThreadID, address+4, EArmMode)
+		: iServSession.ModifyProcessBreak(armBreakId, processId, address+4, EArmMode);
+	test(err == KErrNone);
+
+	/*
+	 * Invalid address
+	 */
+	err = aThreadSpecific
+		? iServSession.ModifyBreak(armBreakId, iThreadID, 0, EArmMode)
+		: iServSession.ModifyProcessBreak(armBreakId, processId, 0, EArmMode);
+	test(err == KErrBadDescriptor);
+
+	/*
+	 * Thumb mode
+	 */
+	err = aThreadSpecific
+		? iServSession.ModifyBreak(armBreakId, iThreadID, address, EThumbMode)
+		: iServSession.ModifyProcessBreak(armBreakId, processId, address, EThumbMode);
+	test(err == KErrNone);
+
+	/*
+	 * Thumb2EE mode
+	 */
+	err = aThreadSpecific
+		? iServSession.ModifyBreak(armBreakId, iThreadID, address, EThumb2EEMode)
+		: iServSession.ModifyProcessBreak(armBreakId, processId, address, EThumb2EEMode);
+	test(err == KErrNotSupported);
+
+	/*
+	 * Arm mode
+	 */
+	err = aThreadSpecific
+		? iServSession.ModifyBreak(armBreakId, iThreadID, address, EArmMode)
+		: iServSession.ModifyProcessBreak(armBreakId, processId, address, EArmMode);
+	test(err == KErrNone);
+
+	// Finally, clear the breakpoint
+	err = iServSession.ClearBreak(armBreakId);
+	test(err == KErrNone);
+
+	//resume the thread
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0438
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test extracting information about breakpoints
+//! @SYMTestActions Several calls to get information about breakpoints
+//! @SYMTestExpectedResults All tests should pass and the target process should be left unaffected
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestBreakInfo()
+	{
+	test.Next(_L("TestBreakInfo\n"));
+
+	DoTestBreakInfo(ETrue);
+	DoTestBreakInfo(EFalse);
+	}
+
+void CRunModeAgent::DoTestBreakInfo(TBool aThreadSpecific)
+	{
+	test.Printf(_L("DoTestModifyBreak: aThreadSpecific: %d\n"), aThreadSpecific?1:0);
+
+	TInt err;
+
+	RProcess process;
+	TProcessId processId = process.Id();
+	process.Close();
+
+	//an address in the target debug thread
+	TUint32 address = (TUint32)(&TestFunction);
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+
+	//suspend thread
+	test(KErrNone == iServSession.SuspendThread(iThreadID));
+
+	//set an arm mode break point
+	TBreakId armBreakId = 0;
+	err = aThreadSpecific
+		? iServSession.SetBreak(armBreakId, iThreadID, address, EArmMode)
+		: iServSession.SetProcessBreak(armBreakId, processId, address, EArmMode);
+	test(err == KErrNone);
+
+	// Read back the information and check it is correct
+	TThreadId testThreadId = TThreadId(0);
+	TProcessId testProcessId = TProcessId(0);
+	TUint32 testAddress = 0;
+	TArchitectureMode testMode = EArmMode;
+
+	err = aThreadSpecific
+		? iServSession.BreakInfo(armBreakId,testThreadId,testAddress, testMode)
+		: iServSession.ProcessBreakInfo(armBreakId, testProcessId, testAddress, testMode);
+	test (err == KErrNone);
+	test (aThreadSpecific ? (testThreadId == iThreadID) : (testProcessId == processId));
+	test (testAddress == address);
+	test (testMode == EArmMode);
+
+	//change the address
+	TUint32 changeAddress = address + 64;
+	err = aThreadSpecific
+		? iServSession.ModifyBreak(armBreakId, iThreadID, changeAddress,EArmMode)
+		: iServSession.ModifyProcessBreak(armBreakId, processId, changeAddress, EArmMode);
+	test(err == KErrNone);
+
+	// Check the address has changed
+	err = aThreadSpecific
+		? iServSession.BreakInfo(armBreakId,testThreadId,testAddress, testMode)
+		: iServSession.ProcessBreakInfo(armBreakId, testProcessId, testAddress, testMode);
+	test (err == KErrNone);
+	test (testAddress == changeAddress);
+
+	// change the architecture type
+	TArchitectureMode checkMode = EThumbMode;
+	err = aThreadSpecific
+		? iServSession.ModifyBreak(armBreakId, iThreadID, address,checkMode)
+		: iServSession.ModifyProcessBreak(armBreakId, processId, address, checkMode);
+	test (err == KErrNone);
+
+	// Check the mode has changed
+	err = aThreadSpecific
+		? iServSession.BreakInfo(armBreakId,testThreadId,testAddress,testMode)
+		: iServSession.ProcessBreakInfo(armBreakId, testProcessId, testAddress, testMode);
+	test (err == KErrNone);
+	test (testMode == checkMode);
+
+	// clear the breakpoint again
+	err = iServSession.ClearBreak(armBreakId);
+	test (err == KErrNone);
+
+	//resume thread
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+
+// Needed for the RunToBreak test
+IMPORT_C extern void RMDebug_BranchTst1();
+IMPORT_C extern void RMDebug_BranchTst2();
+
+//---------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-0439
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test hitting various types of breakpoints
+//! @SYMTestActions Several calls to register to observe breakpoints and to hit breakpoints of different types
+//! @SYMTestExpectedResults All tests should pass and the target process should be left unaffected
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestRunToBreak()
+	{
+	test.Next(_L("TestRunToBreak\n"));
+
+	DoTestRunToBreak(ETrue);
+	DoTestRunToBreak(EFalse);
+	}
+
+void CRunModeAgent::DoTestRunToBreak(TBool aThreadSpecific)
+	{
+	test.Printf(_L("DoTestRunToBreak: aThreadSpecific: %d\n"), aThreadSpecific?1:0);
+
+	TInt err = KErrNone;
+
+	RProcess process;
+	TProcessId processId = process.Id();
+	process.Close();
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+	// we should suspend the thread first, then set the breakpoint
+	err = iServSession.SuspendThread(iThreadID);
+	test (err == KErrNone);
+
+	// Try to set the breakpoint
+	TBreakId armBreakId;
+	TUint32 address = (TUint32)(&RMDebug_BranchTst1);
+
+	err = aThreadSpecific
+		? iServSession.SetBreak(armBreakId,iThreadID,address,EArmMode)
+		: iServSession.SetProcessBreak(armBreakId, processId, address, EArmMode);
+	test(err == KErrNone);
+
+	err = aThreadSpecific
+		? iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionContinue)
+		: iServSession.SetEventAction(iFileName,EEventsProcessBreakPoint, EActionContinue);
+	test (err == KErrNone);
+
+	// Continue the thread
+	err = iServSession.ResumeThread(iThreadID);
+	test (err == KErrNone);
+
+	// wait for the breakpoint to be hit
+	TEventInfo info;
+	static TRequestStatus status;
+
+	TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
+
+	iServSession.GetEvent(iFileName,status,infoPtr);
+
+	// Wait for notification of the breakpoint hit event
+	User::WaitForRequest(status);
+	test(status==KErrNone);
+
+	// info should now be filled with the details
+	test(info.iEventType == (aThreadSpecific ? EEventsBreakPoint : EEventsProcessBreakPoint));
+	test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == address);
+	test(info.iProcessIdValid);
+	test(info.iThreadIdValid);
+
+	// Not interested in breakpoint events any more
+	err = aThreadSpecific
+		? iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionIgnore)
+		: iServSession.SetEventAction(iFileName, EEventsProcessBreakPoint, EActionIgnore);
+	test (err == KErrNone);
+
+	// Clear the breakpoint again
+	err = iServSession.ClearBreak(armBreakId);
+	test(err == KErrNone);
+
+	// continue the thread again
+	err = iServSession.ResumeThread(iThreadID);
+	test (err == KErrNone);
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+
+//---------------------------------------------
+//! @SYMTestCaseID KBASE-rmdebug2-2704
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test breakpoints in a loop
+//! @SYMTestActions Several calls to register to verify breakpoints are stopping at correct address
+//! @SYMTestExpectedResults All tests should pass and the target thread should be left unaffected
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//---------------------------------------------
+void CRunModeAgent::TestBreakPointsInLoop()
+	{
+	test.Next(_L("TestBreakPointsInLoop\n"));
+
+	DoTestBreakPointsInLoop(ETrue);
+	DoTestBreakPointsInLoop(EFalse);
+	}
+
+void CRunModeAgent::DoTestBreakPointsInLoop(TBool aThreadSpecific)
+	{
+	test.Printf(_L("DoTestBreakPointsInLoop: aThreadSpecific: %d\n"), aThreadSpecific?1:0);
+
+	TInt err = KErrNone;
+	TProcessId processId = RProcess().Id(); 
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+	
+	// We should suspend the thread first, then set the breakpoint
+	err = iServSession.SuspendThread(iThreadID);
+	test (err == KErrNone);
+
+	// 2 breakpoints are sufficient to find issues with hitting breakpoints in a loop
+	const TInt numOfBreakPointsInLoop = 2;
+
+	TBreakId armBreakId[numOfBreakPointsInLoop];
+	TUint32 address[numOfBreakPointsInLoop];
+   	
+	TUint32 entryAddress = (TUint32)(&RMDebug_Bkpt_Test_Entry);
+	TBreakId entryArmBreakId;
+
+	// Copy breakpoint address's in array
+	address[0] = (TUint32)(&RMDebug_Bkpt_Test_Loop_Break_1);
+	address[1] = (TUint32)(&RMDebug_Bkpt_Test_Loop_Break_2);
+
+	err = aThreadSpecific
+		? iServSession.SetBreak(entryArmBreakId,iThreadID,entryAddress,EArmMode)
+		: iServSession.SetProcessBreak(entryArmBreakId, processId, entryAddress, EArmMode);
+	test(err == KErrNone);
+
+	// Try to set the breakpoints inside loop
+	for (TInt i = 0; i < numOfBreakPointsInLoop; i++)
+		{
+		err = aThreadSpecific
+			? iServSession.SetBreak(armBreakId[i],iThreadID,address[i],EArmMode)
+			: iServSession.SetProcessBreak(armBreakId[i], processId, address[i], EArmMode);
+		test(err == KErrNone);
+		}
+
+	err = aThreadSpecific
+		? iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionSuspend)
+		: iServSession.SetEventAction(iFileName,EEventsProcessBreakPoint, EActionSuspend);
+	test (err == KErrNone);
+
+	// Continue the thread
+	err = iServSession.ResumeThread(iThreadID);
+	test (err == KErrNone);
+
+	// Wait for the breakpoint to be hit
+	TEventInfo info;
+	TRequestStatus status;
+
+	TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
+	iServSession.GetEvent(iFileName,status,infoPtr);
+
+	// Wait for notification of breakpoint event
+	User::WaitForRequest(status);
+	test(status==KErrNone);
+
+	// Info should now be filled with the details
+	test(info.iEventType == (aThreadSpecific ? EEventsBreakPoint : EEventsProcessBreakPoint));
+
+	// Have we stopped at the correct breakpoint?
+	test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == entryAddress);
+	test(info.iProcessIdValid);
+	test(info.iThreadIdValid);
+
+	// Don't require the entry breakpoint anymore
+	err = iServSession.ClearBreak(entryArmBreakId);
+	test(err == KErrNone);
+	
+	// Stress the system by setting loop count to 100
+	const TUint32 loopCount = 100;
+
+	for (TInt i = 0; i < loopCount; i++)
+		{
+		// Continue the thread
+		err = iServSession.ResumeThread(iThreadID);
+		test (err == KErrNone);
+
+		// Wait for the breakpoint to be hit
+		iServSession.GetEvent(iFileName,status,infoPtr);
+		
+		// Wait for notification of the breakpoint hit event
+		User::WaitForRequest(status);
+		test(status==KErrNone);
+		
+		// Info should now be filled with the details
+		test(info.iEventType == (aThreadSpecific ? EEventsBreakPoint : EEventsProcessBreakPoint));
+		
+		// Have we stopped at the correct breakpoint?
+		test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == address[i%numOfBreakPointsInLoop]);
+		
+		// Check process and thread id too
+		test(info.iProcessIdValid);
+		test(info.iThreadIdValid);
+		}
+
+	// Not interested in breakpoint events any more
+	err = aThreadSpecific
+		? iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionIgnore)
+		: iServSession.SetEventAction(iFileName, EEventsProcessBreakPoint, EActionIgnore);
+	test (err == KErrNone);
+
+	// Clear breakpoints
+	for (TInt i = 0; i < numOfBreakPointsInLoop; i++)
+		{
+		err = iServSession.ClearBreak(armBreakId[i]);
+		test(err == KErrNone);
+		}
+	
+	// Continue the thread again
+	err = iServSession.ResumeThread(iThreadID);
+	test (err == KErrNone);
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-0440
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Test access to target user-side registers.
+//! @SYMTestActions     Suspends a target thread, and reads/writes target thread register contents
+//!
+//! @SYMTestExpectedResults KErrNone. Should access target registers without problems.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+
+void CRunModeAgent::TestRegisterAccess()
+	{
+	TInt err;
+
+	test.Next(_L("TestRegisterAccess - Read\n"));
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+
+	//suspend the thread to read registers
+	err = iServSession.SuspendThread(iThreadID);
+	test(err==KErrNone);
+
+	//we'll try to read/write registers ERegisterR0 - ERegisterCPSR and ERegisterR13_IRQ
+	//this way should get valid register values back, invalid ones and not supported ones, and it
+	//means that the register IDs are not completely contiguous
+
+	TInt firstRegister = 0;
+	TInt lastRegister = 17;
+	TInt numberOfRegisters = (lastRegister - firstRegister) + 1;
+
+	RBuf8 ids;
+	err = ids.Create(numberOfRegisters * sizeof(TRegisterInfo));
+	test(err == KErrNone);
+
+	for(TInt i=0; i<numberOfRegisters - 1; i++)
+		{
+		TRegisterInfo reg = (TRegisterInfo)((i + firstRegister)<<8);
+		ids.Append(reinterpret_cast<const TUint8*>(&reg), sizeof(TRegisterInfo));
+		}
+
+	TRegisterInfo reg = ERegisterR13Irq;
+	ids.Append(reinterpret_cast<const TUint8*>(&reg), sizeof(TRegisterInfo));
+
+	//create a buffer to store the register values in
+	RBuf8 originalValues;
+	err = originalValues.Create(numberOfRegisters*sizeof(TUint32));
+	test(err == KErrNone);
+
+	//create a buffer to store the register flags in
+	RBuf8 originalFlags;
+	err = originalFlags.Create(numberOfRegisters*sizeof(TUint8));
+	test(err == KErrNone);
+
+	//read register values
+	err = iServSession.ReadRegisters(iThreadID, ids, originalValues, originalFlags);
+	test(err == KErrNone);
+
+	//create a buffer containing data to write into the registers
+	RBuf8 tempValues;
+	err = tempValues.Create(numberOfRegisters*sizeof(TUint32));
+	test(err == KErrNone);
+
+	TUint cpsrId = 16;
+	for(TUint8 i=0; i<numberOfRegisters*sizeof(TUint32); i++)
+		{
+		if(i/sizeof(TUint32) == cpsrId)
+			{
+			//For the CPSR we wish to write data that makes sense - for USR mode we are
+			//allowed change all except the mode, ie. we must stay in usr mode. We try that here
+			//(allowedCPSRValue[4:0] = 10000) thus not changing the mode.
+			TUint32 allowedCPSRValue = 0x50000010;
+			tempValues.Append((TUint8*)&allowedCPSRValue, 4);
+			i += 3;
+			}
+		else
+			{
+			tempValues.Append(&i, 1);
+			}
+		}
+
+	test.Next(_L("TestRegisterAccess - Write\n"));
+
+	//create a buffer to store the register flags in
+	RBuf8 tempWriteFlags;
+	err = tempWriteFlags.Create(numberOfRegisters*sizeof(TUint8));
+	test(err == KErrNone);
+
+	//write the temp data into the registers
+	err = iServSession.WriteRegisters(iThreadID, ids, tempValues, tempWriteFlags);
+	test(err == KErrNone);
+
+	//create another buffer to store the register flags in
+	RBuf8 tempReadFlags;
+	err = tempReadFlags.Create(numberOfRegisters*sizeof(TUint8));
+	test(err == KErrNone);
+
+	RBuf8 tempReadValues;
+	err = tempReadValues.Create(numberOfRegisters*sizeof(TUint32));
+	test(err == KErrNone);
+
+	//read the temp data out again
+	err = iServSession.ReadRegisters(iThreadID, ids, tempReadValues, tempReadFlags);
+	test(err == KErrNone);
+
+	//check values are correct
+	for(TInt i=0; i<numberOfRegisters; i++)
+		{
+		TRegisterFlag writeFlag;
+		err = GetFlag(tempWriteFlags, i, writeFlag);
+		test(err == KErrNone);
+
+		TRegisterFlag readFlag;
+		err = GetFlag(tempReadFlags, i, readFlag);
+		test(err == KErrNone);
+
+		if((writeFlag == EValid) && (readFlag == EValid))
+			{
+			TUint8 offset = i * sizeof(TUint32);
+			for(TUint j = offset; j< offset + sizeof(TUint32); j++)
+				{
+				test(tempValues.Ptr()[j] == tempReadValues.Ptr()[j]);
+				}
+			}
+		}
+
+	//write the original data into the registers
+	err = iServSession.WriteRegisters(iThreadID, ids, originalValues, originalFlags);
+	test(err == KErrNone);
+
+	//read the data out again
+	err = iServSession.ReadRegisters(iThreadID, ids, tempValues, tempReadFlags);
+	test(err == KErrNone);
+
+	//check values are correct
+	for(TInt i=0; i<numberOfRegisters; i++)
+		{
+		TRegisterFlag writeFlag;
+		err = GetFlag(originalFlags, i, writeFlag);
+		test(err == KErrNone);
+
+		TRegisterFlag readFlag;
+		err = GetFlag(tempReadFlags, i, readFlag);
+		test(err == KErrNone);
+
+		if((writeFlag == EValid) && (readFlag == EValid))
+			{
+			TUint8 offset = i * sizeof(TUint32);
+			for(TUint j = offset; j< offset + sizeof(TUint32); j++)
+				{
+				test(tempValues.Ptr()[j] == originalValues.Ptr()[j]);
+				}
+			}
+		}
+
+	test.Next(_L("TestRegisterAccess - Invalid data\n"));
+
+	//create a buffer of max size 1
+	RBuf8 emptyBuffer;
+	emptyBuffer.Create(1);
+
+	//test register IDs buffer not being a multiple of sizeof(TRegisterInfo)
+	err = iServSession.ReadRegisters(iThreadID, emptyBuffer, tempValues, tempReadFlags);
+	test(err == KErrArgument);
+
+	//test register values buffer not being a multiple of sizeof(TUint32)
+	err = iServSession.ReadRegisters(iThreadID, ids, emptyBuffer, tempReadFlags);
+	test(err == KErrArgument);
+
+	//test flags buffer being representing different number of registers from other two
+	err = iServSession.ReadRegisters(iThreadID, ids, tempValues, emptyBuffer);
+	test(err == KErrArgument);
+
+	//set max length to 0
+	emptyBuffer.ReAlloc(0);
+
+	//test ids buffer being of 0 max length
+	err = iServSession.ReadRegisters(iThreadID, emptyBuffer, tempValues, tempReadFlags);
+	test(err == KErrArgument);
+
+	//do cleanup
+	emptyBuffer.Close();
+	tempValues.Close();
+	tempWriteFlags.Close();
+	tempReadFlags.Close();
+	tempReadValues.Close();
+
+	test.Next(_L("TestRegisterAccess - Setting PC value\n"));
+
+	//create buffer containing PC register ID
+	RBuf8 pcId;
+	err = pcId.Create(sizeof(TRegisterInfo));
+	test(err == KErrNone);
+	TRegisterInfo reg1 = (TRegisterInfo)0x00000f00;
+	pcId.Append(reinterpret_cast<const TUint8*>(&reg1), sizeof(TRegisterInfo));
+
+	//create buffer containing desired PC value
+	RBuf8 pcValue;
+	err = pcValue.Create(sizeof(TUint32));
+	test(err == KErrNone);
+	TUint32 address = (TUint32)(&TestFunction);
+	pcValue.Append(reinterpret_cast<const TUint8*>(&address), sizeof(TUint32));
+
+	//craete buffer for PC flag value
+	RBuf8 pcFlag;
+	err = pcFlag.Create(sizeof(TUint8));
+
+	//write the new PC value
+	err = iServSession.WriteRegisters(iThreadID, pcId, pcValue, pcFlag);
+	test(err==KErrNone);
+
+	//get the flag and check the PC value was written ok
+	TRegisterFlag flag = ENotSupported;
+	err = GetFlag(pcFlag, 0, flag);
+	test(err==KErrNone);
+	test( flag == EValid);
+	if(flag == EValid)
+		{
+		/* The PC value was changed to execute the function TestFunction.
+		* TestFunction changes the value of TestData to a given value and 
+		* then calls RMDebug_BranchTst1.
+		* We place a breakpoint on RMDebug_BranchTst1 so that to we are able 
+		* to test the value of TestData.
+		*/
+
+		test(KErrNone == iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionSuspend));
+		TBreakId armBreakId;
+		TUint32 address = (TUint32)(&RMDebug_BranchTst1);
+		test(KErrNone == iServSession.SetBreak(armBreakId,iThreadID,address,EArmMode));
+
+		// Continue the thread
+		test(KErrNone == iServSession.ResumeThread(iThreadID));
+
+		// wait for the breakpoint to be hit
+		TEventInfo info;
+		static TRequestStatus status;
+
+		TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
+		iServSession.GetEvent(iFileName,status,infoPtr);
+
+		// Wait for notification of the breakpoint hit event
+		User::WaitForRequest(status);
+		test(status==KErrNone);
+
+		// info should now be filled with the details
+		test(info.iEventType == EEventsBreakPoint);
+		test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == address);
+		test(info.iProcessIdValid);
+		test(info.iThreadIdValid);
+
+		test(KErrNone == iServSession.ClearBreak(armBreakId));
+
+		// Finally test the value
+		test(TestData == 0xffeeddcc);
+		}
+
+	//Make sure we cannot change the CPSR
+	test.Next(_L("Verifying we cannot change the CPSR mode from USR Mode"));
+
+	TUint32 disallowedCpsr = 0x50000013;
+
+	RBuf8 cpsrRegId;
+	err = cpsrRegId.Create(sizeof(TUint32));
+	test(err == KErrNone);
+
+	TRegisterInfo cpsr = (TRegisterInfo)((cpsrId + firstRegister)<<8);
+	cpsrRegId.Append(reinterpret_cast<const TUint8*>(&cpsr), sizeof(TRegisterInfo));
+
+	RBuf8 cpsrRegFlags;
+	err = cpsrRegFlags.Create(sizeof(TUint8));
+	test(err == KErrNone);
+
+	RBuf8 cpsrVal;
+	err = cpsrVal.Create(sizeof(TUint32));
+	test(err == KErrNone);
+
+	cpsrVal.Append((TUint8*)&disallowedCpsr, 4);
+
+	//attempt to write disallowed CPSR in
+	err = iServSession.WriteRegisters(iThreadID, cpsrRegId, cpsrVal, cpsrRegFlags);
+	test(err == KErrNone);
+
+	RBuf8 cpsrReadVal;
+	err = cpsrReadVal.Create(sizeof(TUint32));
+	test(err == KErrNone);
+
+	//Read back the CPSR
+	err = iServSession.ReadRegisters(iThreadID, cpsrRegId, cpsrReadVal, cpsrRegFlags);
+	test(err == KErrNone);
+
+	//Make sure we havent switched modes ie. its not what we wrote
+	TUint32* readVal = (TUint32*)cpsrReadVal.Ptr();
+	test(*readVal != disallowedCpsr);
+
+	cpsrRegId.Close();
+	cpsrRegFlags.Close();
+	cpsrVal.Close();
+	cpsrReadVal.Close();
+
+	//write the original values back into here
+	err = iServSession.WriteRegisters(iThreadID, ids, originalValues, originalFlags);
+	test(err == KErrNone);
+	
+	test(KErrNone == SwitchTestFunction(EDefaultFunction));
+
+	// Resume the thread
+	err = iServSession.ResumeThread(iThreadID);
+	test(err==KErrNone);
+
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+
+	//do cleanup
+	pcId.Close();
+	pcValue.Close();
+	pcFlag.Close();
+	ids.Close();
+	originalValues.Close();
+	originalFlags.Close();
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-0441
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Test registration/de-registration of debug interest in target exe with the Debug Security Server
+//! @SYMTestActions     As per description
+//!
+//! @SYMTestExpectedResults KErrNone.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+
+void CRunModeAgent::TestAttachExecutable()
+	{
+
+	test.Next(_L("TestAttachExecutable - Attach\n"));
+
+	//attach to process passively
+	test(KErrNone == iServSession.AttachExecutable(iFileName, ETrue));
+
+	//make a thread id for a non-existent thread
+	TThreadId threadId(0x12345678);
+
+	//get a handle to the target thread
+	RThread targetThread;
+	TInt err = targetThread.Open(threadId);
+	test(err != KErrNone);
+
+	//not registered for this thread's process (as it doesn't exist)
+	//so should fail security check
+	err = iServSession.ResumeThread(threadId);
+	test(err==KErrPermissionDenied || err==KErrNotFound); // newer DSS returns the more-descriptive KErrNotFound here
+
+	//try to attach to the same process (and fail)
+	test(KErrAlreadyExists == iServSession.AttachExecutable(iFileName, EFalse));
+
+	test.Next(_L("TestAttachExecutable - Detach\n"));
+
+	//detach from process
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+
+	//attach non-passively
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+
+	//not registered for this thread's process (as it doesn't exist)
+	//so should fail security check
+	err = iServSession.ResumeThread(0x12345678);
+	test(err==KErrPermissionDenied || err==KErrNotFound); // newer DSS returns the more-descriptive KErrNotFound here
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-0442
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Tests single-stepping target threads.
+//! @SYMTestActions     Steps target thread assembly level instructions, mainly branch/change PC
+//!
+//! @SYMTestExpectedResults KErrNone.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+
+void CRunModeAgent::TestStep()
+	{
+	test.Next(_L("TestStep\n"));
+
+	DoTestStep(EFalse);
+	DoTestStep(ETrue);
+	}
+
+void CRunModeAgent::DoTestStep(TBool aThreadSpecific)
+	{
+	test.Printf(_L("DoTestStep: aThreadSpecific: %d\n"), aThreadSpecific?1:0);
+
+	TInt err = KErrNone;
+
+	RProcess process;
+	TProcessId processId = process.Id();
+	process.Close();
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+	//set the target thread to execute the stepping functions
+	test(KErrNone == SwitchTestFunction(EStepFunction, EFalse));
+
+	
+	err = iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionContinue);
+	test (err == KErrNone);
+
+	if(!aThreadSpecific)
+		{
+		err = iServSession.SetEventAction(iFileName, EEventsProcessBreakPoint, EActionContinue);
+		test (err == KErrNone);
+		}
+
+	TUint32	startAddress;
+	TUint32	endAddress;
+
+	/*
+	 * RMDebug_StepTest_Non_PC_Modifying
+	 */
+	test.Next(_L("TestStep - Non-PC modifying\n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_Non_PC_Modifying);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_Non_PC_Modifying_OK);
+
+	err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1)
+		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1, EFalse, processId);
+	test(err==KErrNone);
+
+	/*
+	 * RMDebug_StepTest_Branch
+	 */
+	test.Next(_L("TestStep - Branch\n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_Branch);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_Branch_1);
+
+	err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1)
+		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1, EFalse, processId);
+	test(err==KErrNone);
+
+	/*
+	 * RMDebug_StepTest_Branch_And_Link
+	 */
+	test.Next(_L("TestStep - Branch_And_Link\n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_Branch_And_Link_1);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_Branch_And_Link_2);
+
+	err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1)
+		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1, EFalse, processId);
+	test(err==KErrNone);
+
+	/*
+	 * RMDebug_StepTest_MOV_PC
+	 */
+	test.Next(_L("TestStep - MOV PC,X\n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_MOV_PC_1);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_MOV_PC_2);
+
+	err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1)
+		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1, EFalse, processId);
+	test(err==KErrNone);
+
+	/*
+	 * RMDebug_StepTest_LDR_PC
+	 */
+	test.Next(_L("TestStep - LDR PC\n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_LDR_PC);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_LDR_PC_1);
+
+	err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1)
+		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1, EFalse, processId);
+	test(err==KErrNone);
+
+// thumb and interworking tests are not supported on armv4
+#ifdef __MARM_ARMV5__
+
+	/*
+	 * RMDebug_StepTest_Thumb_Non_PC_Modifying
+	 */
+	test.Next(_L("TestStep - Thumb Non PC-Modifying\n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_Thumb_Non_PC_Modifying_1);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_Thumb_Non_PC_Modifying_2);
+
+	err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1)
+		: HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1, EFalse, processId);
+	test(err==KErrNone);
+
+	/*
+	 * RMDebug_StepTest_Thumb_Branch
+	 */
+	test.Next(_L("TestStep - Thumb Branch\n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_Thumb_Branch_1);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_Thumb_Branch_2);
+
+	err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1)
+		: HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1, EFalse, processId);
+	test(err==KErrNone);
+
+	/*
+	 * RMDebug_StepTest_Thumb_Branch_And_Link
+	 */
+	test.Next(_L("TestStep - Thumb Branch_And_Link\n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_Thumb_Branch_And_Link_2);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_Thumb_Branch_And_Link_3);
+
+	TInt muid=0;
+    test(HAL::Get(HAL::EMachineUid, muid)==KErrNone);
+
+	// check if running on ARMv7 core
+	if(muid==HAL::EMachineUid_OmapH6 || muid==HAL::EMachineUid_OmapZoom || muid==HAL::EMachineUid_EmuBoard)
+        {
+        // Note: ARMv7 treats BL instructions as single 32-bit instructions
+        err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1)
+		: HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1, EFalse, processId);
+        }
+    else
+	    {
+        // Note: Due to the fact that the stepper treats BL instructions
+		// as two instructions (as the hardware does), then we must step
+		// the first half instruction first)
+
+		err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,startAddress+2,EThumbMode,1)
+		: HelpTestStep(iThreadID,startAddress,startAddress+2,EThumbMode,1, EFalse, processId);
+		test(err==KErrNone);
+
+	// Now we actually do the BL
+	err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress+2,endAddress,EThumbMode,1)
+		: HelpTestStep(iThreadID,startAddress+2,endAddress,EThumbMode,1, EFalse, processId);
+        }
+	test(err==KErrNone);
+
+	/*
+	 * RMDebug_StepTest_Thumb_Back_Branch_And_Link
+	 */
+	test.Next(_L("TestStep - Thumb Back_Branch_And_Link\n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_Thumb_Back_Branch_And_Link_2);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_Thumb_Back_Branch_And_Link_3);
+
+	// check if running on ARMv7 core
+	if(muid==HAL::EMachineUid_OmapH6 || muid==HAL::EMachineUid_OmapZoom || muid==HAL::EMachineUid_EmuBoard)
+		{
+		// Note: ARMv7 treats BL instructions as single 32-bit instructions
+		err = aThreadSpecific
+			? HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1)
+			: HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1, EFalse, processId);
+		}
+	else
+		{
+		// Note: Due to the fact that the stepper treats BL instructions
+		// as two instructions (as the hardware does), then we must step
+		// the first half instruction first)
+
+		err = aThreadSpecific
+	   		? HelpTestStep(iThreadID,startAddress,startAddress+2,EThumbMode,1)
+			: HelpTestStep(iThreadID,startAddress,startAddress+2,EThumbMode,1, EFalse, processId);
+		test(err==KErrNone);
+
+	   	// Now we actually do the BL
+		err = aThreadSpecific
+   			? HelpTestStep(iThreadID,startAddress+2,endAddress,EThumbMode,1)
+			: HelpTestStep(iThreadID,startAddress+2,endAddress,EThumbMode,1, EFalse, processId);
+		}
+	test(err==KErrNone);
+
+	/*
+	 * RMDebug_StepTest_Thumb_AddPC
+	 */
+	test.Next(_L("TestStep - Thumb ADD PC, PC, R0\n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_Thumb_AddPC_2);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_Thumb_AddPC_3);
+
+	err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1)
+		: HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1, EFalse, processId);
+	test(err==KErrNone);
+
+	/*
+	 * RMDebug_StepTest_Interwork ARM to Thumb
+	 */
+	test.Next(_L("TestStep - Interworking ARM to Thumb - BLX \n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_Interwork_1);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_Interwork_2);
+
+	err = aThreadSpecific // nb initial breakpoint in ARM code
+		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1)
+		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1, EFalse, processId);
+
+	test(err==KErrNone);
+
+	/*
+	 * RMDebug_StepTest_Interwork Thumb to ARM
+	 */
+	test.Next(_L("TestStep - Interworking Thumb to ARM - BLX\n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_Interwork_2);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_Interwork_3);
+
+	// check if running on ARMv7 core
+	if(muid==HAL::EMachineUid_OmapH6 || muid==HAL::EMachineUid_OmapZoom || muid==HAL::EMachineUid_EmuBoard)
+        {
+        // ARMv7 treats BLX instructions as single 32-bit instructions
+        err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1)
+		: HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1, EFalse, processId);
+        }
+    else
+        {
+    	// Stepper treats this as a two-stage instruction (just like the hardware)
+	err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,startAddress+2,EThumbMode,1)
+		: HelpTestStep(iThreadID,startAddress,startAddress+2,EThumbMode,1, EFalse, processId);
+	test(err == KErrNone);
+
+	err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress+2,endAddress,EThumbMode,1)
+		: HelpTestStep(iThreadID,startAddress+2,endAddress,EThumbMode,1, EFalse, processId);
+        }
+	test(err == KErrNone);
+
+#endif // __MARM_ARMV5__
+
+	/*
+	 * Test multiple-step of ARM code
+	 */
+	test.Next(_L("TestStep - ARM Multiple instruction step\n"));
+
+	startAddress = (TUint32)(&RMDebug_StepTest_ARM_Step_Multiple);
+
+	endAddress = (TUint32)(&RMDebug_StepTest_ARM_Step_Multiple_1);
+
+	err = aThreadSpecific
+		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,5)
+		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,5, EFalse, processId);
+	test(err == KErrNone);
+	// stepping performance
+	test.Next(_L("TestStep - Steps per second\n"));
+
+	// run until we reach RMDebug_StepTest_Count_1
+	TBreakId stepBreakId;
+	startAddress = (TUint32)(&RMDebug_StepTest_Count_1);
+	endAddress = (TUint32)(&RMDebug_StepTest_Count_2);
+
+	err = aThreadSpecific
+		? HelpTestStepSetBreak(stepBreakId,iThreadID,startAddress,EArmMode)
+		: HelpTestStepSetBreak(stepBreakId,iThreadID,startAddress,EArmMode,EFalse,processId);
+	test (err == KErrNone);
+
+	// wait until we hit the breakpoint
+	TEventInfo info;
+	err = HelpTestStepWaitForBreak(iFileName,info);
+	test (err == KErrNone);
+
+	// Now clear the breakpoint
+	err = iServSession.ClearBreak(stepBreakId);
+	test(err == KErrNone);
+
+	if(aThreadSpecific)
+		{
+		// now step the code
+		TInt stepsPerSecond = 0;
+
+		TUint32 stopTickCount = User::NTickCount() + HelpTicksPerSecond();
+
+		while (User::NTickCount() < stopTickCount)
+			{
+			err = iServSession.Step(iThreadID,1);
+			test (err == KErrNone);
+
+			// we need to wait now until the step completes before asking for the next step
+				{
+				TEventInfo info;
+				static TRequestStatus status;
+
+				TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
+
+				iServSession.GetEvent(iFileName,status,infoPtr);
+
+				// Wait for notification of the breakpoint hit event
+				User::WaitForRequest(status);
+				test(status==KErrNone);
+				}
+
+			// Update the count of steps
+			stepsPerSecond += 1;
+
+			// Gone wrong if we do too many
+			test(stepsPerSecond < 10000);
+			}
+
+		iStepsPerSecond = stepsPerSecond;
+		test(iStepsPerSecond != 0);
+		}
+
+	// finally resume the thread
+	err = iServSession.ResumeThread(iThreadID);
+	test (err == KErrNone);
+
+	err = iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionIgnore);
+	test (err == KErrNone);
+
+	if(!aThreadSpecific)
+		{
+		err = iServSession.SetEventAction(iFileName, EEventsProcessBreakPoint, EActionIgnore);
+		test (err == KErrNone);
+		}
+
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-0443
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Tests registration and occurrence of target thread event (in this case panic)
+//! @SYMTestActions     Registers for a panic in the target thread, causes it, and catches the panic notification.
+//!
+//! @SYMTestExpectedResults KErrNone.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+
+void CRunModeAgent::TestEvents()
+	{
+	TInt err = KErrNone;
+
+	test.Next(_L("TestEvents\n"));
+
+	TInt panicReason = 12345;
+
+	test.Printf(_L("Thread t_rmdebug.exe::DebugThread should panic with reason %d.\n"), panicReason);
+
+	//attach non-passively
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+
+	RThread threadToPanic;
+	test(KErrNone == StartDebugThread(threadToPanic, _L("EventsThread")));
+	TThreadId threadToPanicId = threadToPanic.Id();
+	TEventInfo info;
+
+	// Set things up to wait for a thread kill event
+	err = iServSession.SetEventAction(iFileName, EEventsKillThread, EActionContinue);
+	test(err==KErrNone);
+
+	// Wait for an event to occur in this process - nothing should have happened yet.
+	static TRequestStatus status;
+
+	TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
+
+	iServSession.GetEvent(iFileName,status,infoPtr);
+
+	// Test Request cancellation
+	err = iServSession.CancelGetEvent(iFileName);
+	test (err==KErrNone);
+
+	// Again wait for an event to occur in our process - we will provoke the
+	// thread kill event by panic'ing the test thread.
+	iServSession.GetEvent(iFileName,status,infoPtr);
+
+	// Panic the debug thread to cause a thread kill event
+	threadToPanic.Panic(_L("t_rmdebug panic thread test"), panicReason);
+
+	// Wait for notification of the Thread Kill event
+	User::WaitForRequest(status);
+	test(status==KErrNone);
+
+	// Check we are really recieving information about the panic
+	test(info.iProcessIdValid);
+	test(info.iThreadIdValid);
+	test(info.iProcessId==RProcess().Id());
+	test(info.iThreadId==threadToPanicId);
+	test(info.iEventType==EEventsKillThread);
+	test(info.iThreadKillInfo.iExitType==EExitPanic);
+
+	// Ignore other panic events
+	err = iServSession.SetEventAction(iFileName, EEventsKillThread, EActionIgnore);
+	test(err==KErrNone);
+
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-0444
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Tests registration and occurence of target thread events in separate process.
+//! @SYMTestActions     Registers for a hardware exception and kill thread events, and receives them.
+//!
+//! @SYMTestExpectedResults KErrNone.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+void CRunModeAgent::TestEventsForExternalProcess()
+	{
+	test.Next(_L("TestEventsForExternalProcess\n"));
+
+	for(TInt main=0; main<3; main++)
+		{
+		for(TInt extra=0; extra<3; extra++)
+			{
+			TestEventsWithExtraThreads((TKernelEventAction)main, (TKernelEventAction)extra, 0);
+			TestEventsWithExtraThreads((TKernelEventAction)main, (TKernelEventAction)extra, 2);
+			}
+		}
+	}
+
+void CRunModeAgent::TestEventsWithExtraThreads(TKernelEventAction aActionMain, TKernelEventAction aActionExtra, TUint32 aExtraThreads)
+	{
+	const TInt KNumberOfTypes = 8;
+	struct TEventStruct
+		{
+		public:
+		TDebugFunctionType iDebugFunctionType;
+		TEventType iEventType;
+		};
+
+	TEventStruct type[KNumberOfTypes] =
+		{
+			{EStackOverflowFunction, EEventsHwExc},
+			{EUserPanicFunction, EEventsKillThread},
+			{EPrefetchAbortFunction, EEventsHwExc},
+			{EDataAbortFunction, EEventsHwExc},
+			{EUndefInstructionFunction, EEventsHwExc},
+			{EDataReadErrorFunction, EEventsHwExc},
+			{EDataWriteErrorFunction, EEventsHwExc},
+			{EUserExceptionFunction, EEventsSwExc},
+		};
+
+	for(TInt j=0; j<KNumberOfTypes; j++)
+		{
+		if( gUseDelay ) User::After(500000);
+
+		RDebug::Printf("CRunModeAgent::TestEventsWithExtraThreads type: %d, main action: %d, extra action: %d, extraThreads: %d", 
+			j, (TUint32)aActionMain, (TUint32)aActionExtra, aExtraThreads);
+
+		// do this check as it seems to hard to do these cases with the current set up
+		if(EEventsKillThread == type[j].iEventType)
+			{
+			if(EActionSuspend != aActionMain)
+				{
+				if(aActionMain != aActionExtra)
+					{
+					return;
+					}
+				}
+			}
+		// attach to KRMDebugTestApplication
+		test(KErrNone == iServSession.AttachExecutable(KRMDebugTestApplication, EFalse));
+
+		// Set things up to wait for the expected exception in KRMDebugTestApplication
+		test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication, type[j].iEventType, aActionMain));
+
+		if(EActionSuspend != aActionMain)
+			{
+			test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication, EEventsKillThread, aActionExtra));
+			}
+
+		// declare a TRequestStatus object for asynchronous calls
+		TRequestStatus status;
+
+		TEventInfo info;
+		TPtr8 infoBuffer = TPtr8((TUint8*)&info,0,sizeof(TEventInfo));
+		if(EActionIgnore != aActionMain)
+			{
+			iServSession.GetEvent(KRMDebugTestApplication(), status, infoBuffer);
+			}
+
+		// launch the target process to trigger the expected exception
+		RProcess targetProcess;
+		test(KErrNone == LaunchProcess(targetProcess, KRMDebugTestApplication(), type[j].iDebugFunctionType, 0, aExtraThreads));
+		TProcessId processId(targetProcess.Id());
+		targetProcess.Close();
+
+		if(EActionIgnore != aActionMain)
+			{
+			// wait for notification of the exception
+			User::WaitForRequest(status);
+			test(KErrNone == status.Int());
+
+			// check that this is the event we were expecting
+			test(info.iProcessIdValid);
+			test(info.iThreadIdValid);
+			test(info.iProcessId==processId);
+			test(info.iEventType==type[j].iEventType);
+			}
+
+		if(EActionSuspend == aActionMain)
+			{
+			//RDebug::Printf("CRunModeAgent::TestEventsWithExtraThreads EActionSuspend == aActionMain, j=%d", j);
+			// read the thread list, partly to check the call works, and partly to check the thread still exists
+			test(ThreadExistsForProcess(info.iThreadId, info.iProcessId));
+
+			// register to catch all the thread kills which will occur
+			test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication, EEventsKillThread, aActionExtra));
+			// we specified EActionSuspend earlier so need to call resume on this thread
+			test(KErrNone == iServSession.ResumeThread(info.iThreadId));
+			}
+
+		// find out how many threads there are in the process and catch all the thread kill events,
+		// the number of kill thread events should correspond to the number of extra threads launched,
+		// plus one if the main thread panicked with a Sw/Hw exception
+		if(EActionIgnore != aActionExtra)
+			{
+			TInt dyingThreads = aExtraThreads + ( (type[j].iEventType != EEventsKillThread) ? 1 : 0);
+			for(TInt k=0; k<dyingThreads; k++)
+				{
+				//RDebug::Printf("CRunModeAgent::TestEventsWithExtraThreads dyingThreads, k=%d, j=%d", k,j);
+				iServSession.GetEvent(KRMDebugTestApplication(), status, infoBuffer);
+
+				// wait for notification of the kill thread
+				User::WaitForRequest(status);
+				test(KErrNone == status.Int());
+
+				// check that this is the event we were expecting
+				test(info.iProcessIdValid);
+				test(info.iThreadIdValid);
+				test(info.iProcessId==processId);
+				test(info.iEventType==EEventsKillThread);
+				if(EActionSuspend == aActionExtra)
+					{
+					// do some calls to check listings work ok at this stage
+					test(ProcessExists(info.iProcessId));
+					test(ThreadExistsForProcess(info.iThreadId, info.iProcessId));
+					// we specified EActionSuspend earlier so need to call resume on this thread
+					test(KErrNone == iServSession.ResumeThread(info.iThreadId));
+					}
+				}
+			}
+
+		if( gUseDelay ) User::After(500000);
+
+		// reset the thread kill event
+		test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication(), EEventsKillThread, EActionIgnore));
+
+		// reset events for KRMDebugTestApplication
+		test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication(), type[j].iEventType, EActionIgnore));
+
+		// finished debugging KRMDebugTestApplication so detach
+		test(KErrNone == iServSession.DetachExecutable(KRMDebugTestApplication()));
+	
+		// want to validate that the process has really exited, i.e. we're not accidentally keeping a handle to it...
+		TInt waitCount = 10;
+		while((waitCount-- > 0) && ProcessExists(processId))
+			{
+			/* Wait a little while and try again, just in case the process is still being removed.
+			This can happen on a very busy system or when a popup for the events is still active
+			*/
+			RDebug::Printf("CRunModeAgent::TestEventsWithExtraThreads. ProcessExists(id=%d), waiting count exit=%d", 
+				I64LOW(processId), waitCount);
+			User::After(50000);
+			}
+		test(!ProcessExists(processId));
+		}
+	}
+
+// helper function to check whether a thread with id aThreadId exists in the process with id aProcessId
+TBool CRunModeAgent::ThreadExistsForProcess(const TThreadId aThreadId, const TProcessId aProcessId)
+	{
+	RThread lThread;
+	TInt ret = lThread.Open( aThreadId.Id() );
+
+	if( ret != KErrNone )
+		{
+		RDebug::Printf("ThreadExistsForProcess: thread id=%d opening returned %d",
+			I64LOW( aThreadId.Id() ), ret );
+		lThread.Close();
+		return EFalse;
+		}
+
+	RProcess lProcess;
+	ret = lThread.Process( lProcess );
+
+	lThread.Close();
+
+	if( ret != KErrNone )
+		{
+		RDebug::Printf("ThreadExistsForProcess: proc opening returned %d", ret );
+		ret = KErrNotFound;
+		}
+	else if( lProcess.Id() != aProcessId )
+		{
+		RDebug::Printf("ThreadExistsForProcess: lProcess.Id()(%d)!= aProcessId(%d)",
+				I64LOW(lProcess.Id().Id()), I64LOW(aProcessId.Id()));
+		ret = KErrNotFound;
+		}
+
+	lProcess.Close();
+	
+	return ( ret == KErrNone );
+	}
+
+// helper function to check whether a process with id aProcessId exists
+TBool CRunModeAgent::ProcessExists(const TProcessId aProcessId)
+	{
+	TUint32 size;
+	RBuf8 buffer;
+	test(KErrNone == buffer.Create(1024));
+	TInt err = iServSession.GetList(EProcesses, buffer, size);
+	while(KErrTooBig == err)
+		{
+		size*=2;
+		test(size<=47*1024); // 256 TProcessListEntrys is about 46KB. (256 is max num processes)
+		test(KErrNone == buffer.ReAlloc(size));
+		err = iServSession.GetList(EProcesses, buffer, size);
+		}
+	test(KErrNone == err);
+
+	//look through the buffer and check if the target debug thread is there
+	TUint8* ptr = (TUint8*)buffer.Ptr();
+	const TUint8* ptrEnd = ptr + size;
+	while(ptr < ptrEnd)
+		{
+		TProcessListEntry& entry = *(TProcessListEntry*)ptr;
+		if(aProcessId.Id() == entry.iProcessId)
+			{
+			buffer.Close();
+			return ETrue;
+			}
+		ptr += Align4(entry.GetSize());
+		}
+	buffer.Close();
+	return EFalse;
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-0445
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Tests basic debug functions work on demand-paged target threads
+//! @SYMTestActions     Checks it can r/w memory, set breakpoints etc in a demand paged target.
+//!
+//! @SYMTestExpectedResults KErrNone.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+
+void CRunModeAgent::TestDemandPaging(void)
+	{
+	test.Next(_L("TestDemandPaging\n"));
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+	test(KErrNone == iServSession.SuspendThread(iThreadID));
+
+	// get the address of a function in code that will be paged in
+	TUint32 address = (TUint32)(&RMDebugDemandPagingTest);
+	const TUint32 armInstSize = 4;
+
+	// read the memory at &RMDebugDemandPagingTest to check that reading memory in demand paged code works
+	TUint32 demandPagedInst = 0;
+	TPtr8 demandPagedInstBuf((TUint8*)&demandPagedInst, armInstSize);
+	test(KErrNone == iServSession.ReadMemory(iThreadID, address, armInstSize, demandPagedInstBuf, EAccess32, EEndLE8));
+
+	// this is the MOVS instruction that we expect to find in RMDebugDemandPagingTest
+	TUint32 expectedDemandPagedInst = 0xe1b02000;
+
+	// check that the instruction we read is as expected
+	test(demandPagedInst == expectedDemandPagedInst);
+
+	// set event action for break points
+	test(KErrNone == iServSession.SetEventAction(RProcess().FileName(), EEventsBreakPoint, EActionContinue));
+
+	// set an arm breakpoint on RMDebugDemandPagingTest
+	TBreakId armBreakId = 0;
+	test(KErrNone == iServSession.SetBreak(armBreakId, iThreadID, address, EArmMode));
+
+	// Ensure that after setting the breakpoint the memory read returns the correct value
+	TUint32 demandPagedInstWithBreakPoint = 0;
+	TPtr8 spinForeverInstWithBreakPointBuf((TUint8*)&demandPagedInstWithBreakPoint, armInstSize);
+	test(KErrNone == iServSession.ReadMemory(iThreadID, address, armInstSize, spinForeverInstWithBreakPointBuf, EAccess32, EEndLE8));
+	test(demandPagedInst == demandPagedInstWithBreakPoint);
+
+	// switch the target thread to run the demand paging function
+	test(KErrNone == SwitchTestFunction(EDemandPagingFunction));
+
+	// set up event watcher to catch breakpoint being hit in demand paged code
+	TEventInfo info;
+	static TRequestStatus status;
+	TPtr8 infoPtr((TUint8*)&info,sizeof(TEventInfo));
+	iServSession.GetEvent(RProcess().FileName(), status, infoPtr);
+
+	// resume the thread
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+	// wait for notification of the breakpoint hit event
+	User::WaitForRequest(status);
+	test(status==KErrNone);
+
+	// info should now be filled with the details
+	test(info.iProcessIdValid);
+	test(info.iThreadIdValid);
+	test(info.iEventType == EEventsBreakPoint);
+	test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == address);
+
+	// remove the break point and resume the thread
+	test(KErrNone == iServSession.ClearBreak(armBreakId));
+
+	// switch the target thread to run the default function
+	test(KErrNone == SwitchTestFunction(EDefaultFunction));
+
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+
+// Names of some test programs used for testing security
+_LIT(KRMDebugSecurity0FileName,"z:\\sys\\bin\\t_rmdebug_security0.exe"); // Debuggable
+_LIT(KRMDebugSecurity1FileName,"z:\\sys\\bin\\t_rmdebug_security1.exe"); // Not debuggable
+
+#if defined (NO_DEBUGTOKEN) || defined (SOMECAPS_DEBUGTOKEN) || defined(FEWCAPS_DEBUGTOKEN)
+_LIT(KRMDebugSecurity2FileName,"z:\\sys\\bin\\t_rmdebug_security2.exe"); // AllFiles
+#endif
+
+_LIT(KRMDebugSecurity3FileName,"z:\\sys\\bin\\t_rmdebug_security3.exe"); // TCB AllFiles
+
+// include the test header file here
+#include "rm_debug_kerneldriver.h"
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-0446
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Tests Debug Device Driver is locked to the SID of the Debug Security Svr.
+//! @SYMTestActions     Loads rm-debug.ldd and tries to open a handle to it. This should fail.
+//!
+//! @SYMTestExpectedResults KErrPermissionDenied.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+
+void CRunModeAgent::TestDriverSecurity(void)
+	{
+	test.Next(_L("TestDriverSecurity\n"));
+
+	RRM_DebugDriver kernelDriver;
+
+	// Load the debug device driver
+	TInt err = User::LoadLogicalDevice( KDebugDriverFileName );
+	test((KErrNone == err) || (KErrAlreadyExists == err));
+
+	// we were allowed to load the driver, or its already loaded.
+
+	// Try to open a handle to the driver - this should return KErrPermissionDenied as we don't have the DSS SID
+	TRM_DebugDriverInfo driverInfo;
+	driverInfo.iUserLibraryEnd = 0;
+	err = kernelDriver.Open(driverInfo);
+	test((err == KErrInUse) || (err == KErrPermissionDenied));
+
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-0447
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Tests Debug driver can only be access via the DSS. Also tests DSS cannot
+//!						be subverted. Tests functionality of two representative OEM Debug Tokens.
+//! @SYMTestActions     Tries to open rm_debug.ldd (should fail). Tries to debug various processes
+//!						(only debuggable one should succeed). Checks that DSS behaves correctly
+//!						when different versions are passed in to Connect().
+//!
+//! @SYMTestExpectedResults KErrPermissionDenied.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+
+void CRunModeAgent::TestSecurity(void)
+	{
+	// Things to test
+	//
+	// try to use debug driver directly ( should have the wrong UID/SID value!)
+	test.Next(_L("TestSecurity - Bypass Debug Security Server to Debug Device Driver - DSS running\n"));
+
+	// Things to test
+	//
+	// Load the debug device driver
+	RRM_DebugDriver kernelDriver;
+	TInt err = User::LoadLogicalDevice( KDebugDriverFileName );
+	test((KErrNone == err) || (KErrAlreadyExists == err));
+
+	// we were allowed to load the driver, or its already loaded.
+
+	// Try to open handle a to the driver - this should return KErrPermission/KErrInUse as we don't have the DSS SID
+	// and we expect the DSS to already be using it.
+	TRM_DebugDriverInfo driverInfo;
+	driverInfo.iUserLibraryEnd = 0;
+	err = kernelDriver.Open(driverInfo);
+	test(err == KErrInUse);
+
+	// Try requesting an unsupported version of DSS
+	test.Next(_L("TestSecurity - requesting unsupported versions of DSS\n"));
+	RSecuritySvrSession dss;
+	err = dss.Connect(TVersion(999999, 0, 0));
+	test(err == KErrNotSupported); // Prior to DEF142018 this would crash, causing a KErrServerTerminated
+	err = dss.Connect(TVersion(KDebugServMajorVersionNumber, 999999, 0));
+	test(err == KErrNotSupported); // Explicitly asking for a minor version should give KErrNotSupported too if it's newer than what's running.
+	err = dss.Connect(TVersion(KDebugServMajorVersionNumber, 0, 0));
+	test(err == KErrNone); // But the correct major version and no explicit minor version should always succeed
+	dss.Close();
+	
+	//
+	// Attach to the Debug Security Server (passive)
+	//
+	test.Next(_L("TestSecurity - Attach to the Debug Security Server (passive)\n"));
+
+	_LIT(KSecurityServerProcessName, "z:\\sys\\bin\\rm_debug_svr.exe");
+
+	test(KErrPermissionDenied == iServSession.AttachExecutable(KSecurityServerProcessName, ETrue));
+
+	//
+	// Attach to the Debug Security Server (active)
+	//
+	test.Next(_L("TestSecurity - Attach to the Debug Security Server (active)\n"));
+
+	test(KErrPermissionDenied == iServSession.AttachExecutable(KSecurityServerProcessName, EFalse));
+
+	//
+	// Attach to Process 0
+	//
+	// Target: Debuggable
+	//
+	test.Next(_L("TestSecurity - Attach to test process 0\n"));
+
+	// Agent can debug the target app as it is marked debuggable - ie capabilities are ignored)
+	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity0FileName,ETrue);
+
+	//
+	// Attach to Process - 1
+	//
+	// Target: Non-debuggable for ordinary debug agent, debuggable for OEM/OEM2 token authorised agent
+	//
+	// Note: This target app has no PlatSec capabilities
+	//
+	// Agent cannot debug the app unless it has an OEM/OEM2 Debug Token
+
+
+#ifdef NO_DEBUGTOKEN
+	test.Next(_L("TestSecurity NO_DEBUGTOKEN - Attach to test process 1\n"));
+	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity1FileName,EFalse);
+#endif
+
+#ifdef SOMECAPS_DEBUGTOKEN
+	test.Next(_L("TestSecurity SOMECAPS_DEBUGTOKEN - Attach to test process 1\n"));
+	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity1FileName,ETrue);
+#endif
+
+#ifdef FEWCAPS_DEBUGTOKEN
+	test.Next(_L("TestSecurity FEWCAPS_DEBUGTOKEN - Attach to test process 1\n"));
+	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity1FileName,ETrue);
+#endif
+
+	//
+	// Attach to Process - 2
+	//
+	// Target: Non-debuggable for ordinary debug agent, non-debuggable for OEM2 authorised agent (insufficient caps)
+	//
+	// Note: This target app has AllFiles capability
+	//
+	// Agent cannot debug the app unless it has an OEM Debug Token
+
+
+#ifdef NO_DEBUGTOKEN
+	test.Next(_L("TestSecurity NO_DEBUGTOKEN - Attach to test process 2\n"));
+	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity2FileName,EFalse);
+#endif
+
+#ifdef SOMECAPS_DEBUGTOKEN
+	test.Next(_L("TestSecurity SOMECAPS_DEBUGTOKEN - Attach to test process 2\n"));
+	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity2FileName,ETrue);
+#endif
+
+#ifdef FEWCAPS_DEBUGTOKEN
+	test.Next(_L("TestSecurity FEWCAPS_DEBUGTOKEN - Attach to test process 2\n"));
+	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity2FileName,EFalse);
+#endif
+
+	//
+	// Attach to Process - 3
+	//
+	// Target: Non-debuggable for ordinary debug agent, non-debuggable for OEM authorised agent (insufficient caps)
+	//
+	// Note: This target app has AllFiles and TCB and NetworkControl capabilities
+	//
+
+#if  defined (NO_DEBUGTOKEN)  || defined (SOMECAPS_DEBUGTOKEN) || defined (FEWCAPS_DEBUGTOKEN)
+	test.Next(_L("TestSecurity - Attach to test process 3 : Should not be able to debug it\n"));
+	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity3FileName,EFalse);
+#else
+	test.Next(_L("TestSecurity - Attach to test process 3 : Should be able to debug it\n"));
+	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity3FileName,ETrue);
+#endif
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-0543
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Validates that a dll can be built which #include's the rm_debug_api.h header, i.e. rm_debug_api.h contains no static data.
+//! @SYMTestActions     Calls a dummy function in t_rmdebug_dll.dll which implies the dll has been built correctly.
+//!
+//! @SYMTestExpectedResults KErrNone.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+void CRunModeAgent::TestDllUsage(void)
+	{
+	test.Next(_L("TestDllUsage\n"));
+	test(KUidDebugSecurityServer == GetDSSUid());
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-0812
+//! @SYMTestType
+//! @SYMPREQ            PREQ1700
+//! @SYMTestCaseDesc    Writes a known data to the crash flash and validates the data written
+//!						using the read operation and finally erase the data. In the absence
+//!						of an OEM debug token, access to the crash partition should not be allowed
+//! @SYMTestActions     Invoke the flash write method in DSS and call the read method in DSS
+//!						to validate the data is written correctly and then erase the written area
+//!
+//! @SYMTestExpectedResults KErrNone.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+void CRunModeAgent::TestCrashFlash(void)
+	{
+#if  defined (NO_DEBUGTOKEN)  || defined (FEWCAPS_DEBUGTOKEN)
+
+	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-006 Testing We cannot Erase the Crash Flash with insufficient privileges"));
+
+	TUint32 size = 0;
+	TInt err = iServSession.EraseCrashLog(0, 1);
+	test(KErrPermissionDenied == err);
+
+	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-005 Testing We can't Write to the Crash Flash with insufficient privileges"));
+
+	err = iServSession.WriteCrashConfig(0, KCrashDummyData, size);
+	test(KErrPermissionDenied == err);
+	test(size == 0);
+
+	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-008 Testing We can't Read from the Crash Flash with insufficient privileges"));
+
+	TUint32 readSize = 0x10;
+	RBuf8 buf;
+	buf.CleanupClosePushL();
+	err = buf.Create(readSize);
+
+	test(err == KErrNone);
+
+	err = iServSession.ReadCrashLog(0, buf, readSize);
+	test(KErrPermissionDenied == err);
+
+	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-004 Testing Writing To an invalid location"));
+
+	TUint32 writeSize = 0;
+	err = iServSession.WriteCrashConfig(0xFFFFFFFF, KCrashDummyData, writeSize);
+
+	test(err == KErrPermissionDenied);
+
+	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-003 Testing Reading from an invalid location"));
+
+	buf.FillZ();
+	err = iServSession.ReadCrashLog(0, buf, writeSize);
+
+	test(err == KErrPermissionDenied);
+
+	CleanupStack::PopAndDestroy(&buf);
+
+#endif
+
+#ifdef SOMECAPS_DEBUGTOKEN
+
+	TInt err = KErrNone;
+
+	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-007 Testing We can Erase the Crash Flash with sufficient privileges"));
+
+	err = iServSession.EraseCrashLog(0, 1);
+
+	// For platforms where NAND flash is not currently supported we get a KErrNotSupported - this is still a pass
+	if (KErrNotSupported == err)
+		{
+		test.Printf(_L("Nand flash not supported - continue"));
+		return;
+		}
+
+ 	//For platforms without a flash partition we get KErrNotFound - this is still a pass
+ 	if(KErrNotFound == err)
+ 		{
+ 		test.Printf(_L("Platform has no flash partition - continue"));
+ 		return;
+ 		}
+
+	test(KErrNone == err);
+
+	//Read back the start of the block to make sure its 0xFFFFFFFF
+	const TUint numBytesToCheck = 0x80;  //We dont know the block size
+	TBuf8<numBytesToCheck> eraseCheck;
+	eraseCheck.SetLength(numBytesToCheck);
+
+	err = iServSession.ReadCrashLog(0, eraseCheck, numBytesToCheck);
+	test(err == KErrNone);
+
+	TBool dataIsOk = ETrue;
+	for(TUint cnt = 0; cnt < numBytesToCheck; cnt++)
+		{
+		if(eraseCheck[cnt] != 0xFF)
+			{
+			dataIsOk = EFalse;
+			}
+		}
+
+	test(dataIsOk);
+
+	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-002 Testing We can Write to the Crash Flash with sufficient privileges"));
+
+	TUint32 writeSize = 0;
+	err = iServSession.WriteCrashConfig(0, KCrashDummyData, writeSize);
+
+	test(writeSize == KCrashDummyData().Length());
+
+	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-001 Testing We can Read from the Crash Flash with sufficient privileges"));
+
+	RBuf8 buf;
+	buf.CleanupClosePushL();
+	err = buf.Create(writeSize);
+
+	test(err == KErrNone);
+
+	buf.FillZ();
+
+	err = iServSession.ReadCrashLog(0, buf, writeSize);
+
+	test(0 == buf.Compare(KCrashDummyData));
+
+	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-004 Testing Writing To an invalid location"));
+
+	writeSize = 0;
+	err = iServSession.WriteCrashConfig(0xFFFFFFFF, KCrashDummyData, writeSize);
+
+	test(err == KErrArgument);
+
+	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-003 Testing Reading from an invalid location"));
+
+	buf.FillZ();
+	err = iServSession.ReadCrashLog(0xFFFFFFFF, buf, writeSize);
+
+	test(err == KErrArgument);
+
+	CleanupStack::PopAndDestroy(&buf);
+
+#endif
+	}
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-0735
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Tests the Kill Process functionality. Only can kill a debuggable process.
+//! @SYMTestActions     Launches a debuggable and non-debuggable process and tries to kill both.
+//!
+//! @SYMTestExpectedResults KErrNone.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+void CRunModeAgent::TestKillProcess(void)
+	{
+	test.Next(_L("TestKillProcess\n"));
+
+	// Kill a debuggable process
+
+	// check that killing a process is supported
+	TTag tag = GetTag(ETagHeaderIdKillObjects, EFunctionalityKillProcess);
+	test(tag.iValue);
+	// check that killing a thread is not supported
+	tag = GetTag(ETagHeaderIdKillObjects, EFunctionalityKillThread);
+	test(!tag.iValue);
+
+	// attach first!
+	TInt err = iServSession.AttachExecutable(KRMDebugTestApplication, EFalse /* Active */);
+	test(err == KErrNone);
+
+	// first launch a debuggable process
+	RProcess process;
+	err = LaunchProcess(process, KRMDebugTestApplication(),ESpinForever, 0, 0);
+	test (err == KErrNone);
+
+	// try to find the process in the list
+_LIT(KRMDebugAppName, "t_rmdebug_app");
+
+	TBool found = ProcessExists(KRMDebugAppName);
+	test (found);
+
+	TInt processId = process.Id();
+	process.Close();
+
+	// program now running, so try to kill it
+	err = iServSession.KillProcess(processId, 0 /* kill reason */);
+	test(err == KErrNone);
+
+	User::After(2000000);	// should die within two seconds.
+
+	// can we still find it? Should be gone
+	found = ProcessExists(KRMDebugAppName);
+	test (!found);
+
+	// release the program again.
+	err = iServSession.DetachExecutable(KRMDebugTestApplication);
+	test(err == KErrNone);
+
+	// Try to kill a non-debuggable process and fail.
+
+	// first launch a non-debuggable process
+	RProcess process2;
+	err = LaunchProcess(process2, KRMDebugSecurity1FileName(),ESpinForever, 0, 0);
+	test (err == KErrNone);
+
+	// try to find the process in the list
+_LIT(KRMDebugAppName2, "t_rmdebug_security1");
+
+	TBool found2 = ProcessExists(KRMDebugAppName2);
+	test (found2);
+
+	TInt process2Id = process2.Id();
+	process2.Close();
+
+	// program now running, so try to kill it
+	err = iServSession.KillProcess(process2Id, 0 /* kill reason */);
+	test(err == KErrPermissionDenied);
+
+	User::After(2000000);	// should die within two seconds if it is going to die.
+
+	// can we still find it? Should be still around!
+	found2 = ProcessExists(KRMDebugAppName2);
+	test (found2);
+
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-1388
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Tests the correct operation of the AddProcess and Remove Process
+//! @SYMTestActions     1. Registers for AddProcess and Remove Process events
+//!                     2. Starts a test process z:\sys\bin\t_rmdebug_security0.exe
+//!                     3. Wait for the AddProcess event to be reported
+//!                     4. Kill the newly started test process
+//!                     5. Wait for the RemoveProcess event to be reported
+//!                     6. Tell the DSS it is no longer interested in AddProcess and RemoveProcess events
+//!
+//! @SYMTestExpectedResults KErrNone.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+
+void CRunModeAgent::TestAddRemoveProcessEvents()
+	{
+	test.Next(_L("TestAddRemoveProcessEvents\n"));
+
+	// attach to a process (e.g. one of the simple security test programs)
+	// launch the security program
+	// wait for the add event
+	// continue the program.
+	// wait for the remove event
+	// detach process
+
+	test(KErrNone == iServSession.AttachExecutable(KRMDebugSecurity0FileName, EFalse));
+
+	test(KErrNone == iServSession.SetEventAction(KRMDebugSecurity0FileName,EEventsAddProcess, EActionContinue));
+
+	test(KErrNone == iServSession.SetEventAction(KRMDebugSecurity0FileName,EEventsRemoveProcess, EActionContinue));
+
+	// Creator thread ID of the current thread (to be creator of test application)
+	TInt creatorThreadId = RThread().Id();
+
+	RProcess process;
+	TInt err = process.Create(KRMDebugSecurity0FileName, KNullDesC, EOwnerProcess);
+	test (err == KErrNone);
+
+	// Rendezvous with process
+	TRequestStatus status;
+	process.Rendezvous(status);
+
+	// Start the test program
+	process.Resume();
+	User::WaitForRequest(status);
+	test(status==KErrNone);
+
+	// Wait for the addprocess event
+	TEventInfo info;
+	TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
+
+	iServSession.GetEvent(KRMDebugSecurity0FileName,status,infoPtr);
+
+	// Wait for notification of the addprocess hit event
+	User::WaitForRequest(status);
+	test(status==KErrNone);
+
+	// Check this was the right kind of event
+	test(info.iEventType == EEventsAddProcess);
+
+	const TInt uid3offset = 2;
+
+	// Get UID3 for current process
+	TUint32 Uid3 = process.Type()[uid3offset].iUid;
+
+	// Check correct UID3 is returned from the driver
+    test(info.iAddProcessInfo.iUid3 == Uid3);
+
+    // Check correct creator ID for test application is returned from the driver
+    test(info.iAddProcessInfo.iCreatorThreadId == creatorThreadId);
+
+	// Kill the process, as we don't need it anymore
+	process.Kill(KErrNone);
+
+	// Wait for the remove process event
+	iServSession.GetEvent(KRMDebugSecurity0FileName,status,infoPtr);
+
+	// Wait for notification of the remove process hit event
+	User::WaitForRequest(status);
+	test(status==KErrNone);
+
+	// Check this was the right kind of event
+	test(info.iEventType == EEventsRemoveProcess);
+
+	test(KErrNone == iServSession.SetEventAction(KRMDebugSecurity0FileName,EEventsRemoveProcess, EActionIgnore));
+
+	test(KErrNone == iServSession.SetEventAction(KRMDebugSecurity0FileName,EEventsAddProcess, EActionIgnore));
+
+	test(KErrNone == iServSession.DetachExecutable(KRMDebugSecurity0FileName));
+
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-0736
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Checks that process break points can be set, and that they can co-exist alongside thread breakpoints
+//! @SYMTestActions     Checks that process break points can be set, and that they can co-exist alongside thread breakpoints
+//!
+//! @SYMTestExpectedResults KErrNone.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+void CRunModeAgent::TestProcessBreakPoints(void)
+	{
+	test.Next(_L("TestProcessBreakPoints\n"));
+
+	// check that process breakpoints are supported
+	TTag tag = GetTag(ETagHeaderIdBreakpoints, EBreakpointProcess);
+	test(tag.iValue);
+
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+	test(KErrNone == iServSession.SuspendThread(iThreadID));
+
+	// Try to set the breakpoint
+	TBreakId breakId;
+	TUint32 address = (TUint32)(&RMDebug_BranchTst1);
+	RProcess process;
+	TProcessId processId = process.Id();
+	process.Close();
+
+	test(KErrNone == iServSession.SetProcessBreak(breakId, processId, address, EArmMode));
+	test(KErrAlreadyExists == iServSession.SetBreak(breakId, iThreadID, address, EArmMode));
+	test(KErrAlreadyExists == iServSession.SetBreak(breakId, iThreadID, address, EThumbMode));
+	test(KErrAlreadyExists == iServSession.SetProcessBreak(breakId, processId, address, EArmMode));
+	test(KErrAlreadyExists == iServSession.SetProcessBreak(breakId, processId, address, EThumbMode));
+	test(KErrNone == iServSession.ClearBreak(breakId));
+
+	test(KErrNone == iServSession.SetBreak(breakId, iThreadID, address, EArmMode));
+	test(KErrAlreadyExists == iServSession.SetProcessBreak(breakId, processId, address, EArmMode));
+	test(KErrAlreadyExists == iServSession.SetProcessBreak(breakId, processId, address, EThumbMode));
+	test(KErrNone == iServSession.ClearBreak(breakId));
+
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID      KBase-T-RMDEBUG2-1309
+//! @SYMTestType
+//! @SYMPREQ            PREQ1426
+//! @SYMTestCaseDesc    Checks that in the case of multiple low priority events (user traces in this case) we can still receive higher
+//!				priority events should the buffer reach a critical level
+//! @SYMTestActions     Run to first breakpoint in our test code. Then multiple trace events are issued. We should still be able to hit
+//!				the second breakpoint
+//!
+//! @SYMTestExpectedResults KErrNone.
+//! @SYMTestPriority        High
+//! @SYMTestStatus          Implemented
+//----------------------------------------------------------------------------------------------
+
+void CRunModeAgent::TestMultipleTraceEvents(void)
+	{
+	test.Next(_L("TestMultipleTraceEvents\n"));
+
+	//attach to target debug process
+	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
+
+	//set the target thread to execute the trace test function
+	test(KErrNone == SwitchTestFunction(EMultipleTraceCalls, EFalse));
+	
+	
+
+	//register interest in BP's & trace events and trace ignored events
+	test(KErrNone == iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionSuspend));
+	test(KErrNone == iServSession.SetEventAction(iFileName,EEventsUserTrace, EActionContinue));
+	test(KErrNone == iServSession.SetEventAction(iFileName,EEventsUserTracesLost, EActionContinue));
+
+	// Try to set the breakpoints
+	TBreakId armBreakId;
+	TBreakId armBreakId2;
+	TUint32 address = (TUint32)(&RMDebug_BranchTst1);
+	TUint32 address2 = (TUint32)(&RMDebug_StepTest_Non_PC_Modifying);
+
+	test(KErrNone == iServSession.SetBreak(armBreakId,iThreadID,address,EArmMode));
+	test(KErrNone == iServSession.SetBreak(armBreakId2,iThreadID,address2,EArmMode));
+
+	// Continue the thread
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+
+	// wait for the breakpoint to be hit
+	TEventInfo info;
+	static TRequestStatus status;
+
+	TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
+	iServSession.GetEvent(iFileName,status,infoPtr);
+
+	// Wait for notification of the 1st breakpoint hit event
+	User::WaitForRequest(status);
+	test(status==KErrNone);
+
+	// info should now be filled with the details
+	test(info.iEventType == EEventsBreakPoint);
+	test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == address);
+	test(info.iProcessIdValid);
+	test(info.iThreadIdValid);
+
+	// Continue the thread
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+
+	//Now we try to hit the second breakpoint. This will occur after a number of trace calls. If we hit this breakpoint it
+	//means many trace calls are not preventing us hitting breakpoints.
+	iServSession.GetEvent(iFileName,status,infoPtr);
+
+	// Wait for notification of the 2nd breakpoint hit event
+	User::WaitForRequest(status);
+	test(status==KErrNone);
+
+	TBool receivedTracesLost = EFalse;
+
+	while(info.iEventType == EEventsUserTrace || info.iEventType == EEventsUserTracesLost)
+		{
+		//ensure we get told traces are being thrown away - we generate enough to flood the buffer
+		if(info.iEventType == EEventsUserTracesLost)
+			{
+			receivedTracesLost = ETrue;
+
+			// Now stop the target thread from generating trace events
+			test(KErrNone == SwitchTestFunction(EDoNothing, EFalse));
+			break;
+			}
+		else
+			{
+			// Its EEventsUserTrace, so delay us in getting the next event so that it will be more 
+			// likely to get a EEventsUserTracesLost next time. 
+			// This is important on SMP since the platform can process lots of events, and thus
+			// withouth the delay it is difficult for this test to reproduce the abnormal situation of 
+			// lost trace packets
+			User::After(200000);
+			}
+
+		iServSession.GetEvent(iFileName,status,infoPtr);
+
+		// Wait for notification of the 2nd breakpoint hit event
+		User::WaitForRequest(status);
+		test(status==KErrNone);
+		}
+
+	//make sure we got told traces were lost
+	test(receivedTracesLost != EFalse);
+
+	//dont care for breakpoints or trace events no more
+	test(KErrNone == iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionIgnore));
+	test(KErrNone == iServSession.SetEventAction(iFileName,EEventsUserTrace, EActionIgnore));
+	test(KErrNone == iServSession.SetEventAction(iFileName,EEventsUserTracesLost, EActionIgnore));
+
+	//clear the breaks we set
+	test(KErrNone == iServSession.ClearBreak(armBreakId));
+	test(KErrNone == iServSession.ClearBreak(armBreakId2));
+
+	// Continue the thread
+	test(KErrNone == iServSession.ResumeThread(iThreadID));
+
+	//attach to target debug process
+	test(KErrNone == iServSession.DetachExecutable(iFileName));
+
+	}
+
+//----------------------------------------------------------------------------------------------
+//! @SYMTestCaseID KBase-T-RMDEBUG2-2441
+//! @SYMTestType
+//! @SYMPREQ PREQ1426
+//! @SYMTestCaseDesc Test clearing of a process breakpoint once the process has been killed.
+//! @SYMTestActions Creates a new process then tries to set a process breakpoint and then kills the process which should clear the previously set breakpoint. Then repeat the step once again.
+//! @SYMTestExpectedResults KErrNone
+//! @SYMTestPriority High
+//! @SYMTestStatus Implemented
+//----------------------------------------------------------------------------------------------
+
+void CRunModeAgent::TestProcessKillBreakpoint(void)
+	{
+	test.Next(_L("TestProcessKillBreakpoint\n"));
+
+	DoTestProcessKillBreakpoint();
+	// called once again
+	// to check if we can set the breakpoint once again after the process gets killed
+	DoTestProcessKillBreakpoint();
+
+	// And do it a couple more times, there was a leaked process handle that didn't show up
+	// until the third or fourth time this code was run
+	DoTestProcessKillBreakpoint();
+	DoTestProcessKillBreakpoint();
+	}
+
+void CRunModeAgent::DoTestProcessKillBreakpoint()
+	{
+	test.Printf(_L("\nDoTestProcessKillBreakpoint\n"));
+
+	// check that killing a process is supported
+	TTag tag = GetTag(ETagHeaderIdKillObjects, EFunctionalityKillProcess);
+	test(tag.iValue);
+	// check that killing a thread is not supported
+	tag = GetTag(ETagHeaderIdKillObjects, EFunctionalityKillThread);
+	test(!tag.iValue);
+
+	// attach first!
+	test ( KErrNone == iServSession.AttachExecutable(KRMDebugTestApplication, EFalse/*  Active */));
+
+	RProcess processDebug;
+	TThreadId dontCare;
+	LaunchDebugProcessAndSetBreakpoint(processDebug, dontCare);
+
+	// Not interested in breakpoint events any more
+	test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication, EEventsProcessBreakPoint, EActionIgnore));
+
+	// program now running, so try to kill it which should clear all the breakpoints
+	test(KErrNone == iServSession.KillProcess(processDebug.Id(), 0  /* kill reason */ ));
+
+	TRequestStatus stat;
+	processDebug.NotifyDestruction(stat);
+	processDebug.Close();
+	TIMED_WAIT(stat, 1000);
+
+	// release the program again
+	test(KErrNone == iServSession.DetachExecutable(KRMDebugTestApplication));
+	}
+
+void CRunModeAgent::LaunchDebugProcessAndSetBreakpoint(RProcess& aResultProcess, TThreadId& aResultThread)
+	{
+	// define a property to pass on the address from the other process we would try to debug
+	static _LIT_SECURITY_POLICY_PASS(KAllowAllPolicy);
+	TInt err = RProperty::Define(RProcess().SecureId(), EMyPropertyInteger, RProperty::EInt, KAllowAllPolicy, KAllowAllPolicy);
+	test (err == KErrNone || err == KErrAlreadyExists);
+
+	RSemaphore addressGlobSem;
+	//define a global semaphore to synchronise with debuggable process publishing the property
+	err = addressGlobSem.CreateGlobal(_L("RMDebugGlobSem"), 0);
+	test (err == KErrNone);
+
+	// first launch a debuggable process
+	RProcess& processDebug(aResultProcess);
+	test ( KErrNone == LaunchProcess(processDebug, KRMDebugTestApplication(),ESpinForeverWithBreakPoint, 0, 0));
+
+	// try to find the process in the list
+	TBool found = ProcessExists(KRMDebugAppName);
+	test (found);
+
+	//search for the main thread created
+   _LIT(KThreadWildCard, "t_rmdebug_app*");
+	TProcessId processDebugId = processDebug.Id();
+	TThreadId& threadDebugId(aResultThread);
+
+   	TFindThread find(KThreadWildCard);
+	TFullName name;
+	found = EFalse;
+	while(find.Next(name)==KErrNone && !found)
+		{
+		RThread thread;
+		err = thread.Open(find);
+       	if (err == KErrNone)
+			{
+			RProcess process;
+			thread.Process(process);
+			if (((TUint32)process.Id() == processDebugId))
+				{
+				TFullName fullname = thread.FullName();
+				test.Printf(_L("Match Found Name: %S Process id: %ld Thread id: %ld\n"), &fullname, process.Id().Id(), thread.Id().Id());
+				found = ETrue;
+				threadDebugId = thread.Id();
+				}
+			process.Close();
+			}
+		thread.Close();
+   		}
+
+	test (found); //check if we actually found the thread we want to debug
+
+	//waiting on semaphore to be sure that the property is set
+	addressGlobSem.Wait();
+
+	//get the value(property) for the breakpoint address for the process to debug
+	TInt address;
+	test(KErrNone == RProperty::Get(RProcess().SecureId(), EMyPropertyInteger, address));
+
+	test.Printf(_L("Address retrieved to set breakpoint 0x%08x\n"), address);
+
+	//suspend the thread before we set a breakpoint
+	test (KErrNone == iServSession.SuspendThread(threadDebugId));
+
+	//set a process breakpoint
+	TBreakId breakId;
+	test(KErrNone == iServSession.SetProcessBreak(breakId, processDebugId, address, EArmMode));
+
+	test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication, EEventsProcessBreakPoint, EActionContinue));
+
+	//resume the thread now
+	test(KErrNone == iServSession.ResumeThread(threadDebugId));
+
+	// wait for the breakpoint to be hit
+	TRequestStatus status;
+	TEventInfo info;
+	TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
+	iServSession.GetEvent(KRMDebugTestApplication,status,infoPtr);
+	// Wait for notification of the breakpoint hit event
+	TIMED_WAIT(status, 2000);
+	test(status==KErrNone);
+
+	// info should now be filled with the details
+	test(info.iEventType ==  EEventsProcessBreakPoint);
+	test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == address);
+	test(info.iProcessIdValid);
+	test(info.iThreadIdValid);
+
+	addressGlobSem.Close();
+	}
+
+void CRunModeAgent::HelpTestSecurityAttachDetachExecutable(const TDesC& aProcessName, TBool aExpectSuccess)
+	{
+	RProcess process;
+	TInt err = process.Create(aProcessName, KNullDesC, EOwnerProcess);
+	test (err == KErrNone);
+
+	// rendezvous with process
+	TRequestStatus status;
+	process.Rendezvous(status);
+
+	// start the test program
+	process.Resume();
+	User::WaitForRequest(status);
+	test(status==KErrNone);
+
+	// attach to the program (passively)
+	err = iServSession.AttachExecutable(aProcessName, EFalse);
+
+	if( gUseDelay ) User::After(500000);
+
+	// Do we expect to successfully attach
+	if (aExpectSuccess)
+	{
+		// Yes
+		test(KErrNone == err);
+
+		// Now detach again
+		test(KErrNone == iServSession.DetachExecutable(aProcessName));
+		if( gUseDelay ) User::After(500000);
+	}
+	else
+	{
+		// No
+		test(KErrPermissionDenied == err);
+
+		// Just to be sure, try active attachment
+		test(KErrPermissionDenied == iServSession.AttachExecutable(aProcessName, ETrue));
+		if( gUseDelay ) User::After(500000);
+	}
+
+	// Kill the process, as we don't need it anymore
+	process.Kill(KErrNone);
+	if( gUseDelay ) User::After(500000);
+	}
+
+void CRunModeAgent::ReportPerformance(void)
+//
+// Reports performance metrics from all the tests
+//
+	{
+	test.Printf(_L("\nPerformance\n"));
+	test.Printf(_L("========================\n"));
+
+	// Memory
+	test.Printf(_L("Memory read: %d KBytes/sec\n"),iMemoryReadKbytesPerSecond);
+	test.Printf(_L("Memory write: %d KBytes/sec\n"),iMemoryWriteKbytesPerSecond);
+
+	// Registers
+	// to do
+
+	// events
+	// to do
+
+	// Breakpoints
+	test.Printf(_L("Breakpoint set/clear: %d/sec\n"),iBreakpointsPerSecond);
+	test.Printf(_L("Maximum number of breakpoints: %d\n"),iMaxBreakpoints);
+
+	// Stepping
+	test.Printf(_L("Stepping speed: %d/sec\n"),iStepsPerSecond);
+
+	// Runtime
+	TInt ticks = HelpGetTestTicks();
+	test (ticks != 0);
+
+	TInt nkTicksPerSecond = HelpTicksPerSecond();
+	test (nkTicksPerSecond != 0);
+
+	test.Printf(_L("Total test runtime: %d seconds\n"),ticks/nkTicksPerSecond);
+
+	// Final sizes of executables/rom/ram etc
+	// to do
+
+	test.Printf(_L("\n"));
+	}
+
+/**
+ * Helper code for the stepping tests. Sets a breakpoint in a running thread.
+ * It suspends the thread, sets the breakpoint, and resumes the thread.
+ *
+ * @param aBreakId - Reference to a TBreakId which will be set when the breakpoint is set
+ * @param aThreadId - The thread id for which we should set the breakpoint.
+ * @param aBreakAddress - The address to set the breakpoint
+ * @param aMode - The architecture of the breakpoint to be set (ARM/Thumb/Thumb2EE)
+ * @return KErrNone if successful. One of the other system wide error codes otherwise.
+ */
+TInt CRunModeAgent::HelpTestStepSetBreak(TBreakId& aBreakId, TThreadId aThreadId, const TUint32 aBreakAddress, TArchitectureMode aMode, TBool aThreadSpecific, TProcessId aProcessId)
+	{
+	TInt err = KErrNone;
+
+
+	// Set the breakpoint
+	err = aThreadSpecific
+		? iServSession.SetBreak(aBreakId,aThreadId,aBreakAddress,aMode)
+		: iServSession.SetProcessBreak(aBreakId, aProcessId, aBreakAddress, aMode);
+	if (err != KErrNone)
+		{
+		test.Printf(_L("HelpTestStepSetBreak - Failed to set breakpoint\n"));
+		return err;
+		}
+
+	// Continue the thread
+	err = iServSession.ResumeThread(aThreadId);
+	if (err != KErrNone)
+		{
+		test.Printf(_L("HelpTestStepSetBreak - Failed to resume thread\n"));
+		return err;
+		}
+
+	return KErrNone;
+	}
+
+/**
+ * Helper code for the stepping tests. Clears a breakpoint in a running thread.
+ * It suspends the thread, clears the breakpoint, and resumes the thread.
+ *
+ * @param aBreakId - Reference to a TBreakId which will be set when the breakpoint is set
+ * @return KErrNone if successful. One of the other system wide error codes otherwise.
+ */
+TInt CRunModeAgent::HelpTestStepClearBreak(TBreakId aBreakId, const TThreadId aThreadId, TBool aThreadSpecific)
+	{
+	TInt err = KErrNone;
+
+	// Find out what thread id we need to suspend
+	TThreadId threadId;
+	TProcessId processId;
+	TUint32 address;
+	TArchitectureMode mode;
+
+	err = aThreadSpecific
+		? iServSession.BreakInfo(aBreakId, threadId, address, mode)
+		: iServSession.ProcessBreakInfo(aBreakId, processId, address, mode);
+	if (err != KErrNone )
+		{
+		test.Printf(_L("HelpTestStepClearBreak - failed to obtain information for breakpoint\n"));
+		return err;
+		}
+	if(aThreadSpecific && aThreadId != threadId)
+		{
+		test.Printf(_L("HelpTestStepClearBreak - mismatched thread Ids\n"));
+		return KErrGeneral;
+		}
+
+	// Clear the breakpoint
+	err = iServSession.ClearBreak(aBreakId);
+	if (err != KErrNone)
+		{
+		test.Printf(_L("HelpTestStepClearBreak - failed to clear breakpoint\n"));
+		return err;
+		}
+
+	return KErrNone;
+	}
+
+/**
+ * Helper code for the stepping tests. Waits for a previously set breakpoint to be hit.
+ *
+ * @param aProcessName - The name of the process in which the breakpoint is set. E.g. z:\sys\bin\app.exe
+ * @param aEventInfo - The event information block which is filled in when the breakpoint is hit.
+ * @return KErrNone if successful. One of the other system wide error codes otherwise.
+ */
+TInt CRunModeAgent::HelpTestStepWaitForBreak(const TDesC& aProcessName, TEventInfo& aEventInfo)
+	{
+	static TRequestStatus status;
+
+	TPtr8 infoPtr((TUint8*)&aEventInfo,0,sizeof(TEventInfo));
+
+	iServSession.GetEvent(aProcessName,status,infoPtr);
+
+	// Wait for notification of the breakpoint hit event
+	User::WaitForRequest(status);
+	if (status == KErrNone)
+		{
+		return KErrNone;
+		}
+	else
+		{
+		return KErrGeneral;
+		}
+	}
+
+/**
+ * Helper code for the stepping tests. Reads the current target PC for a given thread.
+ *
+ * @param aThreadId - Thread id for which to read the current target PC.
+ * @param aPc - Reference to a TUint32 which will be set to the current target PC.
+ * @return KErrNone if successful. One of the other system wide error codes otherwise.
+ */
+TInt CRunModeAgent::HelpTestStepReadPC(TThreadId aThreadId, TUint32& aPC)
+	{
+	TInt err = KErrNone;
+
+	//create buffer containing PC register ID
+	RBuf8 pcId;
+	err = pcId.Create(sizeof(TRegisterInfo));
+	if (err != KErrNone)
+		{
+		return err;
+		}
+
+	TRegisterInfo reg1 = (TRegisterInfo)0x00000f00;
+	pcId.Append(reinterpret_cast<const TUint8*>(&reg1), sizeof(TRegisterInfo));
+
+	//create buffer containing desired PC value
+	TPtr8 pcValue((TUint8*)&aPC,4,4);
+
+	//create buffer for PC flag value
+	RBuf8 pcFlag;
+	err = pcFlag.Create(sizeof(TUint8));
+
+	//read the new PC value
+	err = iServSession.ReadRegisters(aThreadId, pcId, pcValue, pcFlag);
+	if (err != KErrNone)
+		{
+		//delete temporary buffers
+		pcId.Close();
+		pcFlag.Close();
+		return err;
+		}
+
+	//get the flag and check the PC value was read ok
+	TRegisterFlag flag = ENotSupported;
+	err = GetFlag(pcFlag, 0, flag);
+	if (err != KErrNone)
+		{
+		//delete temporary buffers
+		pcId.Close();
+		pcFlag.Close();
+		return err;
+		}
+
+	if (flag == EValid)
+		{
+		//delete temporary buffers
+		pcId.Close();
+		pcFlag.Close();
+		return KErrNone;
+		}
+	else
+		{
+		//delete temporary buffers
+		pcId.Close();
+		pcFlag.Close();
+		return err;
+		}
+	}
+
+/**
+ * Helper code for the stepping tests. Single steps a given thread from aStartAddress to aEndAddress. Note
+ * that it reaches aStartAddress by setting a breakpoint at that address and waiting until it is hit.
+ *
+ * @param aThreadId - Thread id for which to read the current target PC.
+ * @param aStartAddress - The target address at which stepping will start.
+ * @param aEndAddress - The target address at which stepping will end.
+ * @param aMode - The architecture of the breakpoint which must be set at the start address (ARM/Thumb/Thumb2EE).
+ * @return KErrNone if successful. One of the other system wide error codes otherwise.
+ */
+TInt CRunModeAgent::HelpTestStep(TThreadId aThreadId, TUint32 aStartAddress, TUint32 aEndAddress, TArchitectureMode aMode, TUint aNumSteps, TBool aThreadSpecific, TProcessId aProcessId)
+	{
+	TInt err = KErrNone;
+
+	// Ensure that the supplied addresses are word/half-word aligned as appropriate.
+	if (aMode == EArmMode)
+		{
+		// ARM breakpoints must be word-aligned (2 lsb must be zero)
+		aStartAddress &= 0xFFFFFFFC;
+		aEndAddress &= 0xFFFFFFFC;
+		}
+	else if (aMode == EThumbMode)
+		{
+		// Thumb breakpoints must be half-word aligned (lsb must be zero)
+		aStartAddress &= 0xFFFFFFFE;
+		aEndAddress	 &= 0xFFFFFFFE;
+		}
+	else if (aMode == EThumb2EEMode)
+	{
+		// Thumb2EE breakpoints are not currently supported
+		return KErrNotSupported;
+	}
+
+	// Set breakpoint at the start address
+	TBreakId tempBreakId;
+	TEventInfo info;
+
+	err = HelpTestStepSetBreak(tempBreakId,aThreadId,aStartAddress,aMode,aThreadSpecific,aProcessId);
+	if (err != KErrNone)
+		{
+		test.Printf(_L("HelpTestStep - Failed to set breakpoint at aStartAddress 0x%08x\n"),aStartAddress);
+		return err;
+		}
+
+	// wait for the breakpoint to be hit
+	err = HelpTestStepWaitForBreak(iFileName,info);
+	if (err != KErrNone)
+		{
+		test.Printf(_L("HelpTestStep - Failed to hit the breakpoint at aStartAddress 0x%08x\n"),aStartAddress);
+		return err;
+		}
+
+	// Check the PC == aStartAddress
+	TUint32 pc = 0;
+	err = HelpTestStepReadPC(aThreadId,pc);
+	if (err != KErrNone)
+		{
+		test.Printf(_L("HelpTestStep - Failed to read the PC after hitting breakpoint at aStartAddress 0x%08x\n"),aStartAddress);
+		return err;
+		}
+
+	if (pc != aStartAddress)
+		{
+		test.Printf(_L("HelpTestStep - Incorrect PC value after hitting breakpoint (expected 0x%08x actual 0x%08x)\n"),aStartAddress,pc);
+		return KErrGeneral;
+		}
+
+	err = iServSession.Step(aThreadId,aNumSteps);
+	if (err != KErrNone)
+		{
+		test.Printf(_L("HelpTestStep - Failed to do step from 0x%08x to 0x%08x\n"),aStartAddress,aEndAddress,aNumSteps);
+		return err;
+		}
+
+	// only one 'completed step' event in the buffer.
+	err = HelpTestStepWaitForBreak(iFileName,info);
+	if (err != KErrNone)
+		{
+		test.Printf(_L("HelpTestStep - Could not read breakpoint event info after stepping"));
+		return err;
+		}
+	// end
+
+	// Check PC == aEndAddress
+	err = HelpTestStepReadPC(aThreadId,pc);
+	if (err != KErrNone)
+		{
+		test.Printf(_L("HelpTestStep - failed read the PC after stepping\n"));
+		return err;
+		}
+	if (pc != aEndAddress)
+		{
+		test.Printf(_L("HelpTestStep - Incorrect PC value after stepping (expected 0x%08x actual 0x%08x)\n"),aEndAddress,pc);
+		return KErrGeneral;
+		}
+
+	// Clear the breakpoint
+	err = HelpTestStepClearBreak(tempBreakId, aThreadId, aThreadSpecific);
+	if (err != KErrNone)
+		{
+		test.Printf(_L("HelpTestStep - failed to clear temporary breakpoint\n"));
+		return err;
+		}
+
+	return KErrNone;
+	}
+
+/**
+ * Helper code for the stepping tests. Returns the number of nanokernel ticks in one second.
+ *
+ * @return Number of nanokernel ticks. 0 if unsuccesful.
+ */
+TInt CRunModeAgent::HelpTicksPerSecond(void)
+	{
+	TInt nanokernel_tick_period;
+	HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period);
+
+	ASSERT(nanokernel_tick_period != 0);
+
+	static const TInt KOneMillion = 1000000;
+
+	return KOneMillion/nanokernel_tick_period;
+	}
+
+/**
+  Given aTestNumber runs the appropriate test inside heap markers
+
+  @param aTestNumber test to run, corresponds to an entry in iTestArray
+
+  @panic Panic if aTestNumber is not in valid range
+  */
+void CRunModeAgent::RunTest(TInt aTestNumber)
+	{
+	if( (aTestNumber<0) || (aTestNumber>=KMaxTests) )
+		{
+		User::Panic(_L("Test number out of range"), aTestNumber);
+		}
+	__UHEAP_MARK;
+	(this->*(iTestArray[aTestNumber].iFunctionPtr))();
+	__UHEAP_MARKEND;
+	}
+
+void CRunModeAgent::PrintVersion()
+	{
+	test.Printf(_L("\nt_rmdebug2.exe\nVersion: %S\n"), &(testVersion.Name()));
+	test.Printf(_L("Press any key...\n"));
+	test.Getch();
+	}
+
+void CRunModeAgent::PrintUsage()
+	{
+	test.Printf(_L("Invoke with arguments:\n"));
+	test.Printf(_L("-r: run specified tests in reverse order\n"));
+	test.Printf(_L("-h: display usage information\n"));
+	test.Printf(_L("-v: display version\n"));
+	test.Printf(_L("-d: use delays\n"));
+	test.Printf(_L("<number>: test number to run, can specify more than one from the following list:\n"));
+	test.Printf(_L("Press any key for list...\n"));
+	test.Getch();
+	// if there are too many of these they won't fit on the screen! Stick another Getch() in if there get too many
+	for(TInt i=0; i<KMaxTests; i++)
+		{
+		test.Printf(_L("%2d: %S\n"), i, &(iTestArray[i].iFunctionName));
+		}
+	test.Printf(_L("Press any key...\n"));
+	test.Getch();
+	}
+
+/**
+  Parse the command line, see CRunModeAgent::PrintUsage for syntax
+  */
+void CRunModeAgent::ParseCommandLineL(TUint32& aMode, RArray<TInt>& aTests)
+	{
+	// get the length of the command line arguments
+	TInt argc = User::CommandLineLength();
+
+	// allocate a buffer for the command line arguments and extract the data to it
+	HBufC* commandLine = HBufC::NewLC(argc);
+	TPtr commandLineBuffer = commandLine->Des();
+	User::CommandLine(commandLineBuffer);
+
+	// reset mode
+	aMode = (TTestMode)0;
+
+	// create a lexer and read through the command line
+	TLex lex(*commandLine);
+	while (!lex.Eos())
+		{
+		// expecting the first character to be a '-'
+		if (lex.Get() == '-')
+			{
+			TChar arg = lex.Get();
+			switch (arg)
+				{
+				case 'v':
+					//print out the help
+					aMode |= EModeVersion;
+					break;
+				case 'h':
+					//print out the help
+					aMode |= EModeHelp;
+					break;
+				case 'r':
+					//store the fact that we want to run in reverse
+					aMode |= EModeReverse;
+					break;
+				case 'd':
+					//store the fact that we want to run in reverse
+					gUseDelay = EFalse;
+					RDebug::Printf("Not using delays");
+					break;
+				default:
+					// unknown argument so leave
+					User::Leave(KErrArgument);
+				}
+			}
+		else
+			{
+			lex.UnGet();
+			TInt testNumber;
+			User::LeaveIfError(lex.Val(testNumber));
+			if( (testNumber<0) || (testNumber>=KMaxTests) )
+				{
+				User::Leave(KErrArgument);
+				}
+			aTests.AppendL(testNumber);
+			}
+		lex.SkipSpace();
+		}
+	// if no tests specified then run them all
+	if(aTests.Count() == 0)
+		{
+		aMode |= EModeAll;
+		}
+
+	// do clean up
+	CleanupStack::PopAndDestroy(commandLine);
+	}
+
+void CRunModeAgent::ClientAppL()
+//
+// Performs each test in turn
+//
+	{
+	test.Start(_L("ClientAppL"));
+
+	RArray<TInt> testsToRun;
+	TUint32 testMode = 0;
+	ParseCommandLineL(testMode, testsToRun);
+
+	//if help or version mode specified then just print out the relevant stuff and quit
+	if((testMode & EModeHelp) || (testMode & EModeVersion))
+		{
+		if(testMode & EModeHelp)
+			{
+			PrintUsage();
+			}
+		if(testMode & EModeVersion)
+			{
+			PrintVersion();
+			}
+		test.End();
+		return;
+		}
+
+	if(testMode & EModeAll)
+		{
+		for(TInt i=0; i<KMaxTests; i++)
+			{
+			testsToRun.AppendL(i);
+			}
+		}
+
+	// if EModeReverse specified then reverse the array elements
+	TInt numberOfTests = testsToRun.Count();
+	if(testMode & EModeReverse)
+		{
+		for(TInt i=0; i<(numberOfTests>>1); i++)
+			{
+			TInt temp = testsToRun[i];
+			testsToRun[i] = testsToRun[numberOfTests - (i+1)];
+			testsToRun[numberOfTests - (i+1)] = temp;
+			}
+		}
+
+	__UHEAP_MARK;
+	SetupAndAttachToDSS();
+	__UHEAP_MARKEND;
+
+	HelpStartTestTimer();
+	for(TInt i=0; i<numberOfTests; i++)
+		{
+		RunTest(testsToRun[i]);
+		if( gUseDelay ) User::After(500000);
+		}
+	testsToRun.Close();
+
+	HelpStopTestTimer();
+
+	ReportPerformance();
+
+	test.End();
+	}
+
+/**
+  Fill the test array with pointers to each test.
+  */
+void CRunModeAgent::FillArray()
+	{
+	iTestArray[0].iFunctionPtr = &CRunModeAgent::TestDriverSecurity;
+	iTestArray[0].iFunctionName = _L("TestDriverSecurity");
+	iTestArray[1].iFunctionPtr = &CRunModeAgent::TestDllUsage;
+	iTestArray[1].iFunctionName = _L("TestDllUsage");
+	iTestArray[2].iFunctionPtr = &CRunModeAgent::TestSecurity;
+	iTestArray[2].iFunctionName = _L("TestSecurity");
+	iTestArray[3].iFunctionPtr = &CRunModeAgent::TestAttachExecutable;
+	iTestArray[3].iFunctionName = _L("TestAttachExecutable");
+	iTestArray[4].iFunctionPtr = &CRunModeAgent::TestGetExecutablesList;
+	iTestArray[4].iFunctionName = _L("TestGetExecutablesList");
+	iTestArray[5].iFunctionPtr = &CRunModeAgent::TestGetProcessList;
+	iTestArray[5].iFunctionName = _L("TestGetProcessList");
+	iTestArray[6].iFunctionPtr = &CRunModeAgent::TestGetXipLibrariesList;
+	iTestArray[6].iFunctionName = _L("TestGetXipLibrariesList");
+	iTestArray[7].iFunctionPtr = &CRunModeAgent::TestGetThreadList;
+	iTestArray[7].iFunctionName = _L("TestGetThreadList");
+	iTestArray[8].iFunctionPtr = &CRunModeAgent::TestGetCodeSegsList;
+	iTestArray[8].iFunctionName = _L("TestGetCodeSegsList");
+	iTestArray[9].iFunctionPtr = &CRunModeAgent::TestGetListInvalidData;
+	iTestArray[9].iFunctionName = _L("TestGetListInvalidData");
+	iTestArray[10].iFunctionPtr = &CRunModeAgent::TestMemoryAccess;
+	iTestArray[10].iFunctionName = _L("TestMemoryAccess");
+	iTestArray[11].iFunctionPtr = &CRunModeAgent::TestDebugFunctionality;
+	iTestArray[11].iFunctionName = _L("TestDebugFunctionality");
+	iTestArray[12].iFunctionPtr = &CRunModeAgent::TestSuspendResume;
+	iTestArray[12].iFunctionName = _L("TestSuspendResume");
+	iTestArray[13].iFunctionPtr = &CRunModeAgent::TestBreakPoints;
+	iTestArray[13].iFunctionName = _L("TestBreakPoints");
+	iTestArray[14].iFunctionPtr = &CRunModeAgent::TestModifyBreak;
+	iTestArray[14].iFunctionName = _L("TestModifyBreak");
+	iTestArray[15].iFunctionPtr = &CRunModeAgent::TestBreakInfo;
+	iTestArray[15].iFunctionName = _L("TestBreakInfo");
+	iTestArray[16].iFunctionPtr = &CRunModeAgent::TestRunToBreak;
+	iTestArray[16].iFunctionName = _L("TestRunToBreak");
+	iTestArray[17].iFunctionPtr = &CRunModeAgent::TestBreakPointsInLoop;
+	iTestArray[17].iFunctionName = _L("TestBreakPointsInLoop");
+	iTestArray[18].iFunctionPtr = &CRunModeAgent::TestRegisterAccess;
+	iTestArray[18].iFunctionName = _L("TestRegisterAccess");
+	iTestArray[19].iFunctionPtr = &CRunModeAgent::TestStep;
+	iTestArray[19].iFunctionName = _L("TestStep");
+	iTestArray[20].iFunctionPtr = &CRunModeAgent::TestDemandPaging;
+	iTestArray[20].iFunctionName = _L("TestDemandPaging");
+	iTestArray[21].iFunctionPtr = &CRunModeAgent::TestEventsForExternalProcess;
+	iTestArray[21].iFunctionName = _L("TestEventsForExternalProcess");
+	iTestArray[22].iFunctionPtr = &CRunModeAgent::TestEvents;
+	iTestArray[22].iFunctionName = _L("TestEvents");
+	iTestArray[23].iFunctionPtr = &CRunModeAgent::TestKillProcess;
+	iTestArray[23].iFunctionName = _L("TestKillProcess");
+	iTestArray[24].iFunctionPtr = &CRunModeAgent::TestProcessBreakPoints;
+	iTestArray[24].iFunctionName = _L("TestProcessBreakPoints");
+	iTestArray[25].iFunctionPtr = &CRunModeAgent::TestMultipleTraceEvents;
+	iTestArray[25].iFunctionName = _L("TestMultipleTraceEvents");
+	iTestArray[26].iFunctionPtr = &CRunModeAgent::TestAddRemoveProcessEvents;
+	iTestArray[26].iFunctionName = _L("TestAddRemoveProcessEvents");
+	iTestArray[27].iFunctionPtr = &CRunModeAgent::TestCrashFlash;
+	iTestArray[27].iFunctionName = _L("TestCrashFlash");
+	iTestArray[28].iFunctionPtr = &CRunModeAgent::TestProcessKillBreakpoint;
+	iTestArray[28].iFunctionName = _L("TestProcessKillBreakpoint");
+	iTestArray[29].iFunctionPtr = &CRunModeAgent::TestAttachToAll;
+	iTestArray[29].iFunctionName = _L("TestAttachToAll");
+	iTestArray[30].iFunctionPtr = &CRunModeAgent::TestResumeBreakpointsRepeatedly;
+	iTestArray[30].iFunctionName = _L("TestResumeBreakpointsRepeatedly");
+
+	};
+
+GLDEF_C TInt E32Main()
+//
+// Entry point for run mode debug driver test
+//
+	{
+   TInt ret = KErrNone;
+
+	// client
+	CTrapCleanup* trap = CTrapCleanup::New();
+	if (!trap)
+		return KErrNoMemory;
+   	test.Title();
+   RunModeAgent = CRunModeAgent::NewL();
+   if (RunModeAgent != NULL)
+       {
+        __UHEAP_MARK;
+	    TRAP(ret,RunModeAgent->ClientAppL());
+	    __UHEAP_MARKEND;
+
+	    delete RunModeAgent;
+       }
+
+	delete trap;
+
+	return ret;
+	}
+
+/**
+Helper function to get the aOffset'th value from aFlags
+
+@param aFlags descriptor containing TRegisterFlag type flags
+@param aOffset index of flag value to extract from aFlags
+@param aFlagValue the flag value if function returned successfully
+
+@return KErrNone if value was read successfully, KErrTooBig if aOffset is
+        greater than aFlags.Length()
+*/
+TInt CRunModeAgent::GetFlag(const TDes8& aFlags, const TUint aOffset, TRegisterFlag &aFlagValue) const
+	{
+	//get pointer to data
+	const TUint8 *ptr = aFlags.Ptr();
+
+	//check aOffset is valid
+	TUint length = aFlags.Length();
+	if(aOffset >= length)
+		return KErrTooBig;
+
+	//get flag value
+	aFlagValue = (TRegisterFlag)ptr[aOffset];
+	return KErrNone;
+	}
+
+/**
+  Helper function to set the value of FunctionChooser in the target debug thread.
+
+  @param aTestFunction TTestFunction enum to set FunctionChooser to
+
+  @return KErrNone if the value was set correctly, or one of the other system wide error codes
+  */
+TInt CRunModeAgent::SwitchTestFunction(TTestFunction aTestFunction, const TBool aResume)
+	{
+	//suspend the target thread
+	TInt suspendError = iServSession.SuspendThread(iThreadID);
+	if(! ( (suspendError == KErrNone) || (suspendError == KErrAlreadyExists) ) )
+		{
+		//the thread is not suspended so exit
+		return suspendError;
+		}
+
+	//get the address of FunctionChooser
+	TUint32 functionChooserAddress = (TUint32)&FunctionChooser;
+	//put the new value for FunctionChooser into a descriptor
+	TPtr8 functionBuf((TUint8*)&aTestFunction, sizeof(TTestFunction), sizeof(TTestFunction));
+	//write the new value into the target thread
+	TInt writeError = iServSession.WriteMemory(iThreadID, functionChooserAddress, sizeof(TTestFunction), functionBuf, EAccess32, EEndLE8);
+
+	if( (KErrNone == suspendError) && aResume )
+		{
+		//if this function suspended the target thread then we need to resume it
+		TInt resumeError = iServSession.ResumeThread(iThreadID);
+		if(KErrNone != resumeError)
+			{
+			//resuming failed so return the error
+			return resumeError;
+			}
+		}
+
+	//suspending and resuming was successful so return the error code from the WriteMemory call
+	return writeError;
+	}
+
+/**
+  Launch a separate process to debug.
+
+  @param aProcess the RProcess object to use to create the process
+  @param aFileName file name of the executable to create the process from
+  @param aFunctionType function that the target process should call on execution
+  @param aDelay delay before the new process should call the function represented by aFunctionType
+  @param aExtraThreads number of extra threads to create in the child process
+
+  @return KErrNone on success, or one of the other system wide error codes
+  */
+TInt CRunModeAgent::LaunchProcess(RProcess& aProcess, const TDesC& aFileName, TDebugFunctionType aFunctionType, TUint32 aDelay, TUint32 aExtraThreads)
+	{
+	// at the moment we support two arguments, this number might have to be increased to support arguments
+	const TUint KMaxCommandLineLength = 32;
+
+	// create a command line buffer
+	RBuf commandLine;
+	commandLine.Create(KMaxCommandLineLength);
+
+	// append the command line arguments to the buffer
+	_LIT(KFArg, "-f");
+	commandLine.Append(KFArg());
+	commandLine.AppendNum(aFunctionType);
+
+	_LIT(KSpace, " ");
+	commandLine.Append(KSpace());
+
+	_LIT(KDArg, "-d");
+	commandLine.Append(KDArg());
+	commandLine.AppendNum(aDelay);
+
+	commandLine.Append(KSpace());
+
+	_LIT(KEArg, "-e");
+	commandLine.Append(KEArg());
+	commandLine.AppendNum(aExtraThreads);
+
+	// create the new process, matching on file name only, not specifying uid values
+	TInt err = aProcess.Create(aFileName, commandLine);	// owned by the process
+
+	// check that there was no error raised
+	if(err != KErrNone)
+		{
+		commandLine.Close();
+		return err;
+		}
+
+	TRequestStatus status = KRequestPending;
+	aProcess.Rendezvous(status);
+
+	commandLine.Close();	// after target thread starts
+
+	if(KRequestPending != status.Int())
+		{
+		// startup failed so kill the process
+		aProcess.Kill(KErrNone);
+		return status.Int();
+		}
+	else
+		{
+		// start up succeeded so resume the process
+		aProcess.Resume();
+		User::WaitForRequest(status);
+		if(KErrNone != status.Int())
+			{
+			aProcess.Kill(KErrNone);
+			}
+		return status.Int();
+		}
+	}
+
+/**
+  Helper function to read a tag header from a debug functionality block
+
+  @param aDebugFunctionalityBlock block to read header from
+  @param aTagHdrId header type to find
+
+  @return pointer to the header, or NULL if not available
+  */
+TTagHeader* CRunModeAgent::GetTagHdr(const TDesC8& aDebugFunctionalityBlock, const TTagHeaderId aTagHdrId) const
+	{
+	TUint8* ptr = (TUint8*) aDebugFunctionalityBlock.Ptr();
+	TUint8* blockEnd = ptr + aDebugFunctionalityBlock.Size();
+
+	while(ptr < blockEnd)
+		{
+		TTagHeader* header = (TTagHeader*)ptr;
+		if(header->iTagHdrId == aTagHdrId)
+			{
+			return header;
+			}
+		ptr += sizeof(TTagHeader) + (header->iNumTags * sizeof(TTag));
+		}
+	return NULL;
+	}
+
+/**
+  Helper function to read a tag from a debug functionality block
+
+  @param aTagHdr pointer to a tag header in a debug functionality block
+  @param aElement element to return from the header's data
+
+  @return pointer to the tag, or NULL if not available
+  */
+TTag* CRunModeAgent::GetTag(const TTagHeader* aTagHdr, const TInt aElement) const
+	{
+	TUint8* ptr = (TUint8*)aTagHdr + sizeof(TTagHeader);
+	TUint8* blockEnd = ptr + (aTagHdr->iNumTags * sizeof(TTag));
+
+	while(ptr < blockEnd)
+		{
+		TTag* tag = (TTag*)ptr;
+		if(tag->iTagId == aElement)
+			{
+			return tag;
+			}
+		ptr += sizeof(TTag);
+		}
+	return NULL;
+	}
+
+TTag CRunModeAgent::GetTag(const TTagHeaderId aTagHdrId, const TInt aElement)
+	{
+	TUint32 bufsize = 0;	// Safe default size
+
+	// Get functionality block size
+	test(KErrNone == iServSession.GetDebugFunctionalityBufSize(&bufsize));
+
+	// Ensure we have a finite buffer size
+	test(bufsize!=0);
+
+	// Allocate space for the functionality data
+	HBufC8* dftext = HBufC8::NewLC(bufsize);
+
+	// create an empty TPtr8 refering to dftext
+	TPtr8 dftextPtr(dftext->Des());
+
+	// Get the functionality block
+	test(KErrNone == iServSession.GetDebugFunctionality(dftextPtr));
+
+	// read a value from the data to check it has come through as expected
+	TTagHeader* header = GetTagHdr(dftext->Des(), aTagHdrId);
+	test(header != NULL);
+	TTag* tag = GetTag(header, aElement);
+	test(tag != NULL);
+
+	TTag tagToReturn = *tag;
+
+	// Remove our temporary buffer
+	CleanupStack::PopAndDestroy(dftext);
+
+	return tagToReturn;
+	}
+
+/**
+  Helper function which returns a Boolean indicating with a process with the
+  specified name is currently running.
+
+  @param aProcessName - Name of the process to find
+  @return ETrue if found, EFalse otherwise
+  */
+TBool CRunModeAgent::ProcessExists(const TDesC& aProcessName)
+	{
+	TInt    err=KErrNone;
+	TBool	found = FALSE;
+
+_LIT(KWildCard,"*");
+
+	TFindProcess find(KWildCard);
+	TFullName name;
+	while(find.Next(name)==KErrNone)
+		{
+		RProcess process;
+		err = process.Open(find);
+		if (err == KErrNone)
+			{
+			if (name.Find(aProcessName) != KErrNotFound)
+				{
+					found = TRUE;
+				}
+			process.Close();
+			}
+	   }
+
+	return found;
+	}
+
+TInt PanicFn(TAny*)
+	{
+	User::Panic(_L("trmdebug_dummy"), 123);
+	return 0;
+	}
+
+void CRunModeAgent::TestAttachToAll()
+	{
+	test.Next(_L("TestAttachToAll - Attach\n"));
+
+#ifdef ALLCAPS_DEBUGTOKEN
+	test.Next(_L("---- First AttachAll \n"));
+	test(iServSession.AttachAll() == KErrNone);
+	test.Next(_L("---- Second AttachAll \n"));	
+	test(iServSession.AttachAll() == KErrAlreadyExists); // Don't think an agent should be allowed to AttachToAll more than once
+	
+	test.Next(_L("---- DetachAll\n"));
+	test(iServSession.DetachAll() == KErrNone);
+	test.Next(_L("---- AttachAll again\n"));
+	test(iServSession.AttachAll() == KErrNone);
+	
+	test.Next(_L("---- Suspend thread\n"));
+	test( iServSession.SuspendThread(iThreadID) == KErrNone);
+
+	// Check that AttachAll picks up thread crashes without needing to be explicitly attached
+	test.Next(_L("---- Attach all SetEventAction\n"));
+	TInt err = iServSession.SetEventAction(EEventsKillThread, EActionSuspend);
+	test(err == KErrNone);
+
+	test.Next(_L("---- Create DebugThread2\n"));
+	// Set up the thread
+	RThread threadToPanic;
+	err = threadToPanic.Create(_L("DebugThread2"), &PanicFn, 8192, NULL, NULL);
+	test(err == KErrNone);
+	TRequestStatus undertakerStat;
+	threadToPanic.Logon(undertakerStat);
+	test(undertakerStat.Int() == KRequestPending);
+
+	// Start listening for events
+	TRequestStatus stat;
+	TEventInfo info;
+	TPckg<TEventInfo> infoPkg(info);
+	test.Next(_L("Attach all get event and then resume thread DebugThread2\n"));
+	
+	iServSession.GetEvent(stat, infoPkg);
+	
+	threadToPanic.Resume();
+	
+	test.Printf(_L("Waiting for DebugThread2 panic event to be picked up by AttachToAll\n"));
+	User::WaitForRequest(stat);
+	test(stat.Int() == KErrNone);
+	test(info.iThreadId == threadToPanic.Id());
+	test(info.iEventType == EEventsKillThread);
+	test(info.iThreadKillInfo.iExitType == EExitPanic);
+
+	test(undertakerStat.Int() == KRequestPending); // This shouldn't get completed until after we call iServSession.ResumeThread below
+
+	// Now resume the thread and wait for the Logon to complete
+	test.Next(_L("---- Attach all resume panic thread and then wait for event after DSS has handled it\n"));
+	err = iServSession.ResumeThread(threadToPanic.Id());
+	test(err == KErrNone);
+	User::WaitForRequest(undertakerStat);
+	test(undertakerStat.Int() == 123); // The panic reason set in PanicFn is 123
+
+	// And clean up, 
+	ResetAttachToAll(threadToPanic);
+	//still attached to all
+	
+	// Test that an explicit attach eclipses an AttachAll, and the AttachAll session 
+	// doesn't see the events for specifically attached executables
+	test.Next(_L(" ---- ExplicitAttachBeatsAttachAll\n"));
+
+	// We shouldn't see this event because of sess2
+	err = iServSession.SetEventAction(EEventsStartThread, EActionContinue); 
+	test(err == KErrNone);
+	iServSession.GetEvent(stat, infoPkg);
+	test(stat.Int() == KRequestPending);
+
+	test.Next(_L("---- New sec session\n"));
+	RSecuritySvrSession sess2;
+	test(sess2.Connect(securityServerVersion) == KErrNone);
+	test.Next(_L("---- New sec session Attach executable \n"));
+	test(sess2.AttachExecutable(iFileName, EFalse) == KErrNone);
+	err = sess2.SetEventAction(iFileName, EEventsKillThread, EActionSuspend);
+	test(err == KErrNone);
+	// The EActionSuspend above should trump this EActionContinue
+	err = iServSession.SetEventAction(EEventsKillThread, EActionContinue); 
+	test(err == KErrNone);
+
+	test.Next(_L("---- New sec session create DebugThread3\n"));
+	err = threadToPanic.Create(_L("DebugThread3"), &PanicFn, 8192, NULL, NULL);
+	test(err == KErrNone);
+	
+	// The attach executable above leads the DSS to launch the token, which results 
+	// in a start thread event, and since we have done an attach all and a get event, 
+	// the TReqStat will be completed accordingly for this token start event. 
+	
+	threadToPanic.Logon(undertakerStat);
+	test(undertakerStat.Int() == KRequestPending); 
+
+	TRequestStatus sess2stat;
+	TEventInfo sess2event;
+	TPckg<TEventInfo> sess2eventPkg(sess2event);
+	test.Next(_L("---- New sec session get event, TReqStat\n") );
+	RDebug::Printf(" undertakerStat=0x%x, sess2stat = 0x%x, Pkg=0x%x", 
+			&undertakerStat, &sess2stat, &sess2eventPkg);
+	
+	sess2.GetEvent(iFileName, sess2stat, sess2eventPkg);
+	// sess2 didn't ask for EEventsStartThread so we should still be pending at this point	
+	test(sess2stat == KRequestPending); 
+
+	test.Next(_L("---- New sec session resume thread and wait for kill event\n"));
+	threadToPanic.Resume();
+	User::WaitForRequest(sess2stat);
+
+	test(sess2stat.Int() == KErrNone);
+	test(sess2event.iThreadId == threadToPanic.Id());
+	test(sess2event.iEventType == EEventsKillThread);
+	test(sess2event.iThreadKillInfo.iExitType == EExitPanic);
+
+	// the EActionSuspend that sess2 specified should ensure this doesn't get completed
+	test(undertakerStat == KRequestPending);
+
+	// Now resume the thread and wait for the Logon to complete
+	test.Next(_L("---- ExplicitAttachBeatsAttachAll resume thread 3 after kill\n"));
+	err = sess2.ResumeThread(threadToPanic.Id());
+	test(err == KErrNone);
+	User::WaitForRequest(undertakerStat);
+	test(undertakerStat.Int() == 123); // The panic reason set in PanicFn is 123
+
+	// And clean up
+	ResetAttachToAll(threadToPanic, &stat, &sess2);
+	test.Next(_L("---- Finishing ExplicitAttachBeatsAttachAll > sess2.Close\n"));
+	
+	sess2.Close();
+#if 0
+	//TODO allow this by changing from agent pid to session ids in DSS.
+	// This will allow a client to have more than one session and call attachall
+	
+	// Test that a second AttachAll eclipses the first
+	// Commented out since not sure we require this
+
+	test.Next(_L("SecondAttachAllBeatsAttachAll"));
+	
+	//TODO fix detachall in ResetAttachToAll
+	test(iServSession.AttachAll() == KErrNone);
+	test(sess2.AttachAll() == KErrNone);
+	err = iServSession.SetEventAction(EEventsKillThread, EActionSuspend);
+	test(err == KErrNone);
+	err = sess2.SetEventAction(EEventsKillThread, EActionSuspend);
+	test(err == KErrNone);
+	err = threadToPanic.Create(_L("DebugThread4"), &PanicFn, 8192, NULL, NULL);
+	test(err == KErrNone);
+	iServSession.GetEvent(stat, infoPkg);
+	test(stat.Int() == KRequestPending);
+	sess2.GetEvent(sess2stat, sess2eventPkg);
+	test(sess2stat.Int() == KRequestPending);
+
+	threadToPanic.Resume();
+	User::WaitForRequest(sess2stat);
+	test(sess2event.iThreadId == threadToPanic.Id());
+	test(sess2event.iEventType == EEventsKillThread);
+	test(sess2event.iThreadKillInfo.iExitType == EExitPanic);
+	test(stat.Int() == KRequestPending); // Shouldn't see the killthread event because of sess2
+
+	// And cleanup
+	ResetAttachToAll(threadToPanic, &stat, &sess2);
+	//TODO fixme test(sess2.DetachAll() == KErrNone);
+#endif
+
+#else
+	test(iServSession.AttachAll() == KErrPermissionDenied);
+#endif
+	}
+
+void CRunModeAgent::ResetAttachToAll(RThread& aTestThread, TRequestStatus* aFirstSessionStat, RSecuritySvrSession* aSecondSession)
+	{
+	
+	aTestThread.Close();
+
+	RDebug::Printf("---- ResetAttachToAll : > iServSession.SetEventAction Ignore for Kill and StartThread");
+	TInt err = iServSession.SetEventAction(EEventsKillThread, EActionIgnore);
+	test(err == KErrNone);
+	err = iServSession.SetEventAction(EEventsStartThread, EActionIgnore);
+	test(err == KErrNone);
+
+
+	if (aFirstSessionStat)
+		{
+		RDebug::Printf("---- ResetAttachToAll : > iServSession.CancelGetEvent");
+		iServSession.CancelGetEvent();
+		
+		RDebug::Printf("---- ResetAttachToAll : > User::WaitForRequest(*aFirstSessionStat);");
+		User::WaitForRequest(*aFirstSessionStat);
+		
+		User::After(1000000);
+		RDebug::Printf("---- ResetAttachToAll : > iServSession.DetachAll");
+		test(iServSession.DetachAll() == KErrNone);
+		}
+
+	if (aSecondSession != NULL)
+		{
+		User::After(1000000);
+		RDebug::Printf("---- ResetAttachToAll : > aSecondSession.SetEventAction kill ignore");
+		err = aSecondSession->SetEventAction(iFileName, EEventsKillThread, EActionIgnore);
+		User::After(1000000);
+		test(err == KErrNone);
+		RDebug::Printf("---- ResetAttachToAll : > aSecondSession.SetEventAction start thrd ignore");
+		err = aSecondSession->SetEventAction(iFileName, EEventsStartThread, EActionIgnore);
+		User::After(1000000);
+		test(err == KErrNone);
+		RDebug::Printf("---- ResetAttachToAll : > aSecondSession.DetachExecutable");
+		err = aSecondSession->DetachExecutable(iFileName);
+		User::After(1000000);
+		test( err == KErrNone);
+		}
+	}
+
+void CRunModeAgent::TestResumeBreakpointsRepeatedly()
+	{
+	test.Next(_L("TestResumeBreakpointsRepeatedly\n"));
+	test(iServSession.AttachExecutable(KRMDebugTestApplication, EFalse/*  Active */) == KErrNone);
+
+	RProcess debugProcess;
+	TThreadId debugThreadId;
+	LaunchDebugProcessAndSetBreakpoint(debugProcess, debugThreadId);
+	test(iServSession.ResumeThread(debugThreadId) == KErrNone);
+	
+	// Let the thread die naturally (at least from DSS's point of view)
+	debugProcess.Kill(0);
+	debugProcess.Close();
+
+	test.Printf(_L("Closing iServSession\n"));
+	iServSession.Close();
+	//User::After(1000000); // I hate myself...
+	test(iServSession.Connect(securityServerVersion) == KErrNone);
+	test(iServSession.AttachExecutable(KRMDebugTestApplication, EFalse/*  Active */) == KErrNone);
+
+	test.Printf(_L("Launching process for second time\n"));
+
+	LaunchDebugProcessAndSetBreakpoint(debugProcess, debugThreadId);
+	test(iServSession.ResumeThread(debugThreadId) == KErrNone);
+	debugProcess.Kill(0);
+	debugProcess.Close();
+
+	/*test.Printf(_L("Launching process for third time\n"));
+	debugProcess.Kill(0);
+	debugProcess.Close();
+	iServSession.Close();
+	User::After(1000000); // I hate myself...
+	test(iServSession.Connect(securityServerVersion) == KErrNone);
+	test(iServSession.AttachExecutable(KRMDebugTestApplication, EFalse/ *  Active * /) == KErrNone);
+	*/
+
+	test(KErrNone == iServSession.DetachExecutable(KRMDebugTestApplication));
+	}
+
+void CRunModeAgent::TimedWait(TRequestStatus& aStatus, TInt aTimeoutInMs, TInt aLineNumber)
+	{
+	RTimer timer;
+	TInt err = timer.CreateLocal();
+	test(err == KErrNone);
+
+	TRequestStatus timerstat;
+	timer.After(timerstat, aTimeoutInMs*1000);
+	User::WaitForRequest(aStatus, timerstat);
+	if (timerstat != KRequestPending)
+		{
+		test.Panic(_L("Timed out at line %d\n"), aLineNumber);
+		}
+	else
+		{
+		timer.Cancel();
+		User::WaitForRequest(timerstat);
+		}
+	timer.Close();
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/t_rmdebug2.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,202 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Definitions for the run mode debug tests
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef RMDEBUG_H
+#define RMDEBUG_H
+
+#include "t_rmdebug_app.h"
+#include "r_user_low_memory_security_svr_session.h"
+#include "r_kernel_low_memory_security_svr_session.h"
+
+
+class CRunModeAgent;
+
+// Create a pointer to function type
+typedef void (CRunModeAgent::*testFunction)();
+
+class TFunctionData
+	{
+public:
+	testFunction iFunctionPtr;
+	TBuf<40> iFunctionName;
+	};
+
+//number of test functions that we have
+const TInt KMaxTests = 31; 
+
+//
+// class CRunModeAgent
+//
+// The basic run mode agent.
+//
+class CRunModeAgent : public CBase
+	{
+public:
+	static CRunModeAgent* NewL();
+	~CRunModeAgent();
+	void ClientAppL();
+
+private:
+	CRunModeAgent();
+	void ConstructL();
+	void SetupAndAttachToDSS();
+
+	TInt TestStartup();
+	TInt TestShutdown();
+
+	void TestGetExecutablesList();
+	void TestGetProcessList();
+	void TestGetThreadList();
+	void TestGetCodeSegsList();
+	void TestGetXipLibrariesList();
+	void TestGetListInvalidData();
+
+	TBool DoTestGetThreadList(const TBool aShouldPass, const Debug::TListScope aListScope, const TUint64 aTargetId=0);
+	void DoTestGetCodeSegsList(const TBool aShouldPass, const Debug::TListScope aListScope, const TUint64 aTargetId=0);
+
+	void DoGetList(const Debug::TListId aListId, const Debug::TListScope aListScope, RBuf8& aBuffer, TUint32& aSize, const TUint64 aTargetId=0);
+
+	void TestMemoryAccess();
+	void TestSuspendResume();
+	void TestBreakPoints();
+	void TestConsecutiveBreakPoints();
+	void TestModifyBreak();
+	void DoTestModifyBreak(TBool aThreadSpecific);
+	void TestBreakInfo();
+	void DoTestBreakInfo(TBool aThreadSpecific);
+	void TestRunToBreak();
+	void DoTestRunToBreak(TBool aThreadSpecific);
+	void TestBreakPointsInLoop();
+	void DoTestBreakPointsInLoop(TBool aThreadSpecific);
+	void TestRegisterAccess();
+	void TestAttachExecutable();
+	void TestDebugFunctionality();
+	void TestStep();
+	void DoTestStep(TBool aThreadSpecific);
+	void TestDriverSecurity();
+	void TestSecurity();
+	void TestEvents();
+	void TestEventsForExternalProcess();
+	void TestDemandPaging();
+	void TestTraceSecurity();
+	void TestDllUsage();
+	void TestKillProcess();
+	void TestProcessBreakPoints();
+	void TestMultipleTraceEvents();
+	void TestAddRemoveProcessEvents();
+	void TestProcessKillBreakpoint();
+	void DoTestProcessKillBreakpoint();
+	void TestAttachToAll();
+	void ResetAttachToAll(RThread& aTestThread, TRequestStatus* aFirstSessionStat=NULL, Debug::RSecuritySvrSession* aSecondSession=NULL);
+	void LaunchDebugProcessAndSetBreakpoint(RProcess& aResultProcess, TThreadId& aResultThread);
+	void TestResumeBreakpointsRepeatedly();
+
+	//crash flash test functions
+	void TestCrashFlash();
+		
+	TInt GetFlag(const TDes8 &aFlags, const TUint aOffset, Debug::TRegisterFlag &aFlagValue) const;
+
+	void ReportPerformance(void);
+
+	// helper functions
+	void HelpTestSecurityAttachDetachExecutable(const TDesC& aProcessName, TBool aExpectSuccess);
+
+	TInt HelpTestStepSetBreak(Debug::TBreakId& aBreakId, TThreadId aThreadId, const TUint32 aBreakAddress, Debug::TArchitectureMode aMode, TBool aThreadSpecific=ETrue, TProcessId aProcessId=0);
+	TInt HelpTestStepClearBreak(const Debug::TBreakId aBreakId, const TThreadId aThreadId, TBool aThreadSpecific);
+	TInt HelpTestStepWaitForBreak(const TDesC& aProcessName, Debug::TEventInfo& aEventInfo);
+	TInt HelpTestStepReadPC(TThreadId aThreadId, TUint32& aPC);
+	TInt HelpTestStep(TThreadId aThreadId, TUint32 aStartAddress, TUint32 aEndAddress, Debug::TArchitectureMode aMode, TUint aNumSteps, TBool aThreadSpecific=ETrue, TProcessId=0);
+
+	TInt HelpTicksPerSecond(void);
+
+	// helper functions
+	void HelpStartTestTimer(void) { iStartTick = User::NTickCount(); iStopTick = 0; };
+	void HelpStopTestTimer(void) { iStopTick = User::NTickCount(); };
+	TInt HelpGetTestTicks(void) { return (iStopTick - iStartTick); };
+	TInt SwitchTestFunction(TTestFunction aTestFunction, const TBool aResume = ETrue);
+	TInt LaunchProcess(RProcess& aProcess, const TDesC& aFileName, TDebugFunctionType aFunctionType, TUint32 aDelay=0, TUint32 aExtraThreads=0);
+	Debug::TTagHeader* GetTagHdr(const TDesC8& aDebugFunctionalityBlock, const Debug::TTagHeaderId aTagHdrId) const;
+	Debug::TTag* GetTag(const Debug::TTagHeader* aTagHdr, const TInt aElement) const;
+	Debug::TTag GetTag(const Debug::TTagHeaderId aTagHdrId, const TInt aElement);
+	TBool ProcessExists(const TProcessId aProcessId);
+	TBool ThreadExistsForProcess(const TThreadId aThreadId, const TProcessId aProcessId);
+	TBool ListingSupported(const Debug::TListId aListId, const Debug::TListScope aListScope);
+	void TestEventsWithExtraThreads(Debug::TKernelEventAction aActionMain, Debug::TKernelEventAction aActionExtra, TUint32 aExtraThreads);
+	void FillArray();
+	void PrintUsage();
+	void PrintVersion();
+
+	enum TTestMode 
+		{
+		//run all the tests
+		EModeAll = 1<<0,
+		//run the specified tests in reverse order
+		EModeReverse = 1<<1,
+		//print out help
+		EModeHelp = 1<<2,
+		//print out help
+		EModeVersion = 1<<3
+		};
+
+	void RunTest(TInt aTestNumber);
+	void ParseCommandLineL(TUint32& aMode, RArray<TInt>& aTests);
+
+	TBool ProcessExists(const TDesC& aProcessName);
+	static void TimedWait(TRequestStatus& aStatus, TInt aTimeoutInMs, TInt aLineNumber);
+
+
+private:
+
+	TFunctionData iTestArray[KMaxTests];
+#if defined(KERNEL_OOM_TESTING)
+	RKernelLowMemorySecuritySvrSession iServSession;
+#elif defined (USER_OOM_TESTING)
+	RUserLowMemorySecuritySvrSession iServSession;
+#else
+	Debug::RSecuritySvrSession iServSession;
+#endif
+	RThread	iDebugThread;
+	
+	//Set by test thread, used to check its run state
+	RProperty iRunCountSubscribe;
+	
+	// Used for timeouts when checking the run state
+	RTimer iTimer;
+	
+	RProcess iDSSProcess;
+	TThreadId iThreadID;
+	TFileName iFileName;
+
+	// Performance data
+	TInt iMemoryReadKbytesPerSecond;	
+	TInt iMemoryWriteKbytesPerSecond;	
+	TInt iBreakpointsPerSecond;
+	TInt iMaxBreakpoints;
+	TInt iStepsPerSecond;
+
+	// Timing information
+	TInt iStartTick;
+	TInt iStopTick;
+	};
+
+#endif // RMDEBUG_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/t_rmdebug2_oemtoken.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+// 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 the License "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
+ @internalTechnology
+ @released
+*/
+
+#include <e32base.h>
+#include <e32base_private.h>
+
+GLDEF_C TInt E32Main()
+	{
+	// No need to do anything, the only requirement is that
+	// this executable can be loaded and runs to completion
+	return 0;
+	}
+
+// End of file - t_rmdebug2_oemtoken.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/common/t_debug_logging.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,68 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Logging macros for use in debug subsystem
+// 
+//
+
+#ifndef RMDEBUG_LOGGING_H
+#define RMDEBUG_LOGGING_H
+
+/* Debug messages
+ * 
+ * Debug messages are only generated for debug builds.
+ * 
+ * As user mode use RDebug::Printf(). 
+ * 
+ */
+
+// Uncomment if logging of required
+//#define RMDEBUG_LOGGING 
+
+#ifdef RMDEBUG_LOGGING
+
+   #include <e32debug.h>
+
+    #define LOG_MSG(args...)            RDebug::Printf(args)
+    #define LOG_DES(args...)            RDebug::Print(args) // For wide descriptors
+    #define LOG_ENTRY()                 RDebug::Printf("+%s", __PRETTY_FUNCTION__)
+    #define LOG_EXIT()                  RDebug::Printf("-%s", __PRETTY_FUNCTION__)
+    #define LOG_ARGS(fmt, args...)      RDebug::Printf("+%s " fmt, __PRETTY_FUNCTION__, args)
+    #define LOG_RETURN(x)               RDebug::Printf("Returning %d from [%s]", x, __PRETTY_FUNCTION__)
+
+    // Kept for compatibility
+    #define LOG_MSG2( a, b )            RDebug::Printf( a, b )
+    #define LOG_MSG3( a, b, c )         RDebug::Printf( a, b, c )
+    #define LOG_MSG4( a, b, c, d )      RDebug::Printf( a, b, c, d )
+    #define LOG_MSG5( a, b, c, d, e )   RDebug::Printf( a, b, c, d, e )
+
+#else
+
+   #include <e32debug.h>
+
+    #define LOG_MSG(args...)            
+    #define LOG_DES(args...)           
+    #define LOG_ENTRY()                 
+    #define LOG_EXIT()                 
+    #define LOG_ARGS(fmt, args...)      
+    #define LOG_RETURN(x)               
+
+    // Kept for compatibility
+    #define LOG_MSG2( a, b )            
+    #define LOG_MSG3( a, b, c )         
+    #define LOG_MSG4( a, b, c, d )     
+    #define LOG_MSG5( a, b, c, d, e )  
+
+#endif 
+
+#endif //RMDEBUG_LOGGING
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/common/t_target_launcher.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -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 the License "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:
+// Helper app to launch debug targets. Uses command-line parameters as follows using a + sign:
+//  +n<number of applications to launch>
+//  +m<number of times to launch each application>
+//  +o<order of launch, 1 means launch in reverse order>
+//
+
+#include <e32base.h>
+#include <e32base_private.h>
+#include <e32cons.h>
+#include <e32test.h>
+#include <e32ldr.h>
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include <f32dbg.h>
+#include <f32file.h>
+#include <hal.h>
+#include <u32hal.h>
+#include <e32property.h>
+
+#include "t_target_launcher.h"
+
+
+/**
+  Launch a process
+
+  @param aProcess The RProcess object to use to create the process
+  @param aExeName File name of the executable to create the process from
+  @param aCommandLine The command line to pass to the new process
+  @return KErrNone on success, or one of the other system wide error codes
+  */
+TInt LaunchProcess(RProcess& aProcess, TDesC & aExeName, TPtr & aCommandLine )
+    {
+
+    TPtrC commandLine( aCommandLine );
+
+    TInt err = aProcess.Create( aExeName, commandLine );
+
+    // check that there was no error raised
+    if(err != KErrNone)
+        {
+        return err;
+        }
+
+    TRequestStatus status = KRequestPending;
+    aProcess.Rendezvous(status);
+
+    if(KRequestPending != status.Int())
+        {
+        // startup failed so kill the process
+        RDebug::Printf( "> RProcess Rendezvous() failed with %d. Killing process", status.Int() );
+        aProcess.Kill(KErrNone);
+        return status.Int();
+        }
+    else
+        {
+        // start up succeeded so resume the process
+        aProcess.Resume();
+        User::WaitForRequest(status);
+        if(KErrNone != status.Int())
+            {
+            RDebug::Printf( "> RProcess Resume() failed with %d. Killing process", status.Int() );
+            aProcess.Kill(KErrNone);
+            }
+        return status.Int();
+        }
+    }
+
+/**
+ * Read command line parameters and control the launching of targets. 
+ * Create global launch semaphore KLaunchSemaphoreName
+ */
+void MainL()
+    {
+
+    TInt numApps = KNumApps;
+    TInt numLaunches = KNumLaunches;
+    TInt launchControl = 0;
+
+    TInt argc = User::CommandLineLength();
+    HBufC* commandLine = NULL;
+    RDebug::Printf( ">Launcher Process() argc=%d", argc );
+
+    if( argc )
+        {
+        commandLine = HBufC::NewLC(argc);
+        TPtr commandLineBuffer = commandLine->Des();
+        User::CommandLine(commandLineBuffer);
+
+        RBuf printCommandLine;
+        CleanupClosePushL( printCommandLine );
+        printCommandLine.CreateL( commandLine->Des().Length() );
+        printCommandLine.Copy( commandLine->Des() );
+        printCommandLine.Collapse();
+        RDebug::Printf( ">command line = %S", &printCommandLine );
+        CleanupStack::PopAndDestroy( &printCommandLine );
+
+        // create a lexer and read through the command line
+        TLex lex(*commandLine);
+        while (!lex.Eos())
+            {
+            // only look for options with first character '+', other switches are for the targets
+            if (lex.Get() == '+')
+                {
+                TChar arg = lex.Get();
+                switch (arg)
+                    {
+                    case 'n':
+                        lex.Val( numApps );
+                        RDebug::Printf("parsed numApps as %d", numApps);
+                        break;
+                    case 'm':
+                        lex.Val( numLaunches );
+                        RDebug::Printf("parsed numLaunches as %d", numLaunches );
+                        break;
+                    case 'o':
+                        lex.Val( launchControl );
+                        RDebug::Printf("parsed launchControl as %d", launchControl);
+                        break;
+                    default:
+                        // unknown argument ignore it
+                        break;             
+                    }//switch
+                }// if +
+            }//while
+        }//if argc
+
+   RSemaphore launchSemaphore;
+   TInt ret = KErrNone;
+   CleanupClosePushL( launchSemaphore );
+   ret = launchSemaphore.CreateGlobal( KLaunchSemaphoreName, 0 );
+   RDebug::Printf( ">Target Launcher : RSemaphore.CreateGlobal ret %d", ret);
+   User::LeaveIfError( ret );
+
+   ret = launchSemaphore.OpenGlobal( KLaunchSemaphoreName );
+   RDebug::Printf( ">Target Launcher : RSemaphore.OpenGlobal ret %d", ret);
+   User::LeaveIfError( ret );
+   
+   //Only now indicate to the launcher that we have fully started, so they can find and open the semaphore
+   RProcess::Rendezvous(KErrNone);
+
+   //Now launch the requested number of apps for the requested number of launches
+   for( ; numLaunches > 0; numLaunches-- )
+       { 
+       for( TInt launchIndex = numApps; launchIndex > 0; launchIndex-- )  
+           {
+           RDebug::Printf( ">Target Launcher:  Semaphore wait app %d, launch %d", launchIndex, numLaunches );
+           launchSemaphore.Wait();
+
+           RBuf targetName;
+           CleanupClosePushL( targetName );
+           RDebug::Printf( ">Target Launcher:  targetName.Create %d, launch %d", launchIndex, numLaunches );
+           targetName.Create( KTargetExe().Length() + 2 );
+
+           if( launchControl == 1 )
+               {
+               // Reverse the order of the apps launched by reversing the index in the name
+               RDebug::Printf( ">Target Launcher:  targetName.Format %d, launch %d", numApps - launchIndex + 1, numLaunches );
+               targetName.Format( KTargetExe(), numApps - launchIndex + 1 );
+               }
+           else
+               {
+               RDebug::Printf( ">Target Launcher:  targetName.Format %d, launch %d", launchIndex, numLaunches );
+               targetName.Format( KTargetExe(), launchIndex );
+               }
+
+           RProcess aProc;
+           CleanupClosePushL( aProc ); 
+    
+           RDebug::Printf( ">Target Launcher: LaunchProcess %d, launch %d", launchIndex, numLaunches );
+           RDebug::Printf( ">LaunchProcess %lS", &targetName );
+           TPtr cmdLinePtr( commandLine->Des() );
+           ret = LaunchProcess( aProc, targetName, cmdLinePtr );
+           CleanupStack::PopAndDestroy( &aProc );
+
+           RDebug::Printf( "<Target Launcher: LaunchProcess returned %d", ret );
+           CleanupStack::PopAndDestroy( &targetName );
+
+           User::LeaveIfError( ret );
+
+           //By now the add proc event should have been delivered to the
+           //test app agent.
+           }
+       }
+
+    launchSemaphore.Wait( 500000 );
+
+    CleanupStack::PopAndDestroy( &launchSemaphore );
+
+    if( commandLine )
+       CleanupStack::PopAndDestroy( commandLine );
+ 
+    }
+
+
+GLDEF_C TInt E32Main()
+	{
+	RProcess thisProcess;
+	thisProcess.Rendezvous(KErrNone);
+	RDebug::Printf( ">Launcher Process()" );
+
+	CTrapCleanup* trap = CTrapCleanup::New();
+	if (!trap)
+		return KErrNoMemory;
+
+	TRAPD(err, MainL());
+	RDebug::Printf( "< Target launching returned %d", err);
+	
+	delete trap;
+	
+	return err;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/common/t_target_launcher.h	Tue Aug 31 16:45:49 2010 +0300
@@ -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 the License "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:
+// Definitions for target launcher
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef RMDEBUG_TARGET_LAUNCHER_H
+#define RMDEBUG_TARGET_LAUNCHER_H
+
+// Controls how many times the target applications are launched
+const TInt KNumLaunches = 3;
+
+// Controls how many applications are attached and launched
+// If changing this, need to make sure there are enough apps
+// being built. see KTargetExe and t_rmdebug_app*
+const TInt KNumApps = 4;  
+
+_LIT(KLaunchSemaphoreName, "t_rmdebug_launch_semaphore");
+_LIT(KLaunchSemaphoreNameSearchString, "t_rmdebug_launch_semaphore*");
+_LIT(KTargetExe,"z:\\sys\\bin\\t_rmdebug_app%d.exe");
+_LIT8(KTargetExeName,"t_rmdebug_app%d.exe");
+_LIT(KProcessFinder,"*t_rmdebug_app%d*");
+_LIT(KTargetOptions,"-f%d");
+
+_LIT(KZSysBin,"z:\\sys\\bin\\");
+
+_LIT(KLauncherExe,"t_rmdebug_target_launcher.exe");
+
+_LIT_SECURITY_POLICY_PASS(KAllowAllPolicy);
+
+#endif // RMDEBUG_TARGET_LAUNCHER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_demand_paging.cia	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,57 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// 
+//
+
+
+#include <u32std.h>
+
+// unused function that contains enough padding that the test function
+// RMDebugDemandPagingTest starts in a new page.
+__NAKED__ TInt RMDebugDemandPagingPaddingBefore()
+	{
+	asm("movs       r2,r0");
+	asm("adds       r0,r2,r1");
+	asm("bx         lr");
+	// add padding to make this function 4kb in size.
+	// The 4084 corresponds to 2^12 (=4096) - 12,
+	// the 12 being the total size of the movs, adds and bx instructions.
+	asm(".space     4084");
+	}
+
+// test function which is in a page by itself
+__NAKED__ TInt RMDebugDemandPagingTest()
+	{
+	asm("movs       r2,r0");
+	asm("adds       r0,r2,r1");
+	asm("bx         lr");
+	// add padding to make this function 4kb in size.
+	// The 4084 corresponds to 2^12 (=4096) - 12,
+	// the 12 being the total size of the movs, adds and bx instructions.
+	asm(".space     4084");
+	}
+
+// unused function that contains enough padding to ensure that no used code
+// is in the same page as RMDebugDemandPagingTest
+__NAKED__ TInt RMDebugDemandPagingPaddingAfter()
+	{
+	asm("movs       r2,r0");
+	asm("adds       r0,r2,r1");
+	asm("bx         lr");
+	// add padding to make this function 4kb in size.
+	// The 4084 corresponds to 2^12 (=4096) - 12,
+	// the 12 being the total size of the movs, adds and bx instructions.
+	asm(".space     4084");
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_demand_paging.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,22 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// definitions of functions in d_demand_paging.cia
+//
+
+#ifndef D_DEMAND_PAGING_H
+#define D_DEMAND_PAGING_H
+
+TInt RMDebugDemandPagingTest();
+
+#endif // D_DEMAND_PAGING_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebug_bkpt_test.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,28 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+//
+
+// definitions of functions in d_rmdebug_bkpt_test.s
+
+#ifndef D_RMDEBUG_BKPT_TESTS_H
+#define D_RMDEBUG_BKPT_TESTS_H
+
+extern "C"
+{
+	// Breakpoints in loop test
+	unsigned int RMDebug_Bkpt_Test_Entry(void);
+	unsigned int RMDebug_Bkpt_Test_Loop_Break_1(void);
+	unsigned int RMDebug_Bkpt_Test_Loop_Break_2(void);
+}
+#endif // D_RMDEBUG_BKPT_TESTS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebug_bkpt_test.s	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,52 @@
+; Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+; All rights reserved.
+; This component and the accompanying materials are made available
+; under the terms of the License "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 |d-rmdebug-bkpt$$Code|, CODE, READONLY, ALIGN=6
+
+	CODE32
+
+;
+; Breakpoints in loop test
+; 
+; This function initialises some variables and then performs some basic operations 
+; within the for loop. This allows us to set multiple breakpoints within the loop 
+; to test and see whether they are being hit. 
+;
+
+	EXPORT RMDebug_Bkpt_Test_Entry
+	EXPORT RMDebug_Bkpt_Test_Loop_Break_1
+	EXPORT RMDebug_Bkpt_Test_Loop_Break_2
+	
+RMDebug_Bkpt_Test_Entry
+    mov r2,#10
+    mov r0,#20    
+    mov r3,#0
+    mov r1,#1
+    b COMPARE
+LOOP      
+    add r3,r2,r0   
+RMDebug_Bkpt_Test_Loop_Break_1    
+    mov r2,r0
+RMDebug_Bkpt_Test_Loop_Break_2  
+    mov r0,r3 
+    add r1,r1,#1
+COMPARE
+    cmp r1,#30
+    ble LOOP 
+    bx lr
+ 
+	END
+
+; End of file - d_rmdebug_bkpt_test.s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebug_step_test.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,81 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// 
+// definitions of functions in d_rmdebug_step_tests.s
+//
+
+#ifndef D_RMDEBUG_STEP_TESTS_H
+#define D_RMDEBUG_STEP_TESTS_H
+
+extern "C"
+{
+	// ARM tests
+	unsigned int RMDebug_StepTest_Non_PC_Modifying(void);
+	unsigned int RMDebug_StepTest_Non_PC_Modifying_OK(void);
+	
+	unsigned int RMDebug_StepTest_Branch(void);
+	unsigned int RMDebug_StepTest_Branch_1(void);
+
+	unsigned int RMDebug_StepTest_Branch_And_Link(void);
+	unsigned int RMDebug_StepTest_Branch_And_Link_1(void);
+	unsigned int RMDebug_StepTest_Branch_And_Link_2(void);
+	
+	unsigned int RMDebug_StepTest_MOV_PC(void);
+	unsigned int RMDebug_StepTest_MOV_PC_1(void);
+	unsigned int RMDebug_StepTest_MOV_PC_2(void);
+	
+	unsigned int RMDebug_StepTest_LDR_PC(void);
+	unsigned int RMDebug_StepTest_LDR_PC_1(void);
+
+	// Thumb tests
+	unsigned int RMDebug_StepTest_Thumb_Non_PC_Modifying(void);
+	unsigned int RMDebug_StepTest_Thumb_Non_PC_Modifying_1(void);
+	unsigned int RMDebug_StepTest_Thumb_Non_PC_Modifying_2(void);
+
+	unsigned int RMDebug_StepTest_Thumb_Branch(void);
+	unsigned int RMDebug_StepTest_Thumb_Branch_1(void);
+	unsigned int RMDebug_StepTest_Thumb_Branch_2(void);
+	
+	unsigned int RMDebug_StepTest_Thumb_Branch_And_Link(void);
+	unsigned int RMDebug_StepTest_Thumb_Branch_And_Link_1(void);
+	unsigned int RMDebug_StepTest_Thumb_Branch_And_Link_2(void);
+	unsigned int RMDebug_StepTest_Thumb_Branch_And_Link_3(void);
+
+	unsigned int RMDebug_StepTest_Thumb_Back_Branch_And_Link(void);
+	unsigned int RMDebug_StepTest_Thumb_Back_Branch_And_Link_1(void);
+	unsigned int RMDebug_StepTest_Thumb_Back_Branch_And_Link_2(void);
+	unsigned int RMDebug_StepTest_Thumb_Back_Branch_And_Link_3(void);
+
+	unsigned int RMDebug_StepTest_Thumb_AddPC(void);
+	unsigned int RMDebug_StepTest_Thumb_AddPC_1(void);
+	unsigned int RMDebug_StepTest_Thumb_AddPC_2(void);
+	unsigned int RMDebug_StepTest_Thumb_AddPC_3(void);
+
+	// ARM<->Thumb interworking tests
+	unsigned int RMDebug_StepTest_Interwork(void);
+	unsigned int RMDebug_StepTest_Interwork_1(void);
+	unsigned int RMDebug_StepTest_Interwork_2(void);
+	unsigned int RMDebug_StepTest_Interwork_3(void);
+
+	// Stepping performance test
+	unsigned int RMDebug_StepTest_Count(void);
+	unsigned int RMDebug_StepTest_Count_1(void);
+	unsigned int RMDebug_StepTest_Count_2(void);
+
+	// Multiple step test
+	unsigned int RMDebug_StepTest_ARM_Step_Multiple(void);
+	unsigned int RMDebug_StepTest_ARM_Step_Multiple_1(void);
+
+}
+#endif // D_RMDEBUG_STEP_TESTS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebug_step_test.s	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,268 @@
+; Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+; All rights reserved.
+; This component and the accompanying materials are made available
+; under the terms of the License "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 |d-rmdebug-step$$Code|, CODE, READONLY, ALIGN=6
+
+	CODE32
+
+	; ARM tests
+	
+; 
+; Non-PC modifying
+;
+	EXPORT RMDebug_StepTest_Non_PC_Modifying
+	EXPORT RMDebug_StepTest_Non_PC_Modifying_OK
+ 
+RMDebug_StepTest_Non_PC_Modifying
+	mov		r0,r0		; nop
+RMDebug_StepTest_Non_PC_Modifying_OK
+	bx		lr			; should return to normal execution of the test thread
+
+;
+; Branch
+;
+	EXPORT RMDebug_StepTest_Branch
+	EXPORT RMDebug_StepTest_Branch_1
+
+RMDebug_StepTest_Branch
+	b		RMDebug_StepTest_Branch_1		
+	mov		r0, #2		; if the pc ends up here, we know its gone wrong
+RMDebug_StepTest_Branch_1
+	bx		lr			; return
+
+;
+; Branch and Link
+;
+	EXPORT RMDebug_StepTest_Branch_And_Link
+	EXPORT RMDebug_StepTest_Branch_And_Link_1
+	EXPORT RMDebug_StepTest_Branch_And_Link_2
+
+RMDebug_StepTest_Branch_And_Link		
+	mov		r0, lr		; preserve lr for the moment
+RMDebug_StepTest_Branch_And_Link_1
+	bl		RMDebug_StepTest_Branch_And_Link_2
+	mov		r1, #1		; insert a gap in the instruction stream so we know we branched.
+RMDebug_StepTest_Branch_And_Link_2
+	mov		lr, r0		; restore lr			
+	bx		lr			; should return to normal execution of the test thread
+
+;
+; MOV PC
+;
+	EXPORT RMDebug_StepTest_MOV_PC
+	EXPORT RMDebug_StepTest_MOV_PC_1
+	EXPORT RMDebug_StepTest_MOV_PC_2
+
+RMDebug_StepTest_MOV_PC
+	mov		r0, #4
+RMDebug_StepTest_MOV_PC_1
+	add		pc, pc, r0	; should be a jump (bear in mind reading pc = current inst + 8bytes for arm)
+	mov		r0, #1		; Simple instructions which allow us to test where the PC really is
+	mov		r0, #2		; just by reading r0.
+RMDebug_StepTest_MOV_PC_2
+	mov		r0, #3		; 
+	mov		r0, #4		; 
+	bx		lr			; should return to normal execution of the test thread
+
+; 
+; LDR PC
+;
+	EXPORT RMDebug_StepTest_LDR_PC
+	EXPORT RMDebug_StepTest_LDR_PC_1
+
+RMDebug_StepTest_LDR_PC
+	ldr		pc, =RMDebug_StepTest_LDR_PC_1
+	mov		r0, #1		;  separate the branch target so we can prove it works
+RMDebug_StepTest_LDR_PC_1
+	bx		lr			; should return to normal execution of the test thread
+	
+;
+; ARM -> Thumb -> ARM interworking test
+;
+; Note: We always start and finish this test
+; in ARM mode.
+	EXPORT RMDebug_StepTest_Interwork
+	EXPORT RMDebug_StepTest_Interwork_1
+	EXPORT RMDebug_StepTest_Interwork_2
+	EXPORT RMDebug_StepTest_Interwork_3	
+RMDebug_StepTest_Interwork
+	mov		r0, lr	; preserve lr
+RMDebug_StepTest_Interwork_1
+	blx		RMDebug_StepTest_Interwork_2
+
+	CODE16
+RMDebug_StepTest_Interwork_2
+	blx		RMDebug_StepTest_Interwork_3
+
+	CODE32
+
+RMDebug_StepTest_Interwork_3
+	bx		r0
+
+;
+; Stepping performance tests
+;
+; This counts down from 100000 to 0
+; This means that for all practical purposes
+; we can single-step as much as we like
+; in less than one second and have some likelyhood
+; that we will not step too far from our loop
+
+	EXPORT RMDebug_StepTest_Count
+	EXPORT RMDebug_StepTest_Count_1
+	EXPORT RMDebug_StepTest_Count_2
+
+RMDebug_StepTest_Count
+	ldr		r2, =100000
+RMDebug_StepTest_Count_1
+	subs	r2, r2, #1
+RMDebug_StepTest_Count_2
+	bne		RMDebug_StepTest_Count_1
+	bx		lr
+
+; Thumb tests
+
+; Thumb non-pc modifying
+;
+;
+RMDebug_StepTest_Thumb_Non_PC_Modifying
+	mov		r0, lr	; preserve lr
+	blx		RMDebug_StepTest_Thumb_Non_PC_Modifying_1
+	bx		r0
+
+;
+; Thumb Branch
+;
+RMDebug_StepTest_Thumb_Branch
+	mov		r0, lr	; preserve lr
+	blx		RMDebug_StepTest_Thumb_Branch_1
+	bx		r0		
+
+;
+; Thumb Branch and link
+;
+RMDebug_StepTest_Thumb_Branch_And_Link
+	mov		r0, lr	; preserve lr
+	blx		RMDebug_StepTest_Thumb_Branch_And_Link_1
+	bx		r0 
+
+;
+; Thumb Back Branch and link
+;
+RMDebug_StepTest_Thumb_Back_Branch_And_Link
+	mov		r0, lr	; preserve lr
+	blx		RMDebug_StepTest_Thumb_Back_Branch_And_Link_1
+	bx		r0 
+
+;
+; Thumb ADD PC,PC, #0
+;
+RMDebug_StepTest_Thumb_AddPC
+	mov		r0, lr	; preserve lr
+	blx		RMDebug_StepTest_Thumb_AddPC_1
+	bx		r0 
+
+	CODE16
+
+	; Thumb tests
+	EXPORT RMDebug_StepTest_Thumb_Non_PC_Modifying
+	EXPORT RMDebug_StepTest_Thumb_Non_PC_Modifying_1
+	EXPORT RMDebug_StepTest_Thumb_Non_PC_Modifying_2
+
+	EXPORT RMDebug_StepTest_Thumb_Branch
+	EXPORT RMDebug_StepTest_Thumb_Branch_1
+	EXPORT RMDebug_StepTest_Thumb_Branch_2
+
+	EXPORT RMDebug_StepTest_Thumb_Branch_And_Link
+	EXPORT RMDebug_StepTest_Thumb_Branch_And_Link_1
+	EXPORT RMDebug_StepTest_Thumb_Branch_And_Link_2
+	EXPORT RMDebug_StepTest_Thumb_Branch_And_Link_3
+
+	EXPORT RMDebug_StepTest_Thumb_Back_Branch_And_Link
+	EXPORT RMDebug_StepTest_Thumb_Back_Branch_And_Link_1
+	EXPORT RMDebug_StepTest_Thumb_Back_Branch_And_Link_2
+	EXPORT RMDebug_StepTest_Thumb_Back_Branch_And_Link_3
+
+RMDebug_StepTest_Thumb_Non_PC_Modifying_1
+	mov		r0, r0	; nop
+RMDebug_StepTest_Thumb_Non_PC_Modifying_2
+	bx		lr	
+
+RMDebug_StepTest_Thumb_Branch_1
+	b		RMDebug_StepTest_Thumb_Branch_2
+	mov		r0, r0
+RMDebug_StepTest_Thumb_Branch_2
+	bx		lr
+
+RMDebug_StepTest_Thumb_Branch_And_Link_1
+	mov		r1, lr
+RMDebug_StepTest_Thumb_Branch_And_Link_2
+	bl		RMDebug_StepTest_Thumb_Branch_And_Link_3
+	mov		r0, r0
+RMDebug_StepTest_Thumb_Branch_And_Link_3
+	bx		r1
+
+RMDebug_StepTest_Thumb_Back_Branch_And_Link_3
+	bx		r1
+
+RMDebug_StepTest_Thumb_Back_Branch_And_Link_1
+	mov		r1, lr
+RMDebug_StepTest_Thumb_Back_Branch_And_Link_2
+	bl		RMDebug_StepTest_Thumb_Back_Branch_And_Link_3
+	bx		r1
+
+;
+; ADD PC
+;
+	EXPORT RMDebug_StepTest_Thumb_AddPC
+	EXPORT RMDebug_StepTest_Thumb_AddPC_1
+	EXPORT RMDebug_StepTest_Thumb_AddPC_2
+	EXPORT RMDebug_StepTest_Thumb_AddPC_3
+
+RMDebug_StepTest_Thumb_AddPC_1
+	mov		r1, lr
+	mov		r2, #4
+RMDebug_StepTest_Thumb_AddPC_2
+	add		pc, pc, r2	; should arrive at RMDebug_StepTest_Thumb_AddPC_3
+	mov		r0, r0
+	mov		r0, r0
+	mov		r0, r0
+RMDebug_StepTest_Thumb_AddPC_3
+	bx		r1
+
+	ALIGN 4
+
+	CODE32
+
+;
+; ARM multiple-step ( 5 steps )
+;
+	EXPORT RMDebug_StepTest_ARM_Step_Multiple
+	EXPORT RMDebug_StepTest_ARM_Step_Multiple_1
+
+RMDebug_StepTest_ARM_Step_Multiple
+	mov		r0,r0		; nop
+	mov		r0,r0		; nop
+	mov		r0,r0		; nop
+	mov		r0,r0		; nop
+	mov		r0,r0		; nop
+RMDebug_StepTest_ARM_Step_Multiple_1
+	bx		lr
+
+	END
+
+; End of file - d_rmdebug_step_test.s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebug_step_test_armv4.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,50 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// definitions of functions in d_rmdebug_step_tests_armv4.s
+//
+
+#ifndef D_RMDEBUG_STEP_TESTS_H
+#define D_RMDEBUG_STEP_TESTS_H
+
+extern "C"
+{
+	// ARM tests
+	unsigned int RMDebug_StepTest_Non_PC_Modifying(void);
+	unsigned int RMDebug_StepTest_Non_PC_Modifying_OK(void);
+	
+	unsigned int RMDebug_StepTest_Branch(void);
+	unsigned int RMDebug_StepTest_Branch_1(void);
+
+	unsigned int RMDebug_StepTest_Branch_And_Link(void);
+	unsigned int RMDebug_StepTest_Branch_And_Link_1(void);
+	unsigned int RMDebug_StepTest_Branch_And_Link_2(void);
+	
+	unsigned int RMDebug_StepTest_MOV_PC(void);
+	unsigned int RMDebug_StepTest_MOV_PC_1(void);
+	unsigned int RMDebug_StepTest_MOV_PC_2(void);
+	
+	unsigned int RMDebug_StepTest_LDR_PC(void);
+	unsigned int RMDebug_StepTest_LDR_PC_1(void);
+
+	// Stepping performance test
+	unsigned int RMDebug_StepTest_Count(void);
+	unsigned int RMDebug_StepTest_Count_1(void);
+	unsigned int RMDebug_StepTest_Count_2(void);
+
+	// Multiple step test
+	unsigned int RMDebug_StepTest_ARM_Step_Multiple(void);
+	unsigned int RMDebug_StepTest_ARM_Step_Multiple_1(void);
+
+}
+#endif // D_RMDEBUG_STEP_TESTS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebug_step_test_armv4.s	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,130 @@
+; Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+; All rights reserved.
+; This component and the accompanying materials are made available
+; under the terms of the License "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 |d-rmdebug-bkpt$$Code|, CODE, READONLY, ALIGN=6
+
+	CODE32
+
+	; ARM tests
+	
+; 
+; Non-PC modifying
+;
+	EXPORT RMDebug_StepTest_Non_PC_Modifying
+	EXPORT RMDebug_StepTest_Non_PC_Modifying_OK
+ 
+RMDebug_StepTest_Non_PC_Modifying
+	mov		r0,r0		; nop
+RMDebug_StepTest_Non_PC_Modifying_OK
+	bx		lr			; should return to normal execution of the test thread
+
+;
+; Branch
+;
+	EXPORT RMDebug_StepTest_Branch
+	EXPORT RMDebug_StepTest_Branch_1
+
+RMDebug_StepTest_Branch
+	b		RMDebug_StepTest_Branch_1		
+	mov		r0, #2		; if the pc ends up here, we know its gone wrong
+RMDebug_StepTest_Branch_1
+	bx		lr			; return
+
+;
+; Branch and Link
+;
+	EXPORT RMDebug_StepTest_Branch_And_Link
+	EXPORT RMDebug_StepTest_Branch_And_Link_1
+	EXPORT RMDebug_StepTest_Branch_And_Link_2
+
+RMDebug_StepTest_Branch_And_Link		
+	mov		r0, lr		; preserve lr for the moment
+RMDebug_StepTest_Branch_And_Link_1
+	bl		RMDebug_StepTest_Branch_And_Link_2
+	mov		r1, #1		; insert a gap in the instruction stream so we know we branched.
+RMDebug_StepTest_Branch_And_Link_2
+	mov		lr, r0		; restore lr			
+	bx		lr			; should return to normal execution of the test thread
+
+;
+; MOV PC
+;
+	EXPORT RMDebug_StepTest_MOV_PC
+	EXPORT RMDebug_StepTest_MOV_PC_1
+	EXPORT RMDebug_StepTest_MOV_PC_2
+
+RMDebug_StepTest_MOV_PC
+	mov		r0, #4
+RMDebug_StepTest_MOV_PC_1
+	add		pc, pc, r0	; should be a jump (bear in mind reading pc = current inst + 8bytes for arm)
+	mov		r0, #1		; Simple instructions which allow us to test where the PC really is
+	mov		r0, #2		; just by reading r0.
+RMDebug_StepTest_MOV_PC_2
+	mov		r0, #3		; 
+	mov		r0, #4		; 
+	bx		lr			; should return to normal execution of the test thread
+
+; 
+; LDR PC
+;
+	EXPORT RMDebug_StepTest_LDR_PC
+	EXPORT RMDebug_StepTest_LDR_PC_1
+
+RMDebug_StepTest_LDR_PC
+	ldr		pc, =RMDebug_StepTest_LDR_PC_1
+	mov		r0, #1		;  separate the branch target so we can prove it works
+RMDebug_StepTest_LDR_PC_1
+	bx		lr			; should return to normal execution of the test thread
+	
+;
+; Stepping performance tests
+;
+; This counts down from 100000 to 0
+; This means that for all practical purposes
+; we can single-step as much as we like
+; in less than one second and have some likelyhood
+; that we will not step too far from our loop
+
+	EXPORT RMDebug_StepTest_Count
+	EXPORT RMDebug_StepTest_Count_1
+	EXPORT RMDebug_StepTest_Count_2
+
+RMDebug_StepTest_Count
+	ldr		r2, =100000
+RMDebug_StepTest_Count_1
+	subs	r2, r2, #1
+RMDebug_StepTest_Count_2
+	bne		RMDebug_StepTest_Count_1
+	bx		lr
+
+;
+; ARM multiple-step ( 5 steps )
+;
+	EXPORT RMDebug_StepTest_ARM_Step_Multiple
+	EXPORT RMDebug_StepTest_ARM_Step_Multiple_1
+
+RMDebug_StepTest_ARM_Step_Multiple
+	mov		r0,r0		; nop
+	mov		r0,r0		; nop
+	mov		r0,r0		; nop
+	mov		r0,r0		; nop
+	mov		r0,r0		; nop
+RMDebug_StepTest_ARM_Step_Multiple_1
+	bx		lr
+
+	END
+
+; End of file - d_rmdebug_step_test_armv4.s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebugthread.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,106 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Implements a debug thread for testing.
+// 
+//
+
+#include <e32base.h>
+#include <e32base_private.h>
+#include <e32cons.h>
+#include "d_rmdebugthread.h"
+
+EXPORT_C TBuf8<SYMBIAN_RMDBG_MEMORYSIZE> gMemoryAccessBytes;
+extern void RMDebug_BranchTst1();
+
+EXPORT_C TInt TestData;
+
+CDebugServThread::CDebugServThread()
+//
+// Empty constructor
+//
+	{
+	}
+
+GLDEF_C TInt CDebugServThread::ThreadFunction(TAny*)
+//
+// Generic thread function for testing
+//
+	{
+	CTrapCleanup* cleanup=CTrapCleanup::New();
+	if (cleanup == NULL)
+		{
+		User::Leave(KErrNoMemory);
+		}
+
+	RThread::Rendezvous(KErrNone);
+
+	TestData = 1;
+
+	while(1)
+		{
+		RMDebug_BranchTst1();
+
+		TestData++;                   
+
+		// Wait half a second (suspends this thread)
+		User::After(500000);
+
+		if (TestData == 0xFFFFFFFF)
+			{
+			break;
+			}
+		}
+
+	delete cleanup;
+
+	return (KErrNone);
+	}
+
+EXPORT_C TInt StartDebugThread(RThread& aDebugThread)
+//
+// Starts the test thread
+//
+{
+	TInt res=KErrNone;
+
+	// Create the thread
+	res = aDebugThread.Create(	KDebugThreadName,
+								CDebugServThread::ThreadFunction,
+								KDefaultStackSize,
+								KDebugThreadDefaultHeapSize,
+								KDebugThreadDefaultHeapSize,
+								NULL
+								);
+
+	// Check that the creation worked
+	if (res == KErrNone)
+		{
+		TRequestStatus rendezvousStatus;
+
+		aDebugThread.SetPriority(EPriorityNormal);
+		// Make a request for a rendezvous
+		aDebugThread.Rendezvous(rendezvousStatus);
+		// Set the thread as ready for execution
+		aDebugThread.Resume();
+		// Wait for the resumption
+		User::WaitForRequest(rendezvousStatus);
+		}                                 
+	else
+		{
+		// Close the handle.
+		aDebugThread.Close();
+		}
+
+	return res;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebugthread.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,38 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// t_rmdebugthread.h
+// Definitions for the run mode debug test thread.
+// 
+//
+
+#ifndef RMDEBUGSVRTHRD_H
+#define RMDEBUGSVRTHRD_H
+
+#define SYMBIAN_RMDBG_MEMORYSIZE    1024*4
+
+// Thread name
+_LIT(KDebugThreadName,"DebugThread");
+
+const TUint KDebugThreadDefaultHeapSize=0x10000;
+
+class CDebugServThread : public CBase
+	{
+	public:
+		CDebugServThread();
+		static TInt ThreadFunction(TAny* aStarted);    
+
+	public:
+	};
+
+#endif // RMDEBUGSVRTHRD_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebugthread2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,318 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Implements a debug thread for testing.
+// 
+//
+
+#include <e32base.h>
+#include <e32base_private.h>
+#include <e32cons.h>
+#include <e32debug.h>
+#include "d_rmdebugthread2.h"
+
+#include "d_rmdebug_step_test.h"
+#include "d_rmdebug_bkpt_test.h"
+#include "d_demand_paging.h"
+
+TBuf8<SYMBIAN_RMDBG_MEMORYSIZE> gMemoryAccessBytes;
+IMPORT_C extern void RMDebug_BranchTst1();
+IMPORT_C extern TInt RMDebugDemandPagingTest();
+
+TInt TestData;
+TTestFunction FunctionChooser;
+
+const TInt 	KNumberOfTraceCalls = 50;
+
+EXPORT_C TInt TestFunction()
+	{
+	// Set TestData to an arbitrary value that can be checked by a tester
+	TestData = 0xffeeddcc;
+	RMDebug_BranchTst1();
+	
+	// Code here may not be executed because tests can change the PC value
+	// at any time, typically once the test passes
+	return 0;
+	}
+
+/**
+  Wrapper around RMDebugDemandPagingTest, need to pause for a short time to
+  allow time in t_rmdebug.cpp to issue a User::WaitForRequest to catch the break point
+  */
+EXPORT_C void TestPagedCode()
+	{
+	User::After(100000);
+
+	// call the function in paged code
+	RMDebugDemandPagingTest();
+	}
+
+EXPORT_C void TestMultipleTraceCalls()
+	{
+	//arbitrary function to set a BP on
+	RMDebug_BranchTst1();
+
+	// The tester will change FunctionChooser once it gets what it needs out of the test
+	for(TInt cnt = KNumberOfTraceCalls; cnt>0 && (FunctionChooser==EMultipleTraceCalls); cnt--)
+		{
+		RDebug::Printf("T");
+		RDebug::Printf("R");
+		RDebug::Printf("A");
+		RDebug::Printf("C");
+		RDebug::Printf("E");
+		}
+	
+	//another arbitrary function to set a BP on
+	RMDebug_StepTest_Non_PC_Modifying();
+	}
+
+CDebugServThread::~CDebugServThread()
+    {
+    }
+
+CDebugServThread::CDebugServThread()
+//
+// Empty constructor
+//
+	{
+	}
+
+
+/**
+ * Check that the RProperty argument does not change within the given amount of time.
+ * If the property does change, the error KErrInUse is returned.
+ * 
+ */
+EXPORT_C TInt TestRunCountSame( RProperty & aProperty, RTimer & aTimer, TTimeIntervalMicroSeconds32 aTimeOut )
+    {
+    TRequestStatus propertyStatus;
+    TRequestStatus timerStatus;
+    TInt propertyValueBefore = 0;
+    TInt propertyValueAfter = 0;
+
+    aProperty.Subscribe( propertyStatus );
+    aProperty.Get( propertyValueBefore );
+    aTimer.After( timerStatus, aTimeOut );
+
+    User::WaitForRequest( propertyStatus, timerStatus );
+    if (propertyStatus != KRequestPending)
+        {
+        RDebug::Printf(" CDebugServThread::TestRunCountSame: Property has been set. Returning KErrInUse");
+        aTimer.Cancel();
+        // Wait for the KErrCancel
+        User::WaitForRequest( timerStatus );
+        return KErrInUse;
+        }
+
+    aProperty.Cancel();
+    //This will wait for the KErrCancel to be issued by the property.
+    User::WaitForRequest( propertyStatus );
+    
+    aProperty.Get( propertyValueAfter );
+    if( propertyValueAfter != propertyValueBefore )
+        {
+        RDebug::Printf(" CDebugServThread::TestRunCountSame: Change in property value. Returning KErrInUse");
+        return KErrInUse;
+        }
+        
+    return KErrNone;
+    }
+
+
+/**
+ * Check that the RProperty argument changes within the given amount of time.
+ * If the property does not change, the error KErrTimedOut is returned.
+ * If the values before and after are the same, the error KErrNotReady is returned
+ */
+EXPORT_C TInt WaitForRunCountChange( RProperty & aProperty, RTimer & aTimer, TTimeIntervalMicroSeconds32 aTimeOut )
+    {
+    TRequestStatus propertyStatus;
+    TRequestStatus timerStatus;
+    TInt propertyValueBefore = 0;
+    TInt propertyValueAfter = 0;
+    
+    aProperty.Get( propertyValueBefore );
+    aProperty.Subscribe( propertyStatus );
+
+    aTimer.After( timerStatus, aTimeOut );
+
+    User::WaitForRequest( propertyStatus, timerStatus );
+    if (timerStatus != KRequestPending)
+        {
+        RDebug::Printf(" CDebugServThread::WaitForRunCountChange: timeout. Returning KErrTimedOut");
+        aProperty.Cancel();
+        // Wait for the KErrCancel
+        User::WaitForRequest( propertyStatus );
+        return KErrTimedOut;
+        }
+    
+    aTimer.Cancel();
+    //This will wait for the KErrCancel to be issued by the timer.
+    User::WaitForRequest( timerStatus );
+    
+    aProperty.Get( propertyValueAfter );
+    if( propertyValueAfter == propertyValueBefore )
+        {
+        RDebug::Printf(" CDebugServThread::WaitForRunCountChange: No change in property value. Returning KErrNotReady");
+        return KErrNotReady;
+        }
+        
+    return KErrNone;
+    }
+
+GLDEF_C TInt CDebugServThread::ThreadFunction(TAny*)
+//
+// Generic thread function for testing
+//
+	{
+	// set FunctionChooser to run the default function
+	FunctionChooser = EDefaultFunction;
+
+	CTrapCleanup* cleanup=CTrapCleanup::New();
+	if (cleanup == NULL)
+		{
+		User::Leave(KErrNoMemory);
+		}
+    
+	TInt err = RProperty::Define( RProcess().SecureId(), ERMDBGRunCountProperty, RProperty::EInt );
+    if( (err != KErrAlreadyExists) && (err != KErrNone) )
+        {
+        RDebug::Printf("CDebugServThread::ThreadFunction - unable to create 'ERunCount' property. err:%d", err);
+        }
+    
+	RThread::Rendezvous(KErrNone);
+
+	TestData = 1;
+
+	/* Beware of adding printf or other debug-generating events in this loop because
+	* they interfere with the tests
+	*/
+	while(TestData != 0xFFFFFFFF)
+		{
+        //iRunCountPublish.Set( TestData );
+        RProperty::Set( RProcess().SecureId(), ERMDBGRunCountProperty, TestData );
+        
+		switch(FunctionChooser)
+			{
+			case EDemandPagingFunction:
+				TestPagedCode();
+				break;
+			case EDefaultFunction:
+				// the default function is the stepping test functions
+			case EStepFunction:
+				{
+				RMDebug_BranchTst1();
+
+				// Single stepping test support code
+
+				// ARM tests
+				RMDebug_StepTest_Non_PC_Modifying();
+
+				RMDebug_StepTest_Branch();
+
+				RMDebug_StepTest_Branch_And_Link();
+
+				RMDebug_StepTest_MOV_PC();
+
+				RMDebug_StepTest_LDR_PC();
+ 
+// thumb/interworking tests not supported on armv4
+#ifdef __MARM_ARMV5__
+
+				// Thumb tests
+				RMDebug_StepTest_Thumb_Non_PC_Modifying();
+
+				RMDebug_StepTest_Thumb_Branch();
+
+				RMDebug_StepTest_Thumb_Branch_And_Link();
+
+				RMDebug_StepTest_Thumb_Back_Branch_And_Link();
+
+				// ARM <-> Thumb interworking tests
+				RMDebug_StepTest_Interwork();
+
+				RMDebug_StepTest_Thumb_AddPC();
+
+#endif	// __MARM_ARMV5__
+				
+				// Single-stepping performance
+				RMDebug_StepTest_Count();
+
+				// multiple step test
+				RMDebug_StepTest_ARM_Step_Multiple();
+
+				// Breakpoints in loop test
+				RMDebug_Bkpt_Test_Entry();
+
+				TestData++;
+				
+				RDebug::Printf("** TestData=%d", TestData) ;
+
+				// Wait 50mSecs. // (suspends this thread)
+				User::After(50000);
+
+				break;
+				}
+			case EMultipleTraceCalls:
+				TestMultipleTraceCalls();
+				break;
+			default:
+				//do nothing
+				break;
+			}
+		}
+
+	RProperty::Delete( RProcess().SecureId(), ERMDBGRunCountProperty );
+	        
+	delete cleanup;
+
+	return (KErrNone);
+	}
+
+EXPORT_C TInt StartDebugThread(RThread& aDebugThread, const TDesC& aDebugThreadName)
+//
+// Starts a test thread
+//
+{
+	TInt res=KErrNone;
+
+	// Create the thread
+	res = aDebugThread.Create(	aDebugThreadName,
+								CDebugServThread::ThreadFunction,
+								KDefaultStackSize,
+								KDebugThreadDefaultHeapSize,
+								KDebugThreadDefaultHeapSize,
+								NULL
+								);
+
+	// Check that the creation worked
+	if (res == KErrNone)
+		{
+		TRequestStatus rendezvousStatus;
+
+		aDebugThread.SetPriority(EPriorityNormal);
+		// Make a request for a rendezvous
+		aDebugThread.Rendezvous(rendezvousStatus);
+		// Set the thread as ready for execution
+		aDebugThread.Resume();
+		// Wait for the resumption
+		User::WaitForRequest(rendezvousStatus);
+		}                                 
+	else
+		{
+		// Close the handle.
+		aDebugThread.Close();
+		}
+	        
+	return res;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebugthread2.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,71 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Definitions for the run mode debug test thread.
+// 
+//
+
+#ifndef RMDEBUGSVRTHRD_H
+#define RMDEBUGSVRTHRD_H
+
+#include <e32property.h>
+
+#define SYMBIAN_RMDBG_MEMORYSIZE    1024*4
+
+// Thread name
+_LIT(KDebugThreadName,"DebugThread");
+
+
+IMPORT_C TInt TestRunCountSame( 
+            RProperty & aProperty, 
+            RTimer & aTimer, 
+            TTimeIntervalMicroSeconds32 aTimeOut = 500000 );
+
+
+IMPORT_C TInt WaitForRunCountChange( 
+            RProperty & aProperty, 
+            RTimer & aTimer, 
+            TTimeIntervalMicroSeconds32 aTimeOut = 500000 );
+
+const TUint KDebugThreadDefaultHeapSize=0x10000;
+
+// enumeration of functions which the target debug thread can call, the
+// debugger can choose to switch the thread to a different function by
+// writing the appropriate enumeration value into FunctionChooser, the
+// target thread will finish executing the function it is currently running
+// then execute the chosen function.
+enum TTestFunction
+	{
+	EDefaultFunction = 0,
+	EStepFunction = 1,
+	EDemandPagingFunction = 2,
+	EMultipleTraceCalls = 3,
+	EDoNothing = 4
+	};
+
+class CDebugServThread : public CBase
+	{
+	public:
+		CDebugServThread();
+		~CDebugServThread();
+		static TInt ThreadFunction(TAny* aStarted);    
+		
+
+	//Enums for all the properties used by this class
+	enum TRMDebugProperties 
+            { 
+            ERMDBGRunCountProperty = 3
+            };
+	};
+
+#endif // RMDEBUGSVRTHRD_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebugthreadasm.cia	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// d_rmdebugthreadasm.h
+// Assembler file for debug thread testing.
+// 
+//
+
+//#include <e32cia.h>
+//#include <e32base.h>
+//#include <e32cons.h>
+//#include "d_rmdebugthread.h"
+
+EXPORT_C __NAKED__ void RMDebug_BranchTst1( void )
+//
+// 
+//
+{
+	asm("mov r0, #0 ");			// aResult==KErrNone
+	asm("bx  lr ");             // Return
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/d_rmdebugthreadasm2.cia	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,35 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// d_rmdebugthreadasm2.h
+// Assembler file for debug thread testing.
+// 
+//
+
+EXPORT_C __NAKED__ void RMDebug_BranchTst1( void )
+//
+// 
+//
+{
+	asm("mov r0, #0 ");			// aResult==KErrNone
+	asm("bx  lr ");             // Return
+}
+
+EXPORT_C __NAKED__ void RMDebug_BranchTst2( void )
+//
+// 
+//
+{
+	asm("mov r0, #0 ");			// aResult==KErrNone
+	asm("bx  lr ");             // Return
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/t_rmdebug_app.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,415 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+//
+
+#include <e32base.h>
+#include <e32base_private.h>
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include <e32debug.h>
+#include <e32property.h> 
+#include <u32hal.h>
+#include <hal.h>
+#include <f32file.h>
+#include <e32svr.h>
+#include <e32const.h>
+
+
+#include "t_rmdebug_app.h"
+
+IMPORT_C extern void RMDebug_BranchTst2();
+
+LOCAL_C void ParseCommandLineL(TInt32& aFunctionType, TUint& aDelay, TUint& aExtraThreads, TInt32& aCpuNumber, TInt32& aThreadPriority)
+	{
+
+	// get the length of the command line arguments
+	TInt argc = User::CommandLineLength();
+	RDebug::Printf(" t_rmdebug_app: ParseCommandLineL argc=%d", argc);
+
+	// allocate a buffer for the command line arguments and extract the data to it
+	HBufC* commandLine = HBufC::NewLC(argc);
+	TPtr commandLineBuffer = commandLine->Des();
+	User::CommandLine(commandLineBuffer);
+
+	// create a lexer and read through the command line
+	TLex lex(*commandLine);
+	while (!lex.Eos())
+		{
+		// expecting the first character to be a '-'
+		if (lex.Get() == '-')
+			{
+			TChar arg = lex.Get();
+			switch (arg)
+				{
+				case 'f':
+					// the digits following '-f' give the function type
+					User::LeaveIfError(lex.Val(aFunctionType));
+					RDebug::Printf(" t_rmdebug_app: setting aFunctionType=%d", aFunctionType);
+					break;
+				case 'd':
+					// the digits following '-d' give the delay
+					User::LeaveIfError(lex.Val(aDelay));
+					RDebug::Printf(" t_rmdebug_app: setting aDelay=%d", aDelay);
+					break;
+				case 'e':
+					// the digits following '-e' give the number of extra threads to launch
+					User::LeaveIfError(lex.Val(aExtraThreads));
+					RDebug::Printf(" t_rmdebug_app: setting aExtraThreads=%d", aExtraThreads);
+					break;
+
+				case 'p':
+					// the digits following '-p' gives the value to set for the main thread priority
+					User::LeaveIfError(lex.Val(aThreadPriority));
+					RDebug::Printf(" t_rmdebug_app: aThreadPriority =%d", aThreadPriority);
+					break;
+
+				case 'a':
+					// the digits following '-a' gives the cpu on which this thread will execute on
+					User::LeaveIfError(lex.Val(aCpuNumber));
+					RDebug::Printf(" t_rmdebug_app: CPU Number =%d", aCpuNumber );
+					break;
+
+				default:
+					// unknown argument so leave
+					User::Leave(KErrArgument);
+				}
+			lex.SkipSpace();
+			}
+		else
+			{
+			// unknown argument so leave
+			User::Leave(KErrArgument);
+			}
+		}
+
+	// do clean up
+	CleanupStack::PopAndDestroy(commandLine);
+	}
+
+typedef void (*TPfun)();
+
+// test function to call corresponding to EPrefetchAbortFunction
+void PrefetchAbort()
+	{
+	TPfun f = NULL;
+	f();
+	}
+
+// test function to call corresponding to EUserPanicFunction
+void UserPanic()
+	{
+	User::Panic(KUserPanic, KUserPanicCode);
+	}
+
+// calls self repeatedly until stack is used up. Slightly convoluted to prevent UREL optimising this out...
+TUint32 StackOverFlowFunction(TUint32 aInt=0)
+	{
+	TUint32 unusedArray[150];
+	for(TInt i=0; i<150; i++)
+		{
+		unusedArray[i] = StackOverFlowFunction(i);
+		}
+	return unusedArray[0];
+	}
+
+void DataAbort()
+	{
+	TInt* r = (TInt*) 0x1000;
+	*r = 0x42;              
+	}
+
+void UndefInstruction()
+	{
+	TUint32 undef = 0xE6000010;
+	TPfun f = (TPfun) &undef;
+	f();
+	}
+
+TInt DataRead()
+	{
+	TInt* r = (TInt*) 0x1000;
+	TInt rr = (TInt)*r;
+	//include the following line to ensure that rr doesn't get optimised out
+	RDebug::Printf("Shouldn't see this being printed out: %d", rr);
+
+	// Stop compilation warning. Should not get here anyway.
+	rr++;
+	return rr;
+	}
+
+void DataWrite()
+	{
+	TInt* r = (TInt*) 0x1000;
+	*r = 0x42;                
+	}
+
+void UserException()
+	{
+	User::RaiseException(EExcGeneral);
+	}
+
+void SpinForeverWithBreakPoint()
+	{
+
+    // finding the process t_rmdebug2/t_rmdebug2_oem/t_rmdebug2_oem2
+    // we find the process.SID to attach to the property
+	_LIT(KThreadWildCard, "t_rmdebug2*");
+
+	TInt err = KErrNone;
+	TUid propertySid = KNullUid;
+	TFindThread find(KThreadWildCard);
+	TFullName name;
+	TBool found = EFalse;
+	while(find.Next(name)==KErrNone && !found)
+		{
+		RThread thread;
+		err = thread.Open(find);
+		if (err == KErrNone)
+			{
+			RProcess process;
+			thread.Process(process);
+			TFullName fullname = thread.FullName();
+		    //RDebug::Printf("SID Search Match Found Name %lS Process ID%ld Thread Id %ld", &fullname, process.Id().Id(), thread.Id().Id());
+			found = ETrue;
+			//SID saved so that the property can be attached to
+			propertySid = process.SecureId();
+			process.Close();
+			}
+		thread.Close();
+	}
+
+    // publish the address of the RMDebug_BranchTst2 with the correct SID value
+	TInt address = (TInt)&RMDebug_BranchTst2;
+	err = RProperty::Set(propertySid, EMyPropertyInteger, address);
+	if(KErrNone != err)
+		RDebug::Printf("Error Set of the property %d", err);
+	
+	//open semaphore to signal the fact we have reached the point where we have to set the property
+	RSemaphore globsem;
+	globsem.OpenGlobal(_L("RMDebugGlobSem"));
+	globsem.Signal();
+	globsem.Close();
+
+	RProcess thisProcess;
+	TFileName thisProcessName = thisProcess.FileName();
+	RDebug::Print(_L("App Process Name %S process id %ld thread id %ld"), &thisProcessName, thisProcess.Id().Id(), RThread().Id().Id());
+
+	TInt i=0;
+	RThread::Rendezvous(KErrNone);
+	while(i<0xffffffff)
+		{
+		RMDebug_BranchTst2();
+		User::After(10000);
+		}
+	}
+
+void SpinForever()
+	{
+	TInt i=0;
+	RThread::Rendezvous(KErrNone);
+	while(i<0xffffffff)
+		{
+		User::After(10000);
+		}
+	}
+
+void NormalExit()
+    {
+    RDebug::Printf("Target app: NormalExit() function. Returning to MainL" );
+    }
+
+void LaunchThreads(TUint aNumber)
+	{
+	_LIT(KDebugThreadName, "DebugThread");
+	const TUint KDebugThreadDefaultHeapSize=0x10000;
+	for(TInt i=0; i<aNumber; i++)
+		{
+		RThread thread;
+		RBuf threadName;
+		threadName.Create(KDebugThreadName().Length()+10); // the 10 is for appending i to the end of the name
+		threadName.Append(KDebugThreadName());
+		threadName.AppendNum(i);
+		TInt err = thread.Create(threadName, (TThreadFunction)SpinForever, KDefaultStackSize, KDebugThreadDefaultHeapSize, KDebugThreadDefaultHeapSize, NULL);
+		if(err != KErrNone)
+			{
+			RDebug::Printf("Couldn't create thread %d", err);
+			threadName.Close();
+			thread.Close();
+			break;
+			}
+		thread.SetPriority(EPriorityNormal);
+		TRequestStatus status;
+		thread.Rendezvous(status);
+		thread.Resume();
+		User::WaitForRequest(status);
+		thread.Close();
+		threadName.Close();
+		}
+	}
+
+void WaitFiveSecondsThenExit(void)
+	{
+	// wait for 5 seconds
+	User::After(5000000);
+	}
+
+TInt NumberOfCpus()
+	{
+	TInt r = UserSvr::HalFunction(EHalGroupKernel, EKernelHalNumLogicalCpus, 0, 0);
+	return r;
+	}
+
+TInt SetCpuAffinity(TInt aCpuNumber)
+	{
+    TInt TestCpuCount = NumberOfCpus();
+	RDebug::Printf("SetCpuAffinity --> TestCpuCount = %d\n", TestCpuCount);		
+	TUint32 cpu = 0;
+
+	if ((aCpuNumber % TestCpuCount) != 0)
+	cpu = (TUint32)(aCpuNumber % TestCpuCount);
+
+	RDebug::Printf("SetCpuAffinity --> Setting cpu %3d\n", cpu);
+	TInt r = UserSvr::HalFunction(EHalGroupKernel, EKernelHalLockThreadToCpu, (TAny *)cpu, 0);
+	return r;
+	}
+
+void SetCurrentThreadPriority(TInt aThreadPriority)
+    {
+     RDebug::Printf("SetCurrentThreadPriority  aThreadPriority =%d\n", aThreadPriority);
+     RThread().SetPriority((TThreadPriority) aThreadPriority);
+     RDebug::Printf("SetCurrentThreadPriority Crashapp RThread Priority() = %d", (TInt) RThread().Priority()) ;
+    }
+
+TInt GetTimeInMs()
+{
+    TInt period = 0;
+    User::LeaveIfError(HAL::Get(HALData::ENanoTickPeriod, period));
+    TInt periodInMs = period / 1000;
+    return User::NTickCount() * periodInMs;
+}
+
+void SetNanoTickTime()
+    {
+    TUid t_performance_test_Sid;
+    t_performance_test_Sid.iUid = 0x102831E5;
+    RProperty::Set(t_performance_test_Sid, EPropertyTimeOfCrash, GetTimeInMs());    
+    }
+
+// call the function corresponding to aFunctionType
+LOCAL_C void CallFunction(TDebugFunctionType aFunctionType, TUint aDelay, TUint aExtraThreads, TInt32 aCpuNumber, TUint aThreadPriority )
+	{
+
+	// pause for aDelay microseconds
+	User::After(aDelay);
+
+	// set cpu on which this thread should execute on
+	if ( aCpuNumber )
+		SetCpuAffinity(aCpuNumber);
+	
+	if ( aThreadPriority )
+	    SetCurrentThreadPriority(aThreadPriority);
+
+	// launch the extra threads
+	LaunchThreads(aExtraThreads);
+	
+	// Publish Nano tick count time for RMDBG performance testing
+	SetNanoTickTime();
+	    
+	// call appropriate function
+	switch( aFunctionType )
+		{
+		case EPrefetchAbortFunction:
+			PrefetchAbort();
+			break;
+		case EUserPanicFunction:
+			UserPanic();
+			break;
+		case EStackOverflowFunction:
+			StackOverFlowFunction();
+			break;
+		case EDataAbortFunction:
+			DataAbort();
+			break;
+		case EUndefInstructionFunction:
+			UndefInstruction();
+			break;
+		case EDataReadErrorFunction:
+			DataRead();
+			break;
+		case EDataWriteErrorFunction:
+			DataWrite();
+			break;
+		case EUserExceptionFunction:
+			UserException();
+			break;
+		case EWaitFiveSecondsThenExit:
+			WaitFiveSecondsThenExit();
+			break;
+		case ESpinForever:
+			SpinForever();
+			break;
+		case ESpinForeverWithBreakPoint:
+			SpinForeverWithBreakPoint();
+			break;
+        case ENormalExit:
+            NormalExit();
+            break;			
+		case EDefaultDebugFunction:
+		default:
+			break;
+		}
+	}
+
+void PrintHelp()
+	{
+	RDebug::Printf("Invoke with arguments:\n");
+	RDebug::Printf("\t-d<delay>\n\t: delay in microseconds before calling target function\n");
+	RDebug::Printf("\t-f<function-number>\n\t: enumerator from TDebugFunctionType representing function to call\n");
+	RDebug::Printf("\t-e<number>\n\t: number of extra threads to launch, these threads run endlessly\n");
+	}
+
+TInt E32Main()
+	{
+    
+    RDebug::Printf("<<<<< E32Main() RThread Priority() = %d, RProcess Priority() = %d", (TInt) RThread().Priority(), (TInt) RProcess().Priority()) ;   
+	RDebug::Printf("t_rmdebug_app tid=%d,pid=%d", I64LOW(RThread().Id().Id()), I64LOW(RProcess().Id().Id()) ) ;
+	// setup heap checking and clean up trap
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup=CTrapCleanup::New();
+	RThread().SetPriority(EPriorityNormal);
+	RProcess::Rendezvous(KErrNone);
+	
+	// read arguments from command line
+	TUint delay = 0;
+	TInt32 functionTypeAsTInt32 = (TInt32)EDefaultDebugFunction;
+	TUint extraThreads = 0;
+	TInt32 aCpuNumber = 0;
+	TInt32 aThreadPriority = 0;
+
+	TRAPD(err, ParseCommandLineL(functionTypeAsTInt32, delay, extraThreads, aCpuNumber, aThreadPriority));
+
+	RDebug::Printf("E32Main :: aThreadPriority=%d", aThreadPriority ) ;
+	
+	if(KErrNone == err)
+		{
+		// if the command line arguments were successfully read then call the appropriate function
+		CallFunction((TDebugFunctionType)functionTypeAsTInt32, delay, extraThreads, aCpuNumber, aThreadPriority);
+		}
+
+	// perform clean up and return any error which was recorded
+	delete cleanup;
+	__UHEAP_MARKEND;
+	return err;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/t_rmdebug_app.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,46 @@
+// 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 the License "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 T_RMDEBUG_APP_H
+#define T_RMDEBUG_APP_H
+
+_LIT(KRMDebugTestApplication, "z:\\sys\\bin\\t_rmdebug_app.exe");
+_LIT(KUserPanic, "UserPanic");
+const TInt KUserPanicCode = 0x1234ABCD;
+
+enum TMyPropertyKeys {EMyPropertyInteger};
+enum TPropertyTimeKeys {EPropertyTimeOfCrash};
+
+
+// enumeration of functions to call in test debug application
+enum TDebugFunctionType
+	{
+	EDefaultDebugFunction,
+	EPrefetchAbortFunction,
+	EUserPanicFunction,
+	EStackOverflowFunction,
+	EDataAbortFunction,
+	EUndefInstructionFunction,
+	EDataReadErrorFunction,
+	EDataWriteErrorFunction,
+	EUserExceptionFunction,
+	EWaitFiveSecondsThenExit,
+	ESpinForever,
+	ESpinForeverWithBreakPoint,
+	ENormalExit
+	};
+
+#endif //T_RMDEBUG_APP_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/t_rmdebug_dll.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,25 @@
+// 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 the License "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:
+//
+
+#include <e32std.h>
+#include <e32std_private.h>
+#include <rm_debug_api.h>
+#include "t_rmdebug_dll.h"
+
+EXPORT_C TUid GetDSSUid()
+	{
+	return Debug::KUidDebugSecurityServer;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/t_rmdebug_dll.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,23 @@
+// 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 the License "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:
+//
+
+#include <e32std.h>
+
+/**
+  This is a simple function that uses an element from rm_debug_api.h.
+  If the e32tests can be built and run then this is 'proof' that the
+  rm_debug_api.h header file can be #include'd into a dll
+  */
+IMPORT_C TUid GetDSSUid();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/t_rmdebug_security.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,100 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Target application to be debugged by t_rmdebug.exe when testing
+// security restrictions. This application is built with various
+// capabilities by the t_rmdebug_securityX.mmp files. This allows
+// the t_rmdebug2 program to ensure that security restrictions are
+// properly enforced by the DSS/DDD subsystem.
+// 
+//
+
+#include <e32base.h>
+#include <e32base_private.h>
+#include <e32cons.h>
+#include <e32test.h>
+#include <e32ldr.h>
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include "t_rmdebug_security.h"
+
+CRunModeApp* CRunModeApp::NewL()
+//
+// CRunModeApp::NewL
+//
+	{
+	CRunModeApp* self = new(ELeave) CRunModeApp();
+
+  	self->ConstructL();
+   
+	return self;
+	}
+
+CRunModeApp::CRunModeApp()
+//
+// CRunModeApp constructor
+//
+	{
+	}
+
+CRunModeApp::~CRunModeApp()
+//
+// CRunModeApp destructor
+//
+	{
+	}
+
+void CRunModeApp::ConstructL()
+//
+// CRunModeApp::ConstructL
+//
+	{
+	}
+
+void CRunModeApp::TestWaitDebug()
+//
+// CRunModeApp::TestWaitDebug
+//
+	{
+	RProcess::Rendezvous(KErrNone);
+
+	// Wait a 3secs then quit (long enough to test, but not hang around forever)
+	User::After(3000000);
+	}
+
+GLDEF_C TInt E32Main()
+//
+// Entry point for run mode debug app test program
+//
+	{
+   TInt ret = KErrNone;
+   
+	// client
+	CTrapCleanup* trap = CTrapCleanup::New();
+	if (!trap)
+		return KErrNoMemory;
+
+   CRunModeApp* myApp = CRunModeApp::NewL();
+   if (myApp != NULL)
+       {
+        __UHEAP_MARK;
+	    TRAP(ret,myApp->TestWaitDebug());
+	    __UHEAP_MARKEND;
+
+	    delete myApp;
+       }
+       
+	delete trap;
+
+	return ret;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/debug_targets/t_rmdebug_security.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,44 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Target application to be debugged by t_rmdebug2.exe when testing
+// security restrictions. This application is built with various
+// capabilities by the t_rmdebug_securityX.mmp files. This allows
+// the t_rmdebug2 program to ensure that security restrictions are
+// properly enforced by the DSS/DDD subsystem.
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef T_RMDEBUG_SECURITY_H
+#define T_RMDEBUG_SECURITY_H
+
+class CRunModeApp : public CBase
+{
+public:
+	static CRunModeApp* NewL();
+	~CRunModeApp();
+
+	void TestWaitDebug();
+
+private:
+	CRunModeApp();
+	void ConstructL();
+};
+
+#endif // T_RMDEBUG_SECURITY_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,94 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// e32test/group/bld.inf
+// Kernel and User library test code
+// 
+//
+
+/**
+ @file
+*/
+
+
+PRJ_PLATFORMS
+
+BASEDEFAULT
+
+PRJ_TESTEXPORTS
+
+./t_rmdebug_tests.iby					/epoc32/rom/include/t_rmdebug_tests.iby
+./mytraces_rm_debug_ekern.txt			/epoc32/rombuild/mytraces_rm_debug_ekern.txt
+./mytraces_rm_debug.txt					/epoc32/rombuild/mytraces_rm_debug.txt
+
+./rmdebug.iby							/epoc32/rom/include/rmdebug.iby
+../scripts/tef_execute_rtests.script	z:/scripts/tef_execute_rtests.script
+
+
+PRJ_TESTMMPFILES
+
+/******************************************************************************
+ Put all device drivers here. These build both SMP and non-SMP variants.
+ User side code builds a single variant for both.
+ *NOTE: Base BTB will build properly any kernel-side test code embedded within 
+ positive check ( #ifdef SMP ), however these binaries will not be included in BTB 
+ autotest images for SMP platforms. Refer to DTW-KHS BTB00055 for more details.
+ ******************************************************************************/
+
+/******************************************************************************
+ User side code here - builds a single variant for both SMP and non-SMP.
+ ******************************************************************************/
+
+#if defined(MARM_ARMV5)
+./t_rmdebug_app support
+./t_rmdebug_app1 support
+./t_rmdebug_app2 support
+./t_rmdebug_app3 support
+./t_rmdebug_app4 support
+./t_rmdebug_app5 support
+./t_rmdebug_app6 support
+./t_rmdebug_app7 support
+./t_rmdebug_app8 support
+./t_rmdebug_app9 support
+./t_rmdebug_app10 support
+
+./t_rmdebug_dll support
+
+./t_rmdebug_security0 support
+./t_rmdebug_security1 support
+./t_rmdebug_security2 support
+./t_rmdebug_security3 support
+
+./t_rmdebug2.mmp
+
+./t_rmdebug2_oem.mmp
+./t_rmdebug2_oemtoken support
+
+./t_rmdebug2_oem2.mmp
+./t_rmdebug2_oemtoken2 support
+
+./t_rmdebug2_allcaps.mmp
+./t_rmdebug2_allcapstoken support
+
+./t_rmdebug_target_launcher support
+./t_rmdebug_multi_target.mmp
+
+./t_rmdebug_multi_agent support
+./t_multi_agent_launcher.mmp
+
+./t_rmdebug_performance_allcapstoken
+./t_performance_test.mmp
+
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/mytraces_rm_debug.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+_fh4hrp_scmonitornor.dll
+_h4hrp_scmonitornor.dll
+OEMDebug_10282FE5.exe
+OEMDebug_102831E5.exe
+OEMDebug_F1234567.exe
+OEMDebug_F123ABCD.exe
+OEMDebug_F123ABCE.exe
+rm_debug.ldd
+rm_debug_svr.exe
+scmonitor_serial.dll
+t_crashmonitor_lib.exe
+t_performance_test.exe
+t_rmdebug_app.exe
+t_rmdebug_app1.exe
+t_rmdebug_app10.exe
+t_rmdebug_app2.exe
+t_rmdebug_app3.exe
+t_rmdebug_app4.exe
+t_rmdebug_app5.exe
+t_rmdebug_app6.exe
+t_rmdebug_app7.exe
+t_rmdebug_app8.exe
+t_rmdebug_app9.exe
+t_rmdebug_attachall.exe
+t_rmdebug_dll.dll
+t_rmdebug_multi_agent.exe
+t_rmdebug_multi_target.exe
+t_rmdebug_security0.exe
+t_rmdebug_security1.exe
+t_rmdebug_security2.exe
+t_rmdebug_security3.exe
+t_rmdebug_target_launcher.exe
+t_rmdebug2.exe
+t_rmdebug2_allcaps.exe
+t_rmdebug2_oem.exe
+t_rmdebug2_oem2.exe
+t_trkdummyapp.exe
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/mytraces_rm_debug_ekern.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,49 @@
+_34xx_sdp_ekern.exe
+_8500_ekern.exe
+_f34xx_sdp_ekern.exe
+_fh4hrp_ekern.exe
+_fne1_tb_ekern.exe
+_h4hrp_ekern.exe
+_lab_ekern.exe
+_ne1_tb_ekern.exe
+_rapu_ekern.exe
+_rapu_fmm_ekern.exe
+_template_ekern.exe
+
+_fh4hrp_scmonitornor.dll
+_h4hrp_scmonitornor.dll
+OEMDebug_10282FE5.exe
+OEMDebug_102831E5.exe
+OEMDebug_F1234567.exe
+OEMDebug_F123ABCD.exe
+OEMDebug_F123ABCE.exe
+rm_debug.ldd
+rm_debug_svr.exe
+scmonitor_serial.dll
+t_crashmonitor_lib.exe
+t_performance_test.exe
+t_rmdebug_app.exe
+t_rmdebug_app1.exe
+t_rmdebug_app10.exe
+t_rmdebug_app2.exe
+t_rmdebug_app3.exe
+t_rmdebug_app4.exe
+t_rmdebug_app5.exe
+t_rmdebug_app6.exe
+t_rmdebug_app7.exe
+t_rmdebug_app8.exe
+t_rmdebug_app9.exe
+t_rmdebug_attachall.exe
+t_rmdebug_dll.dll
+t_rmdebug_multi_agent.exe
+t_rmdebug_multi_target.exe
+t_rmdebug_security0.exe
+t_rmdebug_security1.exe
+t_rmdebug_security2.exe
+t_rmdebug_security3.exe
+t_rmdebug_target_launcher.exe
+t_rmdebug2.exe
+t_rmdebug2_allcaps.exe
+t_rmdebug2_oem.exe
+t_rmdebug2_oem2.exe
+t_trkdummyapp.exe
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/rmdbg_test.pkg	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,64 @@
+// Copyright (c) 2010 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: 
+//
+
+// BINARIES NEEDED BY TESTS BELOW
+"\epoc32\release\armv5\udeb\t_rmdebug_app.exe"-"c:\sys\bin\t_rmdebug_app.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_app1.exe"-"c:\sys\bin\t_rmdebug_app1.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_app2.exe"-"c:\sys\bin\t_rmdebug_app2.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_app3.exe"-"c:\sys\bin\t_rmdebug_app3.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_app4.exe"-"c:\sys\bin\t_rmdebug_app4.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_app5.exe"-"c:\sys\bin\t_rmdebug_app5.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_app6.exe"-"c:\sys\bin\t_rmdebug_app6.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_app7.exe"-"c:\sys\bin\t_rmdebug_app7.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_app8.exe"-"c:\sys\bin\t_rmdebug_app8.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_app9.exe"-"c:\sys\bin\t_rmdebug_app9.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_app10.exe"-"c:\sys\bin\t_rmdebug_app10.exe"
+
+"\epoc32\release\armv5\udeb\t_rmdebug_dll.dll"-"c:\sys\bin\t_rmdebug_dll.dll"
+
+"\epoc32\release\armv5\udeb\t_rmdebug_security0.exe"-"c:\sys\bin\t_rmdebug_security0.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_security1.exe"-"c:\sys\bin\t_rmdebug_security1.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_security2.exe"-"c:\sys\bin\t_rmdebug_security2.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_security3.exe"-"c:\sys\bin\t_rmdebug_security3.exe"
+
+
+//RUN_RTESTS_AS_TEF
+"\epoc32\data\z\scripts\tef_execute_rtests.script"-"c:\scripts\tef_execute_rtests.script"
+
+
+//No token required
+"\epoc32\release\armv5\udeb\t_rmdebug2.exe"-"c:\sys\bin\t_rmdebug2.exe"
+
+//SOMECAPS_DEBUGTOKEN
+"\epoc32\release\armv5\udeb\t_rmdebug2_oem.exe"-"c:\sys\bin\t_rmdebug2_oem.exe"
+"\epoc32\release\armv5\udeb\OEMDebug_F123ABCD.exe"-"c:\sys\bin\OEMDebug_F123ABCD.exe"
+
+//FEWCAPS_DEBUGTOKEN
+"\epoc32\release\armv5\udeb\t_rmdebug2_oem2.exe"-"c:\sys\bin\t_rmdebug2_oem2.exe"
+"\epoc32\release\armv5\udeb\OEMDebug_F1234567.exe"-"c:\sys\bin\OEMDebug_F1234567.exe"
+
+//ALLCAPS_DEBUGTOKEN
+"\epoc32\release\armv5\udeb\t_rmdebug2_allcaps.exe"-"c:\sys\bin\t_rmdebug2_allcaps.exe"
+"\epoc32\release\armv5\udeb\OEMDebug_F123ABCE.exe"-"c:\sys\bin\OEMDebug_F123ABCE.exe"
+
+"\epoc32\release\armv5\udeb\t_rmdebug_target_launcher.exe"-"c:\sys\bin\t_rmdebug_target_launcher.exe"
+"\epoc32\release\armv5\udeb\t_rmdebug_multi_target.exe"-"c:\sys\bin\t_rmdebug_multi_target.exe"
+
+"\epoc32\release\armv5\udeb\t_rmdebug_multi_agent.exe"-"c:\sys\bin\t_rmdebug_multi_agent.exe"
+"\epoc32\release\armv5\udeb\t_multi_agent_launcher.exe"-"c:\sys\bin\t_multi_agent_launcher.exe"
+
+//PERFORMANCE TEST DEBUGTOKEN
+"\epoc32\release\armv5\udeb\t_performance_test.exe"-"c:\sys\bin\t_performance_test.exe"
+"\epoc32\release\armv5\udeb\OEMDebug_102831E5.exe"-"c:\sys\bin\OEMDebug_102831E5.exe"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/rmdebug.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,18 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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 configuration file for Sirocco
+//
+
+extension[VARID]=KERNEL_DIR\DEBUG_DIR\rm_debug.ldd		\sys\bin\rm_debug.ldd
+file=KERNEL_DIR\DEBUG_DIR\rm_debug_svr.exe		\sys\bin\rm_debug_svr.exe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_multi_agent_launcher.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,44 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Application that launches multiple agents which in-turn test the ability of 
+// the run mode debug component to debug several targets
+// 
+//
+
+// This is an RTest configured to run on Sirocco, hence the testexecuteutils linked in lib below.
+
+targettype     exe
+target         t_multi_agent_launcher.exe
+
+library		euser.lib hal.lib
+library		testexecuteutils.lib // for Sirocco
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+userinclude    ../debug_targets
+userinclude    ../common
+userinclude    ../multi_agent_tests
+
+sourcepath	   ../multi_agent_tests
+source         t_multi_agent_launcher.cpp 
+
+UID            0x0 0x4321bbbc
+SECUREID       0x1234aaab
+VENDORID       0x70000001
+
+DEBUGGABLE
+
+macro NO_DEBUGTOKEN
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_performance_test.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+// Copyright (c) 2010 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 an RTest configured to run on Sirocco, hence the testexecuteutils linked in lib below.
+
+TARGET        t_performance_test.exe
+TARGETTYPE    exe
+UID			  0x1000008D 0x102831E5
+VENDORID	  0x70000001
+
+ 
+USERINCLUDE   ../common
+USERINCLUDE   ../performance_test
+USERINCLUDE   ../debug_targets
+SOURCEPATH    ../performance_test
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+library       euser.lib
+library       hal.lib
+library       testexecuteutils.lib // for Sirocco
+
+DEBUGGABLE
+
+MACRO SYMBIAN_TRACE_ENABLE
+
+SOURCE t_rmdebug_performance_test.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,28 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Tests the functionality of the run mode debug device driver.
+//
+//
+
+
+#ifndef T_RMDEBUG_IBY
+#define T_RMDEBUG_IBY
+
+file=ABI_DIR\DEBUG_DIR\t_rmdebug2.exe			\sys\bin\t_rmdebug2.exe
+file=ABI_DIR\DEBUG_DIR\t_rmdebug2_oem.exe			\sys\bin\t_rmdebug2_oem.exe
+file=ABI_DIR\DEBUG_DIR\OEMDebug_F123ABCD.exe	\sys\bin\OEMDebug_F123ABCD.exe
+
+file=ABI_DIR\DEBUG_DIR\t_rmdebug_dll.dll		\sys\bin\t_rmdebug_dll.dll
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// 
+//
+
+ALWAYS_BUILD_AS_ARM
+
+target         t_rmdebug.exe
+targettype     exe
+
+sourcepath	   	../metro_trk
+source        	d_rmdebugserver.cpp 
+source        	d_rmdebugthread.cpp 
+source        	t_rmdebug.cpp 
+sourcepath	   	../common
+source			d_rmdebugthreadasm.cia
+
+library		euser.lib
+               
+SYMBIAN_BASE_SYSTEMINCLUDE(nkern)
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+UID            0x100039CE 0x101F7159
+SECUREID       0x101F7159
+VENDORID       0x70000001
+
+CAPABILITY 	ALL -TCB
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2.mmh	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,66 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// 
+//
+
+ALWAYS_BUILD_AS_ARM
+
+targettype     exe
+
+sourcepath	   	..\debug_targets
+
+source        	d_rmdebugthread2.cpp 
+source			d_rmdebugthreadasm2.cia
+
+#if defined(MARM_ARMV5)
+source			d_rmdebug_step_test.s
+source			d_rmdebug_bkpt_test.s
+#endif
+
+#if defined(MARM_ARMV4)
+source			d_rmdebug_step_test_armv4.s
+#endif
+
+source			d_demand_paging.cia
+
+library		euser.lib
+library         hal.lib
+library         efsrv.lib
+library         t_rmdebug_dll.lib
+
+userinclude    ..\..\..\rmdriver\inc
+userinclude    ..\..\..\securityserver\inc
+userinclude    ..\debug_targets
+
+
+#ifdef SYMBIAN_OLD_EXPORT_LOCATION
+SYMBIAN_BASE_SYSTEMINCLUDE(drivers)
+SYMBIAN_BASE_SYSTEMINCLUDE(kernel)
+#endif
+SYMBIAN_BASE_SYSTEMINCLUDE(nkern)
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+PAGED
+
+// To test heap allocation failure uncomment one or other of the following macros.
+// NOTE: Do not uncomment both, the tests will panic if both are defined!
+
+// To test heap allocation failure in the Debug Device Driver uncomment this macro
+//macro KERNEL_OOM_TESTING
+
+// To test heap allocation failure in the Debug Security Server uncomment this macro
+//macro USER_OOM_TESTING
+
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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 an RTest configured to run on Sirocco, hence the testexecuteutils linked in lib below.
+
+#include "t_rmdebug2.mmh"
+
+target         t_rmdebug2.exe
+
+sourcepath	   	../basic_tests
+source        	t_rmdebug2.cpp 
+source		r_low_memory_security_svr_session.cpp
+source		r_kernel_low_memory_security_svr_session.cpp
+source		r_user_low_memory_security_svr_session.cpp
+
+library		testexecuteutils.lib // for Sirocco
+
+UID            0x0 0x4321bbbb
+SECUREID       0x1234aaaa
+VENDORID       0x70000001
+
+CAPABILITY 	READUSERDATA POWERMGMT ALLFILES
+
+DEBUGGABLE
+
+macro NO_DEBUGTOKEN
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2_allcaps.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,42 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Same tests as t_rmdebug2.mmp but with OEM rights conferred
+// by the OEMDebug_F123ABCD.exe token file.
+// 
+//
+
+// This is an RTest configured to run on Sirocco, hence the testexecuteutils linked in lib below.
+
+#include "t_rmdebug2.mmh"
+
+target         t_rmdebug2_allcaps.exe
+
+sourcepath	   	../basic_tests
+source        	t_rmdebug2.cpp 
+source		r_low_memory_security_svr_session.cpp
+source		r_kernel_low_memory_security_svr_session.cpp
+source		r_user_low_memory_security_svr_session.cpp
+
+library		testexecuteutils.lib // for Sirocco
+
+UID            0x0 0x4321bbbb
+SECUREID       0xF123abce
+VENDORID       0x70000001
+
+CAPABILITY 	READUSERDATA POWERMGMT ALLFILES
+
+// Used when compiling tests to work in the presence of an
+// OEM Debug Token
+macro ALLCAPS_DEBUGTOKEN
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2_allcapstoken.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// 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 the License "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:
+// 
+//
+
+ALWAYS_BUILD_AS_ARM
+
+target         OEMDebug_F123ABCE.exe
+targettype     exe
+
+sourcepath	   	../basic_tests
+
+source        	t_rmdebug2_oemtoken.cpp 
+
+library		euser.lib
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+capability All
+
+UID            0x0 0x0
+SECUREID       0x0
+VENDORID       0x70000001
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2_oem.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,42 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Same tests as t_rmdebug2.mmp but with OEM rights conferred
+// by the OEMDebug_F123ABCD.exe token file.
+// 
+//
+
+// This is an RTest configured to run on Sirocco, hence the testexecuteutils linked in lib below.
+
+#include "t_rmdebug2.mmh"
+
+target         t_rmdebug2_oem.exe
+
+sourcepath	   	../basic_tests
+source        	t_rmdebug2.cpp 
+source		r_low_memory_security_svr_session.cpp
+source		r_kernel_low_memory_security_svr_session.cpp
+source		r_user_low_memory_security_svr_session.cpp
+
+library		testexecuteutils.lib // for Sirocco
+
+UID            0x0 0x4321bbbb
+SECUREID       0xF123abcd
+VENDORID       0x70000001
+
+CAPABILITY 	READUSERDATA POWERMGMT ALLFILES
+
+// Used when compiling tests to work in the presence of an
+// OEM Debug Token
+macro SOMECAPS_DEBUGTOKEN
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2_oem2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,42 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Same tests as t_rmdebug2.mmp but with some OEM rights conferred
+// by the OEMDebug_F1234567.exe token file.
+// 
+//
+
+//RTEST
+
+#include "t_rmdebug2.mmh"
+
+target         t_rmdebug2_oem2.exe
+
+sourcepath	   	../basic_tests
+source        	t_rmdebug2.cpp 
+source		r_low_memory_security_svr_session.cpp
+source		r_kernel_low_memory_security_svr_session.cpp
+source		r_user_low_memory_security_svr_session.cpp
+
+library		testexecuteutils.lib // for Sirocco
+
+UID            0x0 0x4321bbbb
+SECUREID       0xF1234567
+VENDORID       0x70000001
+
+CAPABILITY 	READUSERDATA POWERMGMT
+
+// Used when compiling tests to work in the presence of an
+// OEM Debug Token with AllFiles only capability
+macro FEWCAPS_DEBUGTOKEN
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2_oemtoken.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// 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 the License "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:
+// 
+//
+
+ALWAYS_BUILD_AS_ARM
+
+target         OEMDebug_F123ABCD.exe
+targettype     exe
+
+sourcepath	   	../basic_tests
+
+source        	t_rmdebug2_oemtoken.cpp 
+
+library		euser.lib
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+capability PowerMgmt AllFiles Tcb ReadUserData WriteUserData
+
+UID            0x0 0x0
+SECUREID       0x0
+VENDORID       0x70000001
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug2_oemtoken2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+// 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 the License "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:
+// 
+//
+
+ALWAYS_BUILD_AS_ARM
+
+target         OEMDebug_F1234567.exe
+targettype     exe
+
+sourcepath	   	../basic_tests
+
+source        	t_rmdebug2_oemtoken.cpp 
+
+library		euser.lib
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+// Token requires AllFiles
+capability AllFiles ReadUserData PowerMgmt
+
+UID            0x0 0x0
+SECUREID       0x0
+VENDORID       0x70000001
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,35 @@
+// 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 the License "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:
+// 
+//
+
+target             t_rmdebug_app.exe
+targettype         exe
+
+sourcepath         ../debug_targets
+source             t_rmdebug_app.cpp 
+source			   d_rmdebugthreadasm2.cia
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+library            euser.lib hal.lib
+
+uid                0x0 0x0
+capability         none
+
+always_build_as_arm
+pagedcode
+
+DEBUGGABLE
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app1.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// 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 the License "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:
+// Target application to be debugged
+// 
+//
+
+target             t_rmdebug_app1.exe
+targettype         exe
+
+sourcepath         ../debug_targets
+source             t_rmdebug_app.cpp 
+source             d_rmdebugthreadasm2.cia
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+library            euser.lib hal.lib
+
+uid                0x0 0x0
+capability         none
+
+always_build_as_arm
+pagedcode
+
+DEBUGGABLE
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app10.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// 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 the License "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:
+// Target application to be debugged
+// 
+//
+
+target             t_rmdebug_app10.exe
+targettype         exe
+
+sourcepath         ../debug_targets
+source             t_rmdebug_app.cpp 
+source             d_rmdebugthreadasm2.cia
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+library            euser.lib hal.lib
+
+uid                0x0 0x0
+capability         none
+
+always_build_as_arm
+pagedcode
+
+DEBUGGABLE
+
+SMPSAFE
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// 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 the License "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:
+// Target application to be debugged
+// 
+//
+
+target             t_rmdebug_app2.exe
+targettype         exe
+
+sourcepath         ../debug_targets
+source             t_rmdebug_app.cpp 
+source             d_rmdebugthreadasm2.cia
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+library            euser.lib hal.lib
+
+uid                0x0 0x0
+capability         none
+
+always_build_as_arm
+pagedcode
+
+DEBUGGABLE
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app3.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// 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 the License "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:
+// Target application to be debugged
+// 
+//
+
+target             t_rmdebug_app3.exe
+targettype         exe
+
+sourcepath         ../debug_targets
+source             t_rmdebug_app.cpp 
+source             d_rmdebugthreadasm2.cia
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+library            euser.lib hal.lib
+
+uid                0x0 0x0
+capability         none
+
+always_build_as_arm
+pagedcode
+
+DEBUGGABLE
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app4.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// 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 the License "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:
+// Target application to be debugged
+// 
+//
+
+target             t_rmdebug_app4.exe
+targettype         exe
+
+sourcepath         ../debug_targets
+source             t_rmdebug_app.cpp 
+source             d_rmdebugthreadasm2.cia
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+library            euser.lib hal.lib
+
+uid                0x0 0x0
+capability         none
+
+always_build_as_arm
+pagedcode
+
+DEBUGGABLE
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app5.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// 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 the License "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:
+// Target application to be debugged
+// 
+//
+
+target             t_rmdebug_app5.exe
+targettype         exe
+
+sourcepath         ../debug_targets
+source             t_rmdebug_app.cpp 
+source             d_rmdebugthreadasm2.cia
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+library            euser.lib hal.lib
+
+uid                0x0 0x0
+capability         none
+
+always_build_as_arm
+pagedcode
+
+DEBUGGABLE
+
+SMPSAFE
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app6.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// 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 the License "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:
+// Target application to be debugged
+// 
+//
+
+target             t_rmdebug_app6.exe
+targettype         exe
+
+sourcepath         ../debug_targets
+source             t_rmdebug_app.cpp 
+source             d_rmdebugthreadasm2.cia
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+library            euser.lib hal.lib
+
+uid                0x0 0x0
+capability         none
+
+always_build_as_arm
+pagedcode
+
+DEBUGGABLE
+
+SMPSAFE
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app7.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// 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 the License "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:
+// Target application to be debugged
+// 
+//
+
+target             t_rmdebug_app7.exe
+targettype         exe
+
+sourcepath         ../debug_targets
+source             t_rmdebug_app.cpp 
+source             d_rmdebugthreadasm2.cia
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+library            euser.lib hal.lib
+
+uid                0x0 0x0
+capability         none
+
+always_build_as_arm
+pagedcode
+
+DEBUGGABLE
+
+SMPSAFE
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app8.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// 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 the License "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:
+// Target application to be debugged
+// 
+//
+
+target             t_rmdebug_app8.exe
+targettype         exe
+
+sourcepath         ../debug_targets
+source             t_rmdebug_app.cpp 
+source             d_rmdebugthreadasm2.cia
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+library            euser.lib hal.lib
+
+uid                0x0 0x0
+capability         none
+
+always_build_as_arm
+pagedcode
+
+DEBUGGABLE
+
+SMPSAFE
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_app9.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// 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 the License "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:
+// Target application to be debugged
+// 
+//
+
+target             t_rmdebug_app9.exe
+targettype         exe
+
+sourcepath         ../debug_targets
+source             t_rmdebug_app.cpp 
+source             d_rmdebugthreadasm2.cia
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+library            euser.lib hal.lib
+
+uid                0x0 0x0
+capability         none
+
+always_build_as_arm
+pagedcode
+
+DEBUGGABLE
+
+SMPSAFE
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_dll.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,38 @@
+// 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 the License "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:
+// 
+//
+
+ALWAYS_BUILD_AS_ARM
+
+target         t_rmdebug_dll.dll
+targettype     dll
+
+DEFFILE        ../../~/t_rmdebug_dll.def
+
+sourcepath	   	../debug_targets
+
+source        	t_rmdebug_dll.cpp 
+
+library		euser.lib
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+capability PowerMgmt AllFiles ReadUserData
+
+UID            0x0 0x0
+SECUREID       0x0
+VENDORID       0x70000001
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_multi_agent.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,41 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Application that tests the ability of the run mode debug component 
+// to debug multiple targets 
+// 
+//
+
+targettype     exe
+target         t_rmdebug_multi_agent.exe
+
+library		euser.lib hal.lib
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+userinclude    ../debug_targets
+userinclude    ../common
+userinclude    ../multi_agent_tests
+
+sourcepath	   ../multi_agent_tests
+source         t_multi_agent.cpp t_agent_eventhandler.cpp 
+
+UID            0x0 0x4321bbbc
+SECUREID       0x1234aaab
+VENDORID       0x70000001
+
+DEBUGGABLE
+
+macro NO_DEBUGTOKEN
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_multi_target.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,46 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Application that tests the ability of the run mode debug component 
+// to debug several targets
+// 
+//
+
+// This is an RTest configured to run on Sirocco, hence the testexecuteutils linked in lib below.
+
+ALWAYS_BUILD_AS_ARM
+
+targettype     exe
+target         t_rmdebug_multi_target.exe
+
+library		euser.lib hal.lib
+library		testexecuteutils.lib // for Sirocco
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+userinclude    ../debug_targets
+userinclude    ../common
+userinclude    ../multi_target_tests
+
+sourcepath	   ../multi_target_tests
+source         t_multi_target.cpp 
+
+UID            0x0 0x4321bbbc
+SECUREID       0x1234aaab
+VENDORID       0x70000001
+
+DEBUGGABLE
+
+macro NO_DEBUGTOKEN
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_performance_allcapstoken.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// 
+//
+
+ALWAYS_BUILD_AS_ARM
+
+target         OEMDebug_102831E5.exe
+targettype     exe
+
+sourcepath	   	../performance_test
+
+source        	t_rmdebug_performance_oemtoken.cpp 
+
+library		euser.lib
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+capability All
+
+UID            0x0 0x0
+SECUREID       0x0
+VENDORID       0x70000001
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_security0.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// 
+//
+
+ALWAYS_BUILD_AS_ARM
+
+target         t_rmdebug_security0.exe
+targettype     exe
+
+sourcepath	   	../debug_targets
+source        	t_rmdebug_security.cpp 
+
+library		euser.lib hal.lib
+               
+SYMBIAN_BASE_SYSTEMINCLUDE(nkern)
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+UID            0x100039CE 0xbaaaf00d
+SECUREID       0x101F7159
+VENDORID       0x70000001
+
+DEBUGGABLE
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_security1.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,35 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// 
+//
+
+ALWAYS_BUILD_AS_ARM
+
+target         t_rmdebug_security1.exe
+targettype     exe
+
+sourcepath	   	../debug_targets
+source        	t_rmdebug_security.cpp 
+
+library		euser.lib hal.lib
+               
+SYMBIAN_BASE_SYSTEMINCLUDE(nkern)
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+UID            0x100039CE 0xdeadbaaa
+SECUREID       0x101F7159
+VENDORID       0x70000001
+
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_security2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// 
+//
+
+ALWAYS_BUILD_AS_ARM
+
+target         t_rmdebug_security2.exe
+targettype     exe
+
+sourcepath	   	../debug_targets
+source        	t_rmdebug_security.cpp 
+
+library		euser.lib hal.lib
+               
+SYMBIAN_BASE_SYSTEMINCLUDE(nkern)
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+capability AllFiles
+
+UID            0x100039CE 0xdeadbaaa
+SECUREID       0x101F7159
+VENDORID       0x70000001
+
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_security3.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// 
+//
+
+ALWAYS_BUILD_AS_ARM
+
+target         t_rmdebug_security3.exe
+targettype     exe
+
+sourcepath	   	../debug_targets
+source        	t_rmdebug_security.cpp 
+
+library		euser.lib hal.lib
+               
+SYMBIAN_BASE_SYSTEMINCLUDE(nkern)
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+capability TCB AllFiles NetworkControl
+
+UID            0x100039CE 0xdeadbaaa
+SECUREID       0x101F7159
+VENDORID       0x70000001
+
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_target_launcher.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,38 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Application that test the ability of the run mode debug component 
+// to handle several target applications
+// 
+//
+
+target         t_rmdebug_target_launcher.exe
+targettype     exe
+
+library		     euser.lib
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+userinclude    ../common
+sourcepath	   ../common
+source         t_target_launcher.cpp 
+
+UID            0x0 0x4321bbbd
+SECUREID       0x1234aaac
+VENDORID       0x70000001
+
+DEBUGGABLE
+
+macro NO_DEBUGTOKEN
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/group/t_rmdebug_tests.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+// Copyright (c) 2010 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:
+// Run Mode Debug Tests ROM include file
+
+
+file=ABI_DIR\BUILD_DIR\t_rmdebug_app.exe	Sys\Bin\t_rmdebug_app.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_app1.exe	Sys\Bin\t_rmdebug_app1.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_app2.exe	Sys\Bin\t_rmdebug_app2.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_app3.exe	Sys\Bin\t_rmdebug_app3.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_app4.exe	Sys\Bin\t_rmdebug_app4.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_app5.exe	Sys\Bin\t_rmdebug_app5.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_app6.exe	Sys\Bin\t_rmdebug_app6.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_app7.exe	Sys\Bin\t_rmdebug_app7.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_app8.exe	Sys\Bin\t_rmdebug_app8.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_app9.exe	Sys\Bin\t_rmdebug_app9.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_app10.exe	Sys\Bin\t_rmdebug_app10.exe
+
+file=ABI_DIR\BUILD_DIR\t_rmdebug_dll.dll	Sys\Bin\t_rmdebug_dll.dll
+
+file=ABI_DIR\BUILD_DIR\t_rmdebug_security0.exe Sys\Bin\t_rmdebug_security0.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_security1.exe Sys\Bin\t_rmdebug_security1.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_security2.exe Sys\Bin\t_rmdebug_security2.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_security3.exe Sys\Bin\t_rmdebug_security3.exe
+
+// This script wraps RTests as TEF3 tests.
+data=DATAZ_\scripts\tef_execute_rtests.script		scripts\tef_execute_rtests.script
+
+
+//No token required
+file=ABI_DIR\BUILD_DIR\t_rmdebug2.exe	Sys\Bin\t_rmdebug2.exe
+
+//SOMECAPS_DEBUGTOKEN
+file=ABI_DIR\BUILD_DIR\t_rmdebug2_oem.exe 		Sys\Bin\t_rmdebug2_oem.exe
+file=ABI_DIR\BUILD_DIR\OEMDebug_F123ABCD.exe Sys\Bin\OEMDebug_F123ABCD.exe
+
+//FEWCAPS_DEBUGTOKEN
+file=ABI_DIR\BUILD_DIR\t_rmdebug2_oem2.exe 		Sys\Bin\t_rmdebug2_oem2.exe
+file=ABI_DIR\BUILD_DIR\OEMDebug_F1234567.exe	Sys\Bin\OEMDebug_F1234567.exe
+
+//ALLCAPS_DEBUGTOKEN
+file=ABI_DIR\BUILD_DIR\t_rmdebug2_allcaps.exe 		Sys\Bin\t_rmdebug2_allcaps.exe
+file=ABI_DIR\BUILD_DIR\OEMDebug_F123ABCE.exe Sys\Bin\OEMDebug_F123ABCE.exe
+
+file=ABI_DIR\BUILD_DIR\t_rmdebug_target_launcher.exe	Sys\Bin\t_rmdebug_target_launcher.exe
+file=ABI_DIR\BUILD_DIR\t_rmdebug_multi_target.exe Sys\Bin\t_rmdebug_multi_target.exe
+
+file=ABI_DIR\BUILD_DIR\t_rmdebug_multi_agent.exe Sys\Bin\t_rmdebug_multi_agent.exe
+file=ABI_DIR\BUILD_DIR\t_multi_agent_launcher.exe Sys\Bin\t_multi_agent_launcher.exe
+
+//PERFORMANCE TEST DEBUGTOKEN
+file=ABI_DIR\BUILD_DIR\OEMDebug_102831E5.exe Sys\Bin\OEMDebug_102831E5.exe
+file=ABI_DIR\BUILD_DIR\t_performance_test.exe Sys\Bin\t_performance_test.exe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_agent_tests/t_agent_eventhandler.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,124 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Implements the handling of run mode events for a particular target executable
+// 
+
+#include <e32base.h>
+#include <e32property.h>
+#include <e32test.h>
+
+#include "t_rmdebug_app.h"
+#include "t_agent_eventhandler.h"
+#include "t_multi_agent.h"
+#include "t_debug_logging.h" 
+
+using namespace Debug;
+
+CAgentAsyncEvent::CAgentAsyncEvent(CMultiAgent& aDriver, const TDesC& aExeName, const TDesC& aExeConfig):
+	CActive(EPriorityStandard), iDriver(aDriver)
+	{
+	}
+
+CAgentAsyncEvent* CAgentAsyncEvent::NewLC(CMultiAgent& aDriver, const TDesC& aExeName, const TDesC& aExeConfig)
+	{
+	CAgentAsyncEvent* self = new(ELeave) CAgentAsyncEvent(aDriver, aExeName, aExeConfig);
+	CleanupStack::PushL(self);
+	self->ConstructL(aExeName, aExeConfig);
+	return self;
+	}
+
+CAgentAsyncEvent* CAgentAsyncEvent::NewL(CMultiAgent& aDriver, const TDesC& aExeName, const TDesC& aExeConfig)
+	{
+	CAgentAsyncEvent* self = CAgentAsyncEvent::NewLC(aDriver, aExeName, aExeConfig);
+	CleanupStack::Pop(); // self
+	return self;
+	}
+
+void CAgentAsyncEvent::ConstructL(const TDesC& aExeName, const TDesC& aExeConfig)
+	{
+	iExeName.CreateL(aExeName);
+	iExeConfig.CreateL(aExeConfig);
+	CActiveScheduler::Add(this);
+	}
+
+CAgentAsyncEvent::~CAgentAsyncEvent()
+	{
+	LOG_MSG2("~CAgentAsyncEvent(), this = 0x%08x", this);
+
+	iSEventInfo.iEventInfoBuf.Delete(0, sizeof(TEventInfo));
+	iExeName.Close();
+	iExeConfig.Close();
+	iProc.Close();
+	Cancel(); // Cancel any request, if outstanding
+	}
+
+/*
+ * Issue request to DSS and notify the active scheduler
+ */
+void CAgentAsyncEvent::Watch()
+	{
+	LOG_MSG2("ENTER: CAgentAsyncEvent::Watch, this = 0x%08x", this);
+	iDriver.DebugDriver().GetEvent(GetExecutable(), iStatus, iSEventInfo.iEventInfoBuf);
+
+	if (!IsActive())
+		{
+		LOG_MSG("CAgentAsyncEvent::Watch(): SetActive()");
+		SetActive();
+		}
+
+	LOG_MSG("EXIT: CAgentAsyncEvent::Watch");
+	}
+
+void CAgentAsyncEvent::RunL()
+	{
+	LOG_MSG4("ENTER: CAgentAsyncEvent::RunL iDebugType=%d, iStatus.Int() %d, this 0x%x08", 
+			 iSEventInfo.iEventInfo.iEventType, iStatus.Int(), this);
+	
+    LOG_MSG2("%S", &TPtr8((TUint8*)GetExecutable().Ptr(), 2*GetExecutable().Length(), 2*GetExecutable().Length()));	
+	iDriver.HandleEvent(iSEventInfo.iEventInfo);
+
+	LOG_MSG2("iDriver.GetNumApps() %d: ", iDriver.GetNumApps());
+	LOG_MSG2("iDriver.iLaunchCompleted  %d: ", iDriver.GetLaunchCompleted());
+
+	if (iDriver.GetLaunchCompleted() < iDriver.GetNumApps())
+		{
+		// Do not call Watch() if target has run to completion but test is still on going
+		if (iSEventInfo.iEventInfo.iEventType != EEventsRemoveProcess)
+			{
+			LOG_MSG("CAgentAsyncEvent::RunL Setting Watch()");
+			Watch();
+			}
+		}
+	else
+		{
+		// Stop event handling for all targets
+		LOG_MSG("CAgentAsyncEvent::RunL CActiveScheduler::Stop() & Cancel");
+		CActiveScheduler::Stop();
+		}
+
+	LOG_MSG2("EXIT: CAgentAsyncEvent::RunL", KNullDesC);
+	}
+
+void CAgentAsyncEvent::DoCancel()
+	{
+	LOG_MSG("CAgentAsyncEvent::DoCancel");
+	}
+
+TInt CAgentAsyncEvent::RunError(TInt aError)
+	{
+	LOG_MSG3(" RunL() has left with error %d, this 0x%08X", aError, this);
+	return aError; 
+	// Can we handle this error? Not at the moment!
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_agent_tests/t_agent_eventhandler.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,90 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Definitions for event handling via the DSS and target specific information
+//
+//
+
+#ifndef RMDEBUG_AGENT_EVENTHANDLER_H
+#define RMDEBUG_AGENT_EVENTHANDLER_H
+
+#include "t_multi_agent.h"
+
+using namespace Debug;
+
+class CMultiAgent;
+
+/**
+ Class for gathering event data from the run-mode driver
+ */
+class TAgentEventInfo
+{
+public:
+	TAgentEventInfo() : 
+	iEventInfoBuf((TUint8*)&iEventInfo, sizeof(TEventInfo), sizeof(TEventInfo))
+	{ 	
+	}
+
+public:
+	// This is the underlying class for event interaction with the Run Mode debug API 
+	TEventInfo			iEventInfo;
+	
+	// A convenience handle for iEventInfo used across the Debug::GetEvent() method 
+	TPtr8				iEventInfoBuf;
+};
+
+/**
+  Active object class used to trap asynchronous events
+  Also, contains target specific parameters
+  */
+class CAgentAsyncEvent : public CActive
+	{
+public:
+	// Close buffers and Cancel and destroy
+	~CAgentAsyncEvent();	
+
+	// Two-phased constructor
+	static CAgentAsyncEvent* NewLC(CMultiAgent& aDriver, const TDesC& aExeName, const TDesC& aExeConfig);
+
+	// Two-phased constructor
+	static CAgentAsyncEvent* NewL(CMultiAgent& aDriver, const TDesC& aExeName, const TDesC& aExeConfig);
+
+	// set up ASP and issue another request	
+	void Watch();
+
+	TDesC& GetExecutable() { return iExeName; }
+ 	TDesC& GetExeConfig() { return iExeConfig; }
+	RProcess& GetProcHandle() { return iProc; }
+
+protected:
+	// from CActive
+	virtual void RunL();
+	virtual void DoCancel();
+	virtual TInt RunError(TInt aError);
+
+private:
+	CAgentAsyncEvent(CMultiAgent& aDriver, const TDesC& aExeName, const TDesC& aExeConfig);
+	void ConstructL(const TDesC& aExeName, const TDesC& aExeConfig);
+
+private:
+	RBuf iExeName;
+	RBuf iExeConfig;
+	RProcess iProc;
+
+	CMultiAgent& iDriver;
+	TAgentEventInfo iSEventInfo;
+	};
+
+#endif // RMDEBUG_AGENT_EVENTHANDLER_H
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_agent_tests/t_multi_agent.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,434 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Tests the run mode debug device component by launching multiple targets 
+// on different CPUs. On a single core the targets run on the same CPU.  
+//
+
+#include <e32base.h>
+#include <e32property.h>
+#include <hal.h>
+#include <e32test.h>
+#include <e32def.h>
+#include <e32svr.h>
+
+
+#include "t_rmdebug_app.h"
+#include "t_multi_agent.h"
+#include "t_agent_eventhandler.h"
+#include "t_debug_logging.h"
+
+const TVersion securityServerVersion(0,1,1);
+
+/**
+ * First phase constructor
+ */
+CMultiAgent* CMultiAgent::NewL()
+	{
+	CMultiAgent* self = new(ELeave) CMultiAgent();
+	self->ConstructL();
+	return self;
+	}
+
+/**
+  * Destructor
+  */
+CMultiAgent::~CMultiAgent()
+	{
+	LOG_MSG("~CMultiTargetAgent\n");
+	iServSession.Close();
+	}
+
+/**
+ * Constructor
+ */
+CMultiAgent::CMultiAgent() 
+	{
+	}
+
+/**
+ * Second phase constructor
+ */
+void CMultiAgent::ConstructL()
+	{
+	}
+
+/**
+  Parse the command line, set agent cpu affinity and call main test function
+  */
+void CMultiAgent::ClientAppL()
+	{
+	LOG_MSG("ENTER: CMultiTargetAgent::ClientAppL"); 
+
+	iNumApps = KNumApps;
+	iAgentCpuNo = KAgentCpu;
+	iTargetNameOffset = KTargetOffset;
+
+	TInt argc = User::CommandLineLength();
+	HBufC* commandLine = NULL;
+	LOG_MSG2(">Launcher Process() argc=%d", argc);
+	
+	if(argc)
+		{
+		commandLine = HBufC::NewLC(argc);
+		TPtr commandLineBuffer = commandLine->Des();
+		User::CommandLine(commandLineBuffer);
+
+		RBuf printCommandLine;
+		CleanupClosePushL(printCommandLine);
+		printCommandLine.CreateL(commandLine->Des().Length());
+		printCommandLine.Copy(commandLine->Des());
+		printCommandLine.Collapse();
+		LOG_MSG2(">command line = %S", &printCommandLine );
+		CleanupStack::PopAndDestroy( &printCommandLine );
+
+		// create a lexer and read through the command line
+		TLex lex(*commandLine);
+	
+		while (!lex.Eos())
+		{
+			// only look for options with first character '-'
+			if (lex.Get() == '-')
+			{
+			TChar arg = lex.Get();
+			
+				switch ( arg )
+				{
+				case 'n':
+					lex.Val( iNumApps );
+					LOG_MSG2("parsed numApps as %d", iNumApps); 
+					break;
+		
+				case 'a':
+					lex.Val( iAgentCpuNo );
+					LOG_MSG2("parsed agentCpuNo as %d", iAgentCpuNo);                        
+					break;
+
+				case 'o':
+					lex.Val( iTargetNameOffset );
+					LOG_MSG2("parsed iTargetNameOffset as %d", iTargetNameOffset);        
+					break;
+
+				default:
+					LOG_MSG("Bad argument from user"); 
+					break;                 
+				}
+			}
+		}
+	}
+	// Create active scheduler (to run active objects)
+	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+	CleanupStack::PushL(scheduler);
+	CActiveScheduler::Install(scheduler);
+	
+	if (iAgentCpuNo)
+		{
+		LOG_MSG2("CMultiAgent::ClientAppL() - setting agent to cpu %d", iAgentCpuNo);
+		UserSvr::HalFunction(EHalGroupKernel, EKernelHalLockThreadToCpu, (TAny *)iAgentCpuNo, 0);
+		}
+
+	TInt err = iServSession.Connect(securityServerVersion);
+	
+	if (err != KErrNone)
+		{
+		User::Panic(_L("Can't open server session"), err);
+		}
+
+	StartTest();
+
+	// Note: below is a workaround to overcome an issue with RTest server crashing 
+	// when writing to the windows console from different agents (on different CPUs 
+	// at the same time). To overcome this we signal the launcher using a global 
+	// semaphore to indicate a RTest complete instead
+	RSemaphore launchSemaphore;
+	CleanupClosePushL(launchSemaphore);
+            
+	TFindSemaphore launchSemFinder(KLaunchSemaphoreSearchString);
+	TFullName semaphoreResult;
+	TInt ret = launchSemFinder.Next(semaphoreResult);
+	LOG_MSG3( "> Find Launch Semaphote.Next ret=%d, %lS", ret, &semaphoreResult);
+         
+	ret = launchSemaphore.OpenGlobal(semaphoreResult);
+	LOG_MSG2( ">OpenGlobal semaphore ret=%d", ret );         
+    
+	LOG_MSG( ">Signalling semaphore" );
+	launchSemaphore.Signal();
+	CleanupStack::PopAndDestroy(&launchSemaphore); // launchSemaphore
+
+	// Delete active scheduler
+	CleanupStack::PopAndDestroy(scheduler);
+
+	if (commandLine)
+	CleanupStack::PopAndDestroy(commandLine);
+	
+	LOG_MSG( "EXIT: CMultiTargetAgent::ClientAppL"); 
+	}
+
+/**
+  Launch a process
+  @param aProcess the RProcess object used to create the process
+  @param aFileName file name of the executable used to create the process
+  @return KErrNone on success, or one of the other system wide error codes
+  */
+TInt CMultiAgent::LaunchProcess(RProcess& aProcess, const TDesC& aExeName, const TDesC& aCommandLine)    
+	{
+	LOG_MSG( "ENTER: CMultiAgent::LaunchProcess");
+    LOG_MSG2("%S", &TPtr8((TUint8*)aExeName.Ptr(), 2*aExeName.Length(), 2*aExeName.Length()));	
+	
+	// wait for 0.5 seconds due to issue with creating several processes in smp quickly
+	User::After(500000);
+	
+	TInt err = aProcess.Create( aExeName, aCommandLine );
+	LOG_MSG2( "CMultiAgent::LaunchProcess, aProcess.Create err = %d", err); 
+
+	// check that there was no error raised
+	if (err != KErrNone)
+		return err;
+	
+	// rendezvous with process
+	TRequestStatus status = KRequestPending;
+	aProcess.Rendezvous(status);
+
+	if (KRequestPending != status.Int())
+		{
+		// startup failed so kill the process
+		LOG_MSG2( "> RProcess Rendezvous() failed with %d. Killing process", status.Int() );
+		aProcess.Kill(KErrNone);
+		LOG_MSG( "EXIT: CMultiAgent::LaunchProcess");
+		return status.Int();
+		}
+	else
+		{
+		// start the test target
+		aProcess.Resume();
+		User::WaitForRequest(status);
+	
+		LOG_MSG2( "> CMultiAgent::LaunchProcess: RProcess Resume() Rendezvous successful %d: ", status.Int() );
+
+		if(KErrNone != status.Int())
+			{
+			LOG_MSG2( "> RProcess Resume() failed with %d. Killing process", status.Int() );
+			aProcess.Kill(KErrNone);
+			}
+
+		LOG_MSG( "EXIT: CMultiAgent::LaunchProcess");
+		return status.Int();
+		}
+	}
+
+/**
+  Handle Event
+  @param aEventInfo object containing event information from the DSS 
+  */
+void CMultiAgent::HandleEvent(TEventInfo& aEventInfo)
+	{
+	LOG_MSG( "ENTER: CMultiAgent::HandleEvent" ); 
+	TInt ret = KErrNone;
+	const TInt idValid = 1;
+	
+	switch ( aEventInfo.iEventType )
+		{
+		case EEventsAddProcess:
+			{
+			LOG_MSG(">> EEventsAddProcess");                        
+			TPtrC8 exeNamePtr8(aEventInfo.iAddProcessInfo.iFileName, aEventInfo.iAddProcessInfo.iFileNameLength);
+	
+			RBuf8 exeName8;
+			CleanupClosePushL(exeName8);
+			exeName8.CreateL(exeNamePtr8);
+			LOG_MSG2("From event: exeName8=%S", &exeName8);
+			CleanupStack::PopAndDestroy(&exeName8);
+			LOG_MSG("Testing if event process id is valid");
+
+			LOG_MSG2("Got aEventInfo.iProcessId=%d", I64LOW( aEventInfo.iProcessId));
+			__ASSERT_ALWAYS((aEventInfo.iProcessIdValid==idValid), User::Panic(_L("ProcessId Invalid"), aEventInfo.iProcessIdValid));
+	
+			RProcess targetProc;
+			ret = targetProc.Open(TProcessId(aEventInfo.iProcessId));
+			LOG_MSG2("RProcess open ret=%d", ret);
+			targetProc.Close();
+
+			__ASSERT_ALWAYS((ret == KErrNone), User::Panic(_L("ProcessId Invalid"), aEventInfo.iProcessIdValid));
+			break;
+			}
+	
+		case EEventsStartThread:
+			{
+			LOG_MSG(">> EEventsStartThread");                
+			TPtrC8 exeNamePtr8(aEventInfo.iStartThreadInfo.iFileName, aEventInfo.iStartThreadInfo.iFileNameLength);
+			RBuf8 exe8Name;
+			CleanupClosePushL(exe8Name);
+			exe8Name.CreateL(exeNamePtr8);
+			LOG_MSG2("From event: exeName8=%S", &exe8Name);
+			CleanupStack::PopAndDestroy(&exe8Name);
+	
+			LOG_MSG("Testing if event process id is valid" );
+
+			__ASSERT_ALWAYS((aEventInfo.iProcessIdValid==idValid), User::Panic(_L("ProcessId Invalid"), aEventInfo.iProcessIdValid));
+
+			LOG_MSG2("Got aEventInfo.iProcessId=%d", I64LOW(aEventInfo.iProcessId));
+
+			LOG_MSG("Testing if event thread id is valid");
+
+			__ASSERT_ALWAYS((aEventInfo.iThreadIdValid==idValid), User::Panic(_L("ThreadId Invalid"), aEventInfo.iThreadIdValid));
+
+			LOG_MSG2("Got aEventInfo.iThreadId=%d", I64LOW(aEventInfo.iThreadId));
+			break;                    
+			}                       
+
+		case EEventsUserTrace:
+			{
+			LOG_MSG(">> EEventsUserTrace");  
+			break;
+			}
+
+		case EEventsRemoveProcess:
+			{
+			LOG_MSG( ">> EEventsRemoveProcess");                        
+			iLaunchCompleted++; 
+			break;
+			}
+	
+		default:   
+			{
+			LOG_MSG( ">> Unknown event - probably due to DSS busy?");
+			break;
+			}	
+		}
+ 	 
+	LOG_MSG("EXIT: CMultiAgent::HandleEvent"); 
+	}
+
+/**
+ * Main test function which launches several targets and stresses the DSS 
+ */
+TInt CMultiAgent::StartTest()
+	{
+	LOG_MSG("ENTER: CMultiTargetAgent::StartTest");
+
+	for( TInt i = 0; i < iNumApps; i++ )
+		{
+		RBuf targetName;
+		RBuf launcherOptions;
+
+		CleanupClosePushL(targetName); 
+		CleanupClosePushL(launcherOptions); 
+
+		targetName.CreateL( KTargetExe().Length() + 2 );
+		targetName.Format( KTargetExe(), i + iTargetNameOffset + 1 );
+
+		LOG_MSG2("App %d: ", i+1);
+		LOG_MSG2("%S", &TPtr8((TUint8*)targetName.Ptr(), 2*targetName.Length(), 2*targetName.Length()));	
+
+		launcherOptions.CreateL( KTargetOptions().Length() + 2 );
+		launcherOptions.Format( KTargetOptions(), (TUint)ENormalExit, (i+1) );
+
+		LOG_MSG( "AppOptions : ");
+		LOG_MSG2("%S", &TPtr8((TUint8*)launcherOptions.Ptr(), 2*launcherOptions.Length(), 2*launcherOptions.Length()));	
+		
+		// Add each test target to array
+		iTargetList.AppendL(CAgentAsyncEvent::NewL(*this, targetName, launcherOptions));
+		CleanupStack::PopAndDestroy(2, &targetName );
+		}
+	
+	iLaunchCompleted = 0;
+	TInt err = KErrNone;
+		
+	for (TInt i = 0; i < iNumApps; i++)
+		{
+		// Attach to process non-passively
+		LOG_MSG2( ">AttachExecutable app %d ", i + iTargetNameOffset + 1 );
+		LOG_MSG2("%S", &TPtr8((TUint8*)iTargetList[i]->GetExecutable().Ptr(), 2*iTargetList[i]->GetExecutable().Length(), 
+					2*iTargetList[i]->GetExecutable().Length()));
+
+		err = iServSession.AttachExecutable( iTargetList[i]->GetExecutable(), EFalse);
+		__ASSERT_ALWAYS((err == KErrNone), User::Panic(_L("DSS Attach failed"), err));
+
+		// Continue on interested event actions
+		LOG_MSG2( ">SetEventAction app %d,  EEventsStartThread EAcionContinue", i + iTargetNameOffset + 1);
+
+		err = iServSession.SetEventAction( iTargetList[i]->GetExecutable(), EEventsStartThread, EActionContinue);
+		__ASSERT_ALWAYS((err==KErrNone), User::Panic(_L("SetEventAction Error"), err));
+	
+		LOG_MSG2(">SetEventAction app %d,  EEventsAddProcess EActionContinue", i + iTargetNameOffset + 1);
+		err = iServSession.SetEventAction( iTargetList[i]->GetExecutable(), EEventsAddProcess, EActionContinue);
+		__ASSERT_ALWAYS((err==KErrNone), User::Panic(_L("SetEventAction Error"), err));
+
+		LOG_MSG2(">SetEventAction app %d,  EEventsUserTrace EActionContinue", i + iTargetNameOffset + 1);
+		err = iServSession.SetEventAction( iTargetList[i]->GetExecutable(), EEventsUserTrace, EActionContinue);
+		__ASSERT_ALWAYS((err==KErrNone), User::Panic(_L("SetEventAction Error"), err));
+	
+		LOG_MSG2(">SetEventAction app %d,  EEventsRemoveProcess EActionContinue", i + iTargetNameOffset + 1);
+		err = iServSession.SetEventAction( iTargetList[i]->GetExecutable(), EEventsRemoveProcess, EActionContinue);
+		__ASSERT_ALWAYS((err==KErrNone), User::Panic(_L("SetEventAction Error"), err));
+
+		// Add target object to active schedular
+		iTargetList[i]->Watch();
+		}
+
+	for (TInt i= 0; i< iNumApps; i++)
+		{
+		LOG_MSG( ">Calling LaunchProcess function");
+		err = LaunchProcess(iTargetList[i]->GetProcHandle(), iTargetList[i]->GetExecutable(), iTargetList[i]->GetExeConfig());
+		__ASSERT_ALWAYS((err==KErrNone), User::Panic(_L("LaunchProcess failed"), err));
+		}
+
+	LOG_MSG( ">CActiveScheduler::Start()");
+	CActiveScheduler::Start();
+
+	for (TInt i= 0; i < iNumApps; i++)
+		{
+		// Now detach again
+		LOG_MSG( "Before iServSession.DetachExecutable" );
+		err = iServSession.DetachExecutable(iTargetList[i]->GetExecutable());
+		__ASSERT_ALWAYS((err==KErrNone), User::Panic(_L("DetachExecutable failed"), err));
+		}
+	
+	// Free all the memory
+	iTargetList.ResetAndDestroy();
+	LOG_MSG( "EXIT: CMultiTargetAgent::StartTest" );
+
+	return KErrNone;
+	}
+
+/**
+  * Entry point for run mode debug driver test
+  */
+GLDEF_C TInt E32Main()
+	{
+	LOG_MSG( "ENTER: Multi_agent E32Main ");
+	__UHEAP_MARK;
+
+	TInt ret = KErrNone;
+	RProcess::Rendezvous(KErrNone);
+	
+	CTrapCleanup* trap = CTrapCleanup::New();
+		
+	if (!trap)
+		return KErrNoMemory;
+	
+	CMultiAgent *runModeAgent = CMultiAgent::NewL();
+
+	if (runModeAgent != NULL)
+		{
+		TRAP(ret,runModeAgent->ClientAppL());
+		LOG_MSG2( "ClientAppL returned %d", ret );
+		delete runModeAgent;
+		}
+
+	delete trap;
+	__UHEAP_MARKEND;
+	LOG_MSG( "EXIT: Multi_agent E32Main ");
+	return ret;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_agent_tests/t_multi_agent.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,110 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Definitions for the run mode debug tests
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef RMDEBUG_MULTI_AGENT_H
+#define RMDEBUG_MULTI_AGENT_H
+
+#include <u32hal.h>
+#include <f32file.h>
+#include <rm_debug_api.h>
+
+using namespace Debug;
+
+_LIT(KLaunchSemaphoreName, "t_rmdebug_launch_semaphore");
+_LIT(KLaunchSemaphoreSearchString, "t_rmdebug_launch_semaphore*");
+
+// Currently the targets are instances of t_rmdebug_app.exe
+_LIT(KTargetExe,"z:\\sys\\bin\\t_rmdebug_app%d.exe");
+
+_LIT(KTargetOptions,"-f%d -a%d");
+
+// If changing this, make sure there are enough apps built/in the rom 
+const TInt KNumApps = 5;
+
+// Default CPU execution for Agent
+const TInt KAgentCpu = 0;
+
+// Workaround to ensure we have the same agent binary when running multiple agents
+const TInt KTargetOffset = 0;
+
+class CAgentAsyncEvent;
+
+/**
+  @Class CRunModeAgent
+  
+  The basic run mode agent
+  */
+class CMultiAgent : public CBase
+	{
+	public:
+	static CMultiAgent* NewL();
+	~CMultiAgent();
+	void ClientAppL();  
+	RSecuritySvrSession&  DebugDriver() { return iServSession; };	
+	void HandleEvent(TEventInfo& aSEventInfo);
+
+	public:
+	TInt GetLaunchCompleted() const { return iLaunchCompleted; }
+	TInt GetNumApps() const { return iNumApps; }
+	TInt GetTargetOffset() const { return iTargetNameOffset; }
+
+	private:
+	CMultiAgent();
+	void ConstructL();
+	TInt StartTest();
+	TInt LaunchProcess(RProcess& aProcess, const TDesC& aExeName, const TDesC& aCommandLine);
+	
+	private:
+
+	/**
+	 * CPU agent executes on; by default this is 0 
+	 */
+	TInt iAgentCpuNo;
+
+	/*
+	 * Offset for running multiple targets using the same agent
+	 */
+	TInt iTargetNameOffset;
+
+	/** 
+	 * Number of applications/targets per agent
+	 */
+	TInt iNumApps;
+
+	/**
+	 * Flag used for terminating the event handling for a target 
+	 */	
+	TInt iLaunchCompleted;
+
+	/*
+	 * Handle to DSS
+	 */
+	RSecuritySvrSession iServSession;
+	
+	/**
+	 * Array to target parameters required by the agent
+	 */	
+	RPointerArray<CAgentAsyncEvent> iTargetList;
+	};
+
+#endif // RMDEBUG_MULTI_AGENT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_agent_tests/t_multi_agent_launcher.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,229 @@
+// 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 the License "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:
+// Helper app to launch debug targets
+//
+//
+
+#include "t_multi_agent_launcher.h"
+
+#include "t_debug_logging.h"
+
+/**
+ * Launch a process
+ * @param aProcess the RProcess object used for creating the process
+ * @param aExeName the name of the executable to run 
+ * @param aCommandLine command line parameters to pass when creating the process 
+ * @return KErrNone on success, or one of the other system wide error codes
+ */
+TInt LaunchProcess(RProcess& aProcess, TDesC& aExeName, TDesC& aCommandLine )    
+	{
+	LOG_MSG("ENTER: t_multi_agent_launcher: launchProcess"); 
+
+	LOG_MSG2("aExeName %S ", &TPtr8((TUint8*)aExeName.Ptr(), 2*aExeName.Length(), 2*aExeName.Length()));
+	LOG_MSG2("aCommandLine %S", &TPtr8((TUint8*)aCommandLine.Ptr(), 2*aCommandLine.Length(), 2*aCommandLine.Length()));
+
+	TInt err = aProcess.Create( aExeName, aCommandLine );
+	LOG_MSG2("t_multi_agent_launcher launchProcess, aProcess.Create err = %d", err); 
+
+	// check that there was no error raised
+	if(err != KErrNone)
+		{
+		return err;
+		}
+
+	// rendezvous with process
+	TRequestStatus status = KRequestPending;
+	aProcess.Rendezvous(status);
+
+	if(KRequestPending != status.Int())
+		{
+		// startup failed so kill the process
+		LOG_MSG2("t_multi_agent_launcher: launchProcess: RProcess Rendezvous() failed with %d. Killing process", status.Int());
+		aProcess.Kill(KErrNone);
+		return status.Int();
+		}
+	else
+		{
+		aProcess.Resume();
+		User::WaitForRequest(status);
+
+		LOG_MSG2("t_multi_agent_launcher: launchProcess: RProcess Resume() Rendezvous successful %d: ", status.Int());
+
+		if(KErrNone != status.Int())
+			{
+			LOG_MSG2("t_multi_agent_launcher: RProcess Resume() failed with %d. Killing process", status.Int());
+			aProcess.Kill(KErrNone);
+			}
+
+		LOG_MSG("EXIT: t_multi_agent_launcher launchProcess");
+		return status.Int();
+		}
+	}
+
+/**
+ * Read command line parameters and control the launching of the agents. 
+ */
+void MainL()
+	{	
+	LOG_MSG( "ENTER: t_multi_agent_launcher MainL()");
+
+	TInt ret = KErrNone;
+	TInt numAgents = KNumAgents;
+	TInt numTargets = KNumTargets;
+	TInt numTestRuns = KNumTestRuns;
+
+	TInt argc = User::CommandLineLength();
+	HBufC* commandLine = NULL;
+	LOG_MSG2("t_multi_agent_launcher: MainL(): argc=%d", argc);
+    
+	if(argc)
+		{
+		commandLine = HBufC::NewLC(argc);
+		TPtr commandLineBuffer = commandLine->Des();
+		User::CommandLine(commandLineBuffer);
+
+		RBuf printCommandLine;
+		CleanupClosePushL( printCommandLine );
+		printCommandLine.CreateL( commandLine->Des().Length() );
+		printCommandLine.Copy( commandLine->Des() );
+		printCommandLine.Collapse();
+		LOG_MSG2("t_multi_agent_launcher: command line = %S", &printCommandLine);
+		CleanupStack::PopAndDestroy( &printCommandLine );
+ 
+		// create a lexer and read through the command line
+		TLex lex(*commandLine);
+		while (!lex.Eos())
+			{
+			// only look for options with first character '-'
+			if (lex.Get() == '-')
+				{
+					TChar arg = lex.Get();
+					switch ( arg )
+						{
+						case 'n':
+							lex.Val( numAgents );
+							LOG_MSG2("t_multi_agent_launcher: parsed numAgents as %d", numAgents);
+							break;
+						case 'm':
+							lex.Val( numTargets );
+							LOG_MSG2("t_multi_agent_launcher: parsed numTargets as %d", numTargets);                        
+							break;  
+						case 't':
+							lex.Val( numTestRuns );
+							LOG_MSG2("t_multi_agent_launcher: parsed numTestRuns as %d", numTestRuns);                        
+							break;                    
+						default:
+							LOG_MSG("t_multi_agent_launcher: unknown argument ignoring it");
+							break;                 
+						}
+				}
+			}
+		}
+
+	// Note: below is a workaround to overcome an issue with RTest server crashing 
+	// when writing to the windows console from different agents (on different CPUs 
+	// at the same time). To overcome this we get signaled by the agents when they have 
+	// completed their tests so that we can do a RTest complete
+	RSemaphore launchSemaphore;
+	CleanupClosePushL(launchSemaphore);
+	ret = launchSemaphore.CreateGlobal(KLaunchSemaphoreName, 0);
+	LOG_MSG2( ">Target Launcher : RSemaphore.CreateGlobal ret %d", ret);
+	User::LeaveIfError( ret );
+
+	ret = launchSemaphore.OpenGlobal(KLaunchSemaphoreName);
+	LOG_MSG2( ">Target Launcher : RSemaphore.OpenGlobal ret %d", ret);
+	User::LeaveIfError( ret );
+
+	//Now launch the requested number of apps for the requested number of test runs
+	for( TInt j = 0; j < numTestRuns; j++ )
+		{ 
+			for( TInt i = 0; i < numAgents; i++ )  
+				{
+					RBuf targetName;
+					targetName.CleanupClosePushL();
+					targetName.CreateL(KAgentExe());
+
+					RProcess aProc;
+					CleanupClosePushL(aProc); 
+					RBuf launcherOptions;
+					CleanupClosePushL(launcherOptions);
+				    const TInt additionalWords = 2;	
+					launcherOptions.CreateL( KAgentOptions().Length() + additionalWords );
+		
+					// Apply offset: launcherOptions.Format( .., .., i * numTargets, ..)
+					// workaround to ensure we have the same binary for multiple agents. 
+					// e.g. So if offset = 0, agent attaches to app1, app2, app3, app4, app5
+					// if offset = 5, agent attached to app6, app7, app8, app9, app10 etc.
+					// Note: apps need to be in rom otherwise the agent will fail on an assert 
+					// (with KErrNotFound)
+					launcherOptions.Format( KAgentOptions(), (TUint)numTargets, i * numTargets, 0);
+			
+					ret = LaunchProcess( aProc, targetName, launcherOptions );	
+					CleanupStack::PopAndDestroy(3,&targetName);
+					User::LeaveIfError(ret);
+				}
+		}
+
+	// Wait for all agents to do their testing before checking the semaphore
+	User::After(12000000);
+
+	LOG_MSG( ">Target Launcher:  Semaphore wait");
+
+	for (TInt i = 0; i < numAgents; i ++)
+		{
+		//We need this delay just in case an agent crashes and never signals the sem
+		ret = launchSemaphore.Wait(100000);
+		if( ret != KErrNone )
+			{
+			LOG_MSG3("launchSemaphore.Wait ret %d for agent %d", ret, i);
+			break;
+			}
+		}
+
+	LOG_MSG2( "testing for Semaphore ret %d", ret);
+
+	// We only want to have one RTest instance at any one time since otherwise RTest can panic
+	RTest test(_L("T_MULTI_AGENT_LAUNCHER"));
+	test.Start(_L("t_multi_agent_launcher Check for agents finishing correctly"));
+	test(ret == KErrNone);
+	test.End();
+	test.Close();
+
+	CleanupStack::PopAndDestroy(&launchSemaphore); // launchSemaphore
+
+	if( commandLine )
+	CleanupStack::PopAndDestroy(commandLine);
+	
+	LOG_MSG("EXIT: t_multi_agent_launcher MainL()");
+	}
+ 
+GLDEF_C TInt E32Main()
+	{
+	LOG_MSG("ENTER: Multi_agent_launcher E32Main()");
+	__UHEAP_MARK;
+
+	CTrapCleanup* trap = CTrapCleanup::New();
+	if (!trap)
+		return KErrNoMemory;
+
+	TRAPD(err, MainL());
+	LOG_MSG2("Multi_agent_launcher: returning from MainL(), err = %d", err);
+	
+	delete trap;
+	LOG_MSG("EXIT: Multi_agent_launcher E32Main()");
+	__UHEAP_MARKEND;
+
+	return err;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_agent_tests/t_multi_agent_launcher.h	Tue Aug 31 16:45:49 2010 +0300
@@ -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 the License "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:
+// Definitions for agent launcher
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef RMDEBUG_MULTI_AGENT_LAUNCHER_H
+#define RMDEBUG_MULTI_AGENT_LAUNCHER_H
+
+#include <e32test.h>
+
+// Default test runs
+const TInt KNumTestRuns = 1; 
+
+// Default number of targets per agent
+const TInt KNumTargets = 5;
+
+// Default number of agents, if changing this make sure there are enough apps being built 
+const TInt KNumAgents = 2; 
+
+_LIT(KAgentExe,"z:\\sys\\bin\\t_rmdebug_multi_agent.exe");
+_LIT(KAgentOptions,"-n%d -o%d -a%d");
+
+_LIT(KLaunchSemaphoreName, "t_rmdebug_launch_semaphore");
+_LIT(KLaunchSemaphoreSearchString, "t_rmdebug_launch_semaphore*");
+
+#endif // RMDEBUG_MULTI_AGENT_LAUNCHER_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_target_tests/t_multi_target.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,405 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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 the ability of the debug system to handle events from several debug targets
+//
+//
+
+#include <e32base.h>
+#include <e32property.h>
+
+#include <hal.h>
+#include <e32test.h>
+
+#include "t_multi_target.h"
+#include "t_target_launcher.h"
+#include "t_rmdebug_app.h"
+
+#ifdef KERNEL_OOM_TESTING
+  #ifdef USER_OOM_TESTING
+    #error "Cannot define both KERNEL_OOM_TESTING and USER_OOM_TESTING"
+  #endif
+#endif
+
+
+using namespace Debug;
+
+const TVersion securityServerVersion(0,1,1);
+
+const TVersion testVersion(2,1,0);
+
+#ifdef NO_DEBUGTOKEN
+LOCAL_D RTest test(_L("T_RMDEBUG_MULTI_TARGET"));
+#endif
+
+#ifdef SOMECAPS_DEBUGTOKEN
+LOCAL_D RTest test(_L("T_RMDEBUG_MULTI_TARGET_OEM"));
+#endif
+
+#ifdef FEWCAPS_DEBUGTOKEN
+LOCAL_D RTest test(_L("T_RMDEBUG_MULTI_TARGET_OEM2"));
+#endif
+
+
+
+CMultiTargetAgent* CMultiTargetAgent::NewL()
+//
+// CMultiTargetAgent::NewL
+//
+  {
+  CMultiTargetAgent* self = new(ELeave) CMultiTargetAgent();
+
+  self->ConstructL();
+
+  return self;
+  }
+
+
+CMultiTargetAgent::~CMultiTargetAgent()
+//
+// CMultiTargetAgent destructor
+//
+    {
+    RDebug::Printf("~CMultiTargetAgent\n");
+    iServSession.Close();
+    }
+
+
+CMultiTargetAgent::CMultiTargetAgent() : 
+    iEventPtr( (TUint8*)&iEventInfo, sizeof(TEventInfo) )
+    {
+    }
+
+
+void CMultiTargetAgent::ConstructL()
+//
+// CMultiTargetAgent::ConstructL
+//
+  {
+  }
+
+/**
+ * Helper code for the stepping tests. Returns the number of nanokernel ticks in one second.
+ *
+ * @return Number of nanokernel ticks. 0 if unsuccesful.
+ */
+TInt CMultiTargetAgent::HelpTicksPerSecond(void)
+  {
+  TInt nanokernel_tick_period;
+  HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period);
+
+  ASSERT(nanokernel_tick_period != 0);
+
+  static const TInt KOneMillion = 1000000;
+
+  return KOneMillion/nanokernel_tick_period;
+  }
+
+void CMultiTargetAgent::ClientAppL()
+//
+// Performs each test in turn
+//
+  {
+  test.Start(_L("ClientAppL"));
+  TInt err = iServSession.Connect(securityServerVersion);
+  if (err != KErrNone)
+      {
+      User::Panic(_L("Can't open server session"), err);
+      }
+  SetupDebugServerL();
+  LaunchTargetsInOrderL();
+  RDebug::Printf( "returning from CMultiTargetAgent::ClientAppL" );
+  test.End();
+  }
+
+/**
+  Launch a process
+
+  @param aProcess The RProcess object to use to create the process
+  @param aExeName File name of the executable to create the process from
+  @param aCommandLine The command line to pass to the new process
+  @return KErrNone on success, or one of the other system wide error codes
+  */
+TInt CMultiTargetAgent::LaunchProcess(RProcess& aProcess, TDesC & aExeName, TDesC & aCommandLine )
+    {    
+    TInt err = aProcess.Create( aExeName, aCommandLine );    
+    if(err != KErrNone)
+        {
+        RDebug::Printf( "aProcess.Create ret %d", err);
+        return err;
+        }
+
+    TRequestStatus status = KRequestPending;
+    aProcess.Rendezvous(status);
+    if(KRequestPending != status.Int())
+        {
+        // startup failed so kill the process
+        aProcess.Kill(KErrNone);
+        return status.Int();
+        }
+    else
+        {
+        // start up succeeded so resume the process
+        aProcess.Resume();
+        // Give the process a chance to run
+        User::After( 500000 );
+        return KErrNone;
+        }
+    }
+
+void CMultiTargetAgent::SetupDebugServerL()
+    {
+    RDebug::Printf( "CMultiTargetAgent::SetupDebugServerL" );
+    test.Next(_L("SetupDebugServerL\n"));
+    iTargets.ReserveL( KNumApps );
+
+    RBuf targetName;
+    CleanupClosePushL( targetName );
+
+    for( TInt numApps = 0; numApps < KNumApps; numApps++ )
+        {
+        iTargets.AppendL( targetName );
+        RDebug::Printf( "Attach to DSS for app %d ", numApps );
+
+        iTargets[numApps].CreateL( KTargetExe().Length() + 2 );
+        iTargets[numApps].Format( KTargetExe(), numApps+1 );
+
+        TInt ret = iServSession.AttachExecutable( iTargets[numApps], EFalse );
+        test( ret == KErrNone );
+
+        RDebug::Printf( ">SetEventAction app %d,  EEventsStartThread EActionSuspend", numApps );
+        ret = iServSession.SetEventAction( iTargets[numApps], EEventsStartThread, EActionSuspend );
+        test( ret == KErrNone );
+
+        RDebug::Printf( ">SetEventAction app %d,  EEventsAddProcess EActionContinue", numApps );
+        ret = iServSession.SetEventAction( iTargets[numApps], EEventsAddProcess, EActionContinue );
+        test( ret == KErrNone );
+
+        RDebug::Printf( ">SetEventAction app %d,  EEventsRemoveProcess EActionContinue", numApps );
+        ret = iServSession.SetEventAction( iTargets[numApps], EEventsRemoveProcess, EActionContinue );
+        test( ret == KErrNone );
+        }
+
+    CleanupStack::PopAndDestroy( &targetName ); // targetName
+
+    }
+
+
+
+TInt CMultiTargetAgent::LaunchTargetsInOrderL()
+    {
+    RDebug::Printf( "CMultiTargetAgent::LaunchTargetsInOrderL" );
+    
+    RBuf launcher;
+    CleanupClosePushL( launcher );
+    launcher.CreateL( KLauncherExe() );
+    
+    RBuf launcherOptions;
+    CleanupClosePushL( launcherOptions ); 
+    launcherOptions.CreateL( KTargetOptions().Length() + 2 );
+    launcherOptions.Format( KTargetOptions(), (TUint)ENormalExit );
+
+    RDebug::Printf( ">LaunchProcess()" );
+    RProcess launcherProc; 
+    CleanupClosePushL( launcherProc );
+    
+    TInt ret = LaunchProcess( launcherProc, launcher, launcherOptions );
+    RDebug::Printf( "<LaunchProcess() ret %d", ret );
+    
+    CleanupStack::PopAndDestroy( &launcherProc ); // launcherProc
+    CleanupStack::PopAndDestroy( &launcherOptions ); // launcherOptions
+    CleanupStack::PopAndDestroy( &launcher ); //launcher 
+
+    test( ret == KErrNone );
+    
+    RSemaphore launchSemaphore;   
+    CleanupClosePushL( launchSemaphore );
+            
+    TFindSemaphore launchSemFinder( KLaunchSemaphoreNameSearchString );
+    TFullName semaphoreResult;
+    ret = launchSemFinder.Next(semaphoreResult);
+    RDebug::Printf( ">  Find Launch Semaphote.Next ret=%d, %lS", ret, &semaphoreResult );
+    test( ret == KErrNone );   
+     
+    ret = launchSemaphore.OpenGlobal( semaphoreResult );
+    RDebug::Printf( "> OpenGlobal semaphore ret=%d", ret );         
+    test( ret == KErrNone );    
+    
+    TBool thisLaunchCompleted; 
+
+    test.Next(_L("LaunchTargetsInOrderL\n"));
+    for( TInt numLaunches = KNumLaunches; numLaunches > 0; numLaunches-- )
+        {
+        for( TInt numApps = KNumApps; numApps > 0; numApps-- )
+            {
+            thisLaunchCompleted = EFalse;
+            // This will trigger the launcher app to launch the next target
+            RDebug::Printf( " >Semaphore.Signal app=%d, launch=%d", numApps, numLaunches);
+            launchSemaphore.Signal();
+            
+            RBuf8 tgt8Name; 
+            CleanupClosePushL( tgt8Name );
+           
+            RBuf tgtCollapseName;
+            CleanupClosePushL( tgtCollapseName );
+                    
+            tgtCollapseName.CreateL( iTargets[numApps-1] );
+            tgt8Name.CreateL( tgtCollapseName.Collapse() );
+            
+
+            while( ! thisLaunchCompleted )
+                {
+                RDebug::Printf( ">GetEvent app %d for %S", numApps, &tgt8Name );
+                iServSession.GetEvent( iTargets[numApps-1], iStatus, iEventPtr );
+          
+                // Wait for the target to get started.
+                RDebug::Printf( " >Wait for event from target app=%d, launch=%d\n", numApps, numLaunches);
+                User::WaitForRequest( iStatus );
+                RDebug::Printf( " <Wait for request returned with status %d", iStatus.Int() );
+                test( iStatus==KErrNone );
+    
+                RDebug::Printf( " > Got iEventType =%d, app=%d", iEventInfo.iEventType, numApps );
+                switch( iEventInfo.iEventType )
+                    {
+                    case EEventsAddProcess:
+                        {
+                        RDebug::Printf( "Got EEventsAddProcess" );                        
+                        TPtrC8 exeNamePtr8( iEventInfo.iAddProcessInfo.iFileName, iEventInfo.iAddProcessInfo.iFileNameLength );
+                        
+                        RBuf8 exeName8;
+                        CleanupClosePushL( exeName8 );
+                        exeName8.CreateL( exeNamePtr8 );
+                        RDebug::Printf( " from event: exeName8=%S", &exeName8 );
+                        CleanupStack::PopAndDestroy( &exeName8 );
+                        
+                        RBuf8 compareName8;
+                        CleanupClosePushL( compareName8 );
+                        compareName8.CreateL( KTargetExeName().Length() + 10 );
+                        compareName8.Format( KTargetExeName(), numApps );
+                        RDebug::Printf( " comparing to: compareName8=%S", &compareName8 );
+                        
+                        test( compareName8.CompareC( exeNamePtr8 ) == 0 );
+                        CleanupStack::PopAndDestroy( &compareName8 );
+
+                        RDebug::Printf( "Testing if event process id is valid" );
+                        test( iEventInfo.iProcessIdValid );
+                        RDebug::Printf( "Got iEventInfo.iProcessId=%d", I64LOW( iEventInfo.iProcessId ) );
+                        
+                        RProcess targetProc;
+                        ret = targetProc.Open( TProcessId( iEventInfo.iProcessId ) );
+                        RDebug::Printf( "RProcess open ret=%d",ret );
+                        targetProc.Close();
+                        test( ret == KErrNone );
+                        
+                        break;
+                        }//EEventsAddProcess
+                        
+                    case EEventsStartThread:
+                        {
+                        RDebug::Printf( "Got EEventsStartThread" );
+                         
+                        TPtrC8 exeNamePtr8( iEventInfo.iStartThreadInfo.iFileName, iEventInfo.iStartThreadInfo.iFileNameLength );
+                        RBuf8 exe8Name;
+                        CleanupClosePushL( exe8Name );
+                        exe8Name.CreateL( exeNamePtr8 );
+                        RDebug::Printf( " from event: exeName8=%S", &exe8Name );
+                        CleanupStack::PopAndDestroy( &exe8Name );
+                        
+                        test( tgt8Name.CompareC( exeNamePtr8 ) == 0 );
+                        
+                        RDebug::Printf( "Testing if event process id is valid" );
+                        test( iEventInfo.iProcessIdValid );
+                        RDebug::Printf( "Got iEventInfo.iProcessId=%d", I64LOW( iEventInfo.iProcessId ) );
+                         
+                        RDebug::Printf( "Testing if event thread id is valid" );
+                        test( iEventInfo.iThreadIdValid );
+                        RDebug::Printf( "Got iEventInfo.iThreadId=%d", I64LOW( iEventInfo.iThreadId ) );
+                        
+                        RThread targetThread;
+                        CleanupClosePushL( targetThread );
+                        
+                        ret = targetThread.Open( TThreadId( iEventInfo.iThreadId ) );
+                        RDebug::Printf( "RThread open ret=%d", ret );
+                        test( ret == KErrNone ); 
+                         
+                        test( iEventInfo.iThreadId == targetThread.Id() );  
+
+                        RDebug::Printf( "Resuming thread for app=%d, id=%d", numApps, I64LOW( targetThread.Id() ));
+                        ret = iServSession.ResumeThread( iEventInfo.iThreadId );
+                        CleanupStack::PopAndDestroy( &targetThread );
+                        
+                        test( ret == KErrNone );
+                        
+                        ret = iServSession.ResumeThread( iEventInfo.iThreadId );
+                        break;                    
+                        }//case EEventsStartThread                        
+
+                    case ( EEventsRemoveProcess ):
+                        {
+                        RDebug::Printf( "*** Got EEventsRemoveProcess. app%d has exited. Moving on to next app", numApps );                        
+                        thisLaunchCompleted = ETrue;
+                        break;
+                        }
+                        
+                    default :   
+                        RDebug::Printf( "Got unknown event" );
+                        test( EFalse );
+                        break;
+                    }
+                }//while
+
+            CleanupStack::PopAndDestroy( &tgtCollapseName ); // tgtCollapseName
+            CleanupStack::PopAndDestroy( &tgt8Name ); // tgt8Name 
+            }
+        }    
+
+    launchSemaphore.Signal();
+    
+	CleanupStack::PopAndDestroy( &launchSemaphore ); // launchSemaphore
+  
+	for( TInt i = iTargets.Count()-1; i>=0; i-- )
+		{
+		RDebug::Printf( "Closing target %d", i );
+		iTargets[ i ].Close();
+		}
+
+	iTargets.Close();
+	
+	return KErrNone;
+    }
+
+
+GLDEF_C TInt E32Main()
+    {
+    TInt ret = KErrNone;
+   
+  
+    CTrapCleanup* trap = CTrapCleanup::New();
+    if (!trap)
+      return KErrNoMemory;
+    test.Title();
+   
+    CMultiTargetAgent *runModeAgent = CMultiTargetAgent::NewL();
+    if (runModeAgent != NULL)
+        {
+        __UHEAP_MARK;
+        TRAP(ret,runModeAgent->ClientAppL());
+        __UHEAP_MARKEND;
+        
+        RDebug::Printf( "ClientAppL returned %d", ret );
+        delete runModeAgent;
+        }
+
+    delete trap;
+    return ret;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/multi_target_tests/t_multi_target.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,93 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Definitions for the run mode debug tests
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef RMDEBUG_MULTI_TARGET_H
+#define RMDEBUG_MULTI_TARGET_H
+
+#include "t_rmdebug_app.h"
+
+#include <rm_debug_api.h>
+
+class CMultiTargetAgent;
+
+//
+// class CRunModeAgent
+//
+// The basic run mode agent.
+//
+class CMultiTargetAgent : public CBase
+	{
+public:
+	static CMultiTargetAgent* NewL();
+	~CMultiTargetAgent();
+	void ClientAppL();
+	
+    TInt LaunchProcess(RProcess& aProcess, TDesC & aExeName, TDesC & aCommandLine );
+    
+private:
+	CMultiTargetAgent();
+	void ConstructL();
+
+	void ReportPerformance(void);
+
+	TInt HelpTicksPerSecond(void);
+
+	enum TTestMode 
+		{
+		//run all the tests
+		EModeAll = 1<<0,
+		//run the specified tests in reverse order
+		EModeReverse = 1<<1,
+		//print out help
+		EModeHelp = 1<<2,
+		//print out help
+		EModeVersion = 1<<3
+		};
+	
+	TInt LaunchTargetsInOrderL();
+	void SetupDebugServerL();
+
+private:
+
+#if defined(KERNEL_OOM_TESTING)
+	RKernelLowMemorySecuritySvrSession iServSession;
+#elif defined (USER_OOM_TESTING)
+	RUserLowMemorySecuritySvrSession iServSession;
+#else
+	Debug::RSecuritySvrSession iServSession;
+#endif
+	RSemaphore iAddressGlobSem;
+
+	TUid iMySid;
+
+	// Timing information
+	TInt iStartTick;
+	TInt iStopTick;
+
+	RArray<RBuf> iTargets;
+  TRequestStatus iStatus;
+  Debug::TEventInfo iEventInfo;
+  TPtr8 iEventPtr;
+	};
+
+#endif // RMDEBUG_MULTI_TARGET_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/performance_test/t_rmdebug_performance_oemtoken.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,31 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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
+ @internalTechnology
+ @released
+*/
+
+#include <e32base.h>
+
+GLDEF_C TInt E32Main()
+	{
+	// No need to do anything, the only requirement is that
+	// this executable can be loaded and runs to completion
+	return 0;
+	}
+
+// End of file - t_rmdebug_performance_oemtoken.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/performance_test/t_rmdebug_performance_test.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,599 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Tests performance of run mode debug device component   
+//
+
+#include <e32base.h>
+#include <e32property.h>
+#include <e32test.h>
+#include <e32def.h>
+#include <e32const.h>
+#include <hal.h>
+
+#include "t_rmdebug_performance_test.h"
+#include "t_debug_logging.h"
+#include "t_rmdebug_app.h"
+
+const TVersion securityServerVersion(0,1,1);
+
+_LIT(KTestName, "T_RMDEBUG_PERFORMANCE_TEST");
+
+LOCAL_D RTest test(KTestName);
+
+using namespace Debug;
+
+CRunModeAgent* CRunModeAgent::NewL()
+    {
+    LOG_ENTRY();
+    CRunModeAgent* self = new(ELeave) CRunModeAgent();
+    self->ConstructL();
+    LOG_EXIT();
+    return self;
+    }
+
+void CRunModeAgent::ConstructL()
+    {
+    // ConstructL list does not match destruction list as R-Class member variables are implicitly open.
+    // DebugDriver().Connect() is conditionally set depending on the test case hence not part of this function.
+    LOG_ENTRY();
+    User::LeaveIfError(iIntegerProperty.Attach(RProcess().SecureId(), EPropertyTimeOfCrash, EOwnerThread));
+    LOG_EXIT(); 
+    }
+
+CRunModeAgent::~CRunModeAgent()
+    {
+    LOG_ENTRY();   
+    DebugDriver().Close();
+    iTimeDifs.Close();
+    iIntegerProperty.Close();
+    RProperty::Delete(EPropertyTimeOfCrash);
+    LOG_EXIT(); 
+    }
+
+
+void CRunModeAgent::ClientAppL()
+    {
+    LOG_ENTRY();   
+   
+    if ( ParseCommandLine() == EDisplayHelp )
+        {
+        DisplayUsage();
+        }
+    else
+        {
+        static _LIT_SECURITY_POLICY_PASS(KAllowAllPolicy);
+        RProperty::Define(RProcess().SecureId(), EPropertyTimeOfCrash, RProperty::EInt, KAllowAllPolicy, KAllowAllPolicy);        
+        StartTest();
+        }
+        
+    LOG_EXIT(); 
+    }
+
+TInt CRunModeAgent::GetTimeInMs()
+{
+    return User::NTickCount() * iTickPeriodMs;
+}
+
+void CRunModeAgent::GetStartTime()
+    {    
+    LOG_ENTRY();
+
+    test ( KErrNone == iIntegerProperty.Get(iParams.iCountStart) );    
+    LOG_MSG2("iParams.iCountStart %d", iParams.iCountStart);
+    
+    LOG_EXIT();
+    }
+
+void CRunModeAgent::GetNanoTickPeriod()
+    {
+    LOG_ENTRY();
+    
+    TInt period = 0;
+    User::LeaveIfError(HAL::Get(HALData::ENanoTickPeriod, period));
+    iTickPeriodMs = period / 1000;
+    LOG_MSG("iTickPeriodMs = %d\n", iTickPeriodMs);
+    
+    LOG_EXIT();
+    }
+
+void CRunModeAgent::StartTest()
+    {
+    LOG_ENTRY();
+    
+    GetNanoTickPeriod();
+    
+    if (iParams.iTestType == PerformanceTestParams::EBenchMarkTest)
+        {
+        RunBenchMarkTest();
+        }
+    else 
+        {
+        TestDriverPerformance();
+        }
+    
+    CalculatePerformance();
+    
+    LOG_EXIT();
+    }
+
+// This function allows us to provide a benchmark when comparing the performance with the 
+// old and new APIs using the TestDriverPerformance function below. The two possible 
+// configurations are as follows: 
+// 1. Run t_rmdebug_app with a prefetch abort configuration and measure the time from the 
+// point of crash to the logon request completion.
+// 2. Load the debug-system and then run the above configuration.  
+void CRunModeAgent::RunBenchMarkTest()
+    {
+    LOG_ENTRY();
+    
+    test.Start(_L("RunBenchMarkTest"));
+    
+    RProcess process;
+    TRequestStatus status; 
+    
+    if (iParams.iDriver)
+         {
+         RDebug::Printf("RunBenchMarkTest() - DebugDriver().Connect()");
+         test(KErrNone == DebugDriver().Connect(securityServerVersion));
+         }
+ 
+    LOG_MSG("iParams.iNumOfTestRuns = %d", iParams.iNumOfTestRuns);
+    
+    for ( TUint i = 0; i < iParams.iNumOfTestRuns; i++ )
+        {
+        // Start test application
+        test( KErrNone == LaunchProcessL(process, KRMDebugTestApplication(), KTargetOptions()) );
+               
+        process.Logon(status);
+        User::WaitForRequest(status);
+
+        // Stop timer on logon request completion
+        iParams.iCountEnd = GetTimeInMs();
+        LOG_MSG("iParams.iCountEnd = %d", iParams.iCountEnd);
+        
+        LOG_MSG( "status.Int() = %d " , status.Int() );
+        
+        // prefetch abort should raise a KERN-EXEC 3
+        test(3 == status.Int());
+        
+        process.Close();
+        GetStartTime(); 
+       
+        // NTickCount shouldn't overflow, so no reason why this assertion should fail
+        test(iParams.iCountEnd > iParams.iCountStart);
+        iTimeDifs.Append( iParams.iCountEnd - iParams.iCountStart );
+       }
+    
+    LOG_EXIT();
+    }
+
+// This function can be used to compare the performance with the old (e.g. attachExe) and new 
+// (e.g. attachAll) APIs depending depending on the parameters passed in when running this test.  
+void CRunModeAgent::TestDriverPerformance()
+    {
+    LOG_ENTRY();    
+    test.Start(_L("TestDriverPerformance"));
+   
+    RProcess process;
+    
+    test(KErrNone == DebugDriver().Connect(securityServerVersion));
+    
+    LOG_MSG("iParams.iNumOfTestRuns = %d", iParams.iNumOfTestRuns);
+    for ( TUint i = 0; i < iParams.iNumOfTestRuns; i++ )
+        {
+        ilaunchCompleted = EFalse;
+     
+        Attach();
+        SetEventAction();
+        test(KErrNone == LaunchProcessL(process, KRMDebugTestApplication(), KTargetOptions));
+        
+        LOG_MSG("CRunModeAgent::TestDriverPerformance - process.Logon");
+        
+        while ( !ilaunchCompleted )
+            {
+            LOG_MSG("CRunModeAgent::TestDriverPerformance - DebugDriver().GetEvent");
+       
+            GetEvent();
+       
+            LOG_MSG("CRunModeAgent::TestDriverPerformance - User::WaitForRequest");
+
+            User::WaitForRequest(iStatus);
+            LOG_MSG( "iStatus.Int() = %d " , iStatus.Int() );
+            
+            LOG_MSG("CRunModeAgent::TestDriverPerformance - HandleEvent");
+            HandleEvent(iSEventInfo.iEventInfo);
+            }
+        
+        process.Logon(iStatus);
+        LOG_MSG("CRunModeAgent::TestDriverPerformance - process.Logon, User::WaitForRequest");
+        User::WaitForRequest(iStatus);
+        LOG_MSG( "iStatus.Int() = %d " , iStatus.Int() );
+        
+        // Stop timer on logon request completion as in benchmark performance test
+        iParams.iCountEnd = GetTimeInMs();
+                
+        // prefetch abort should raise a KERN-EXEC 3
+        test(3 == iStatus.Int());
+                    
+        Detach();
+        process.Close();       
+        GetStartTime();
+ 
+        // NTickCount shouldn't overflow, so no reason why this assertion should fail
+        test(iParams.iCountEnd > iParams.iCountStart);
+        iTimeDifs.Append( iParams.iCountEnd - iParams.iCountStart );
+       }
+        
+       LOG_EXIT();
+    }
+
+void CRunModeAgent::CalculatePerformance()
+    {
+    LOG_ENTRY();
+
+    TUint median;
+    TUint arrayCount = iTimeDifs.Count();
+
+    for (TInt i = 0; i < arrayCount; i++)
+         {
+         RDebug::Printf("iTimeDifs[%d] = %d ",i,iTimeDifs[i]);
+         }
+    
+    // Sort in ascending order
+    iTimeDifs.Sort();
+            
+    //If the number of elements is odd, the middle element in the sorted array is the median. 
+    //If the number of elements is even, the median is the average of the two midmost elements.
+    if ( arrayCount%2  != 0 )
+        {
+        median = iTimeDifs[arrayCount/2];
+        }
+    else
+        {
+        median = (iTimeDifs[arrayCount/2] + iTimeDifs[arrayCount/2 -1])/2;
+        }
+    
+    RDebug::Printf("Median time %d ms", median );
+    
+    LOG_EXIT();
+    }
+
+/**
+  Launch a process
+  @param aExeName the executable used to create the process
+  @param aCommandLine the commandline parameters passed to the new process file name of the executable used to create the process
+  @return KErrNone on success, or one of the other system wide error codes
+  */
+TInt CRunModeAgent::LaunchProcessL( RProcess& aProcess, const TDesC& aExeName, const TDesC& aCommandLine )
+    {
+    LOG_ENTRY(); 
+    
+    RBuf launcherOptions;
+    launcherOptions.CleanupClosePushL();
+    const TInt additionalWords = 1; 
+    launcherOptions.CreateL( aCommandLine.Length() + additionalWords );
+    launcherOptions.Format( aCommandLine, iParams.iTestTargetPriority);
+   
+    LOG_DES(_L("launcherOptions %S"), &launcherOptions);
+    
+    TInt err = aProcess.Create( aExeName, launcherOptions );   
+    CleanupStack::PopAndDestroy();
+    
+    // check that there was no error raised
+    if (err != KErrNone)
+        return err;
+    
+    // rendezvous with process
+    TRequestStatus status = KRequestPending;
+    aProcess.Rendezvous(status);
+
+    // start the test target
+    aProcess.Resume();
+    User::WaitForRequest(status);
+  
+    if(KErrNone != status.Int())
+        {
+        aProcess.Kill(KErrNone);
+        }
+     LOG_EXIT(); 
+     return status.Int();
+
+    }
+
+void CRunModeAgent::SetEventAction()
+    {
+    LOG_ENTRY();
+    
+    if (iParams.iTestType == PerformanceTestParams::EAttachExe)
+        {
+        test(KErrNone == DebugDriver().SetEventAction( KRMDebugTestApplication(), EEventsKillThread, EActionContinue));
+             
+        if ( iParams.iEvents )
+            {
+            test(KErrNone == DebugDriver().SetEventAction( KRMDebugTestApplication(), EEventsAddLibrary, EActionContinue));
+            test(KErrNone == DebugDriver().SetEventAction( KRMDebugTestApplication(), EEventsUserTrace, EActionContinue));
+            test(KErrNone == DebugDriver().SetEventAction( KRMDebugTestApplication(), EEventsStartThread, EActionContinue));
+            test(KErrNone == DebugDriver().SetEventAction( KRMDebugTestApplication(), EEventsAddProcess, EActionContinue));
+            test(KErrNone == DebugDriver().SetEventAction( KRMDebugTestApplication(), EEventsRemoveProcess, EActionContinue));
+            }
+        }
+    else
+        {
+        test(KErrNone == DebugDriver().SetEventAction( EEventsKillThread, EActionContinue));
+             
+        if ( iParams.iEvents )
+            {
+            test(KErrNone == DebugDriver().SetEventAction( EEventsAddLibrary, EActionContinue));
+            test(KErrNone == DebugDriver().SetEventAction( EEventsUserTrace, EActionContinue));
+            test(KErrNone == DebugDriver().SetEventAction( EEventsStartThread, EActionContinue));
+            test(KErrNone == DebugDriver().SetEventAction( EEventsAddProcess, EActionContinue));
+            test(KErrNone == DebugDriver().SetEventAction( EEventsRemoveProcess, EActionContinue));
+            }
+        }
+    
+    LOG_EXIT();
+    }
+
+void CRunModeAgent::Attach()
+    {
+    LOG_ENTRY();
+    
+    if( iParams.iTestType == PerformanceTestParams::EAttachExe ) 
+        {
+        // Attach to process non-passively
+        test(KErrNone == DebugDriver().AttachExecutable( KRMDebugTestApplication(), EFalse));
+        LOG_MSG("DebugDriver().AttachExecutable");
+        }
+    else 
+        {
+        // Attach to all the processes on the system
+        test(KErrNone == DebugDriver().AttachAll());
+        LOG_MSG("DebugDriver().AttachAll()");
+        }
+    
+    LOG_EXIT();
+    }
+
+void CRunModeAgent::GetEvent()
+    {
+    LOG_ENTRY();
+
+    if( iParams.iTestType == PerformanceTestParams::EAttachExe ) 
+        {
+        DebugDriver().GetEvent( KRMDebugTestApplication(), iStatus, iSEventInfo.iEventInfoBuf );
+        }
+    else
+        {
+        DebugDriver().GetEvent( iStatus, iSEventInfo.iEventInfoBuf );
+        }
+    
+    LOG_EXIT();
+    }
+
+void CRunModeAgent::Detach()
+    {
+    LOG_ENTRY();
+    
+    if( iParams.iTestType == PerformanceTestParams::EAttachExe )
+        {
+        test (KErrNone == DebugDriver().DetachExecutable(KRMDebugTestApplication()));
+        }
+    else
+        {
+        test(KErrNone == DebugDriver().DetachAll());
+        }
+    
+    LOG_EXIT();
+    }
+
+void CRunModeAgent::HandleEvent(TEventInfo& aEventInfo)
+    {
+    LOG_ENTRY(); 
+
+    switch ( aEventInfo.iEventType )
+        {
+        case EEventsAddProcess:
+            {
+            LOG_MSG(">>> EEventsAddProcess");                        
+            break;
+            }
+    
+        case EEventsStartThread:
+            {
+            LOG_MSG(">>> EEventsStartThread");                
+            break;                    
+            }                       
+
+        case EEventsUserTrace:
+            {
+            LOG_MSG(">>> EEventsUserTrace");  
+            break;
+            }
+
+        case EEventsRemoveProcess:
+            {
+            LOG_MSG(">>> EEventsRemoveProcess");                        
+            break;
+            }
+    
+        case EEventsKillThread:
+            {
+            LOG_MSG(">>> EEventsKillThread");   
+            ilaunchCompleted = ETrue;          
+            break;
+            }
+            
+        default:   
+            {
+            LOG_MSG( ">>> Unknown event ");
+            break;
+            }   
+        }
+     
+    LOG_EXIT(); 
+    }
+
+void CRunModeAgent::SetDefaultParamValues()
+    {
+    LOG_ENTRY();
+    
+    iParams.iNumOfTestRuns = KNumOfTestRuns;
+    iParams.iTestType = PerformanceTestParams::EBenchMarkTest;
+    iParams.iTestTargetPriority = 0;
+    iParams.iEvents = 0;
+    iParams.iDriver = 0;
+    
+    LOG_EXIT();
+    }
+
+TInt CRunModeAgent::ParseCommandLine()
+    {
+    LOG_ENTRY();
+    
+    TBool ifDisplayHelp = EDontDisplayHelp;
+    SetDefaultParamValues();
+    
+    TInt argc = User::CommandLineLength();
+    LOG_MSG( "Launcher Process() argc=%d", argc );
+
+    if( argc )
+        {
+        HBufC* commandLine = NULL;
+        commandLine = HBufC::NewLC(argc);
+        TPtr commandLineBuffer = commandLine->Des();
+        User::CommandLine(commandLineBuffer);
+       
+        LOG_DES(_L("CommandLine = %S"), &commandLineBuffer);
+        
+        // create a lexer and read through the command line
+        TLex lex(*commandLine);
+        while (!lex.Eos())
+             {
+             // only look for options with first character '-', other switches are for the targets
+             if (lex.Get() == '-')
+                 {
+                 TChar arg = lex.Get();
+                 switch (arg)
+                     {
+                     case 'n':
+                         lex.Val( iParams.iNumOfTestRuns );
+                         LOG_MSG("Number of test runs %d", iParams.iNumOfTestRuns);
+                         break;
+                      case 't':
+                          lex.Val( iParams.iTestType );
+                          LOG_MSG("parsed testType as %d", iParams.iTestType );
+                          break;
+                      case 'p':
+                          lex.Val( iParams.iTestTargetPriority );
+                          LOG_MSG("parsed test target priority as %d", iParams.iTestTargetPriority );
+                          break;
+                      case 'e':
+                          lex.Val( iParams.iEvents );
+                          LOG_MSG("parsed events as %d", iParams.iEvents );
+                          break;
+                      case 'd':
+                          lex.Val( iParams.iDriver );
+                          LOG_MSG("parsed iDriver as %d", iParams.iDriver );
+                          break;
+                       case 'h':
+                          LOG_MSG( "Display help" );
+                          ifDisplayHelp = EDisplayHelp;
+                       default:
+                           LOG_MSG( "Default usage" );
+                           break;             
+                       }
+                  }
+              }
+            CleanupStack::PopAndDestroy(commandLine);
+        }
+    
+    LOG_EXIT();
+    return ifDisplayHelp;   
+    }
+
+void CRunModeAgent::DisplayUsage()
+    {
+    LOG_ENTRY();
+    test.Printf(_L("\nUsage: t_rmdebug_performance_test [options] \nOptions:\n"));
+    
+    test.Printf(_L("\t-t  \t\ttest type\n"));
+    test.Printf(_L("\t\t\t  0 - AttachAll\n"));
+    test.Printf(_L("\t\t\t  1 - AttachExe\n"));
+    test.Printf(_L("\t\t\t  2 - None\n"));
+           
+    test.Printf(_L("\t-n \t\tnumber of iterations\n"));
+    test.Printf(_L("\t-e \t\ttest with events\n"));
+    test.Printf(_L("\t\t\t  0 - No\n"));
+    test.Printf(_L("\t\t\t  1 - Yes\n"));
+    test.Printf(_L("\t-p \t\tpriority of test target thread\n"));
+    
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteVeryLow \n"), EPriorityAbsoluteVeryLow);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteLowNormal \n"), EPriorityAbsoluteLowNormal);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteLow \n"), EPriorityAbsoluteLow);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteBackgroundNormal \n"), EPriorityAbsoluteBackgroundNormal);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteBackground \n"), EPriorityAbsoluteBackground);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteForegroundNormal \n"), EPriorityAbsoluteForegroundNormal);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteForeground \n"), EPriorityAbsoluteForeground);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteHighNormal \n"), EPriorityAbsoluteHighNormal);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteHigh \n"), EPriorityAbsoluteHigh);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime1 \n"), EPriorityAbsoluteRealTime1);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime2 \n"), EPriorityAbsoluteRealTime2);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime3 \n"), EPriorityAbsoluteRealTime3);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime4 \n"), EPriorityAbsoluteRealTime4);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime5 \n"), EPriorityAbsoluteRealTime5);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime6 \n"), EPriorityAbsoluteRealTime6);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime7 \n"), EPriorityAbsoluteRealTime7);
+    test.Printf(_L("\t\t\t  %d - EPriorityAbsoluteRealTime8 \n"), EPriorityAbsoluteRealTime8);
+    
+    test.Printf(_L("\t-d  \t\tload driver\n"));
+    test.Printf(_L("\t\t\t  0 - No\n"));
+    test.Printf(_L("\t\t\t  1 - Yes\n"));
+        
+    test.Printf(_L("\t-h \t\tdisplay usage information\n\n"));
+    
+    test.Printf(_L("Press any key...\n"));
+    test.Getch();
+    
+    LOG_EXIT();
+    }
+
+GLDEF_C TInt E32Main()
+    {
+    __UHEAP_MARK;
+
+    TInt ret = KErrNone;        
+    CTrapCleanup* trap = CTrapCleanup::New();
+        
+    if (!trap)
+        return KErrNoMemory;
+    
+    test.Start(KTestName);
+       
+    CRunModeAgent *runModeAgent = CRunModeAgent::NewL();
+
+    if (runModeAgent != NULL)
+        {
+        TRAP(ret,runModeAgent->ClientAppL());
+        LOG_MSG( "ClientAppL() returned %d", ret );
+        delete runModeAgent;
+        }
+    
+    test.End();
+    test.Close();
+
+    delete trap;
+    __UHEAP_MARKEND;
+    return ret;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/performance_test/t_rmdebug_performance_test.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,142 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Tests performance of run mode debug device component   
+// 
+//
+
+#ifndef RMDEBUG_PERFORMANCE_H
+#define RMDEBUG_PERFORMANCE_H
+
+#include <u32hal.h>
+#include <f32file.h>
+#include <rm_debug_api.h>
+
+/* Config for t_rmdebug_app.exe: 
+ * -f1: prefetch abort,
+ * -d0: zero delay before crash
+ * -p: priority of test target main thread
+ */    
+_LIT(KTargetOptions,"-f1 -d0 -p%d");
+
+// Default number of test runs
+const TInt KNumOfTestRuns = 7;
+
+/**
+ @Class TAgentEventInfo
+ 
+ Class for gathering event data from the run-mode driver
+ */
+class TAgentEventInfo
+{
+public:
+    TAgentEventInfo() : iEventInfoBuf(iEventInfo) {}
+   
+public:
+    // This is the underlying class for event interaction with the Run Mode debug API 
+    Debug::TEventInfo          iEventInfo;
+    
+    TPckg<Debug::TEventInfo>  iEventInfoBuf; 
+};
+
+/**
+  @Class CRunModeAgent
+  
+  The basic run mode agent
+  */
+class CRunModeAgent : public CBase
+	{
+public:
+    
+    enum displayHelp {EDontDisplayHelp =0, EDisplayHelp };
+    
+	static CRunModeAgent* NewL();
+	~CRunModeAgent();
+	void ClientAppL();  
+	Debug::RSecuritySvrSession&  DebugDriver() { return iServSession; };	
+
+private:
+	void ConstructL();
+	void StartTest();
+	void TestDriverPerformance();
+	void RunBenchMarkTest();
+	TInt ParseCommandLine();
+	
+	void Attach();
+	void Detach();
+	    
+	void HandleEvent(Debug::TEventInfo& aEventInfo);
+	TInt LaunchProcessL(RProcess& aProcess, const TDesC& aExeName, const TDesC& aCommandLine);
+	void DisplayUsage();
+	void GetNanoTickPeriod();
+	void SetEventAction();
+	void SetDefaultParamValues();
+	
+	void CalculatePerformance();
+	void GetEvent();
+	void GetStartTime();
+	TInt GetTimeInMs();
+	
+private:
+	
+	/** 
+	  Used for test cases interacting with the RMDBG only
+	 */
+	TRequestStatus iStatus;   
+	
+	/**
+	  The nanokernel tick period in MS
+	*/
+	TInt iTickPeriodMs;
+
+	/*
+	 * Handle to DSS
+	 */
+	Debug::RSecuritySvrSession iServSession;
+	
+	/**
+	 Array to store tick counts between an iteration of a test run
+	*/
+	RArray<TUint> iTimeDifs;
+	
+	/**
+	 Object to gather event data from RMDBG
+	*/
+	TAgentEventInfo iSEventInfo;
+		
+	/**
+	  Flag to indicate test target has crashed
+	*/
+	TBool ilaunchCompleted;
+	
+	/*
+	 * RProperty to get counter value from test app
+	 */
+	RProperty iIntegerProperty;
+		
+	struct PerformanceTestParams
+	    {
+	    enum TestOptions {EAttachAll=0,EAttachExe, EBenchMarkTest };
+	    TUint iTestType;
+	    TUint iNumOfTestRuns;
+	    TUint iTestTargetPriority;
+	    TUint iEvents;
+	    TInt iCountEnd;
+	    TInt iCountStart;
+	    TUint iDriver;
+	    } iParams;
+	    
+	};
+
+#endif // RMDEBUG_PERFORMANCE_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdebug_test/rm_debug/scripts/tef_execute_rtests.script	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,59 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description: Script file for running Run-Mode Debug Tests (RTests) as TEF3 tests.
+// 		Please note, for a description of the tests please goto the RTests themselves.
+//		This file is a temporary measure, until the RTest component itself is updated.
+//		The problem is RTest does not produce logs when run on Sirocco, 
+//		so this wrapper allows us to do that.
+//
+//! @File
+//! @SYMTestSuiteName           tef_execute_rtests.script
+//! @SYMScriptTestEnvironment   RTEST as TEF3
+
+PRINT *** Running RTests as TEF3 tests ***
+
+START_TESTCASE                  KBASE-t_rmdebug2
+RUN_PROGRAM 120 t_rmdebug2
+END_TESTCASE                    KBASE-t_rmdebug2
+
+
+START_TESTCASE                  KBASE-t_rmdebug2_oem
+RUN_PROGRAM 120 t_rmdebug2_oem
+END_TESTCASE                    KBASE-t_rmdebug2_oem
+
+
+START_TESTCASE                  KBASE-t_rmdebug2_oem2
+RUN_PROGRAM 120 t_rmdebug2_oem2
+END_TESTCASE                    KBASE-t_rmdebug2_oem2
+
+
+START_TESTCASE                  KBASE-t_rmdebug2_allcaps
+RUN_PROGRAM 120 t_rmdebug2_allcaps
+END_TESTCASE                    KBASE-t_rmdebug2_allcaps
+
+
+START_TESTCASE                  KBASE-t_performance_test
+RUN_PROGRAM 120 t_performance_test
+END_TESTCASE                    KBASE-t_performance_test
+
+
+START_TESTCASE                  KBASE-t_rmdebug_multi_target
+RUN_PROGRAM 120 t_rmdebug_multi_target
+END_TESTCASE                    KBASE-t_rmdebug_multi_target
+
+
+START_TESTCASE                  KBASE-t_multi_agent_launcher
+RUN_PROGRAM 120 t_multi_agent_launcher
+END_TESTCASE                    KBASE-t_multi_agent_launcher
+
+PRINT *** Completed RTests as TEF3 tests ***
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,52 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// e32/drivers/debug/bld.inf
+// Run mode debugger
+// 
+//
+
+/**
+ @file
+*/
+
+
+PRJ_PLATFORMS
+
+BASEDEFAULT
+
+PRJ_EXPORTS
+
+../../securityServer/inc/rm_debug_api.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(rm_debug_api.h)
+rm_debug_svr.iby						/epoc32/rom/include/	// Run mode debug driver
+
+PRJ_MMPFILES
+
+#ifndef GCCXML
+
+#if defined(GENERIC_MARM) || defined(WINS) || defined(GENERIC_X86)
+#if !defined(MARM_THUMB) && !defined(MARM_ARMI)
+
+#if defined(MARM_ARMV5) || defined(MARM_ARMV4)
+
+
+rm_debug_kerneldriver
+../../securityServer/group/rm_debug_svr
+
+#endif
+
+#endif
+#endif
+
+
+#endif //#ifndef GCCXML
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/group/rm_debug_kerneldriver.mmh	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,50 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+//
+
+OS_LAYER_SYSTEMINCLUDE
+
+#include <kernel/kern_ext.mmh>
+
+
+UID             0x100000AF 0x101F7157
+
+SOURCEPATH      ../src
+SOURCE          d_list_manager.cpp
+SOURCE          rm_debug_kerneldriver.cpp
+SOURCE          rm_debug_eventhandler.cpp
+SOURCE          d_process_tracker.cpp
+SOURCE          d_target_process.cpp
+SOURCE          d_debug_agent.cpp
+SOURCE          d_rmd_breakpoints.cpp
+SOURCE          d_rmd_stepping.cpp
+SOURCE          d_driver_event_info.cpp
+SOURCE          d_debug_functionality.cpp
+SOURCE          debug_utils.cpp
+
+#ifdef SYMBIAN_OLD_EXPORT_LOCATION
+SYMBIAN_BASE_SYSTEMINCLUDE(memmodel/epoc/mmubase)
+SYMBIAN_BASE_SYSTEMINCLUDE(drivers)
+#endif
+
+userinclude		../inc
+
+VENDORID 0x70000001
+
+//Specified to allow global data
+EPOCALLOWDLLDATA
+
+capability			all
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/group/rm_debug_kerneldriver.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,20 @@
+// 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 the License "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:
+//
+
+#include "rm_debug_kerneldriver.mmh"
+
+TARGET			rm_debug.ldd
+
+TARGETTYPE LDD
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/group/rm_debug_svr.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -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 the License "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 __RM_DEBUG_SVR_IBY__
+#define __RM_DEBUG_SVR_IBY__
+
+#ifndef INST_ARM4
+#ifdef KMAIN
+
+// Debug Device Driver
+extension[VARID]=  \Epoc32\Release\##KMAIN##\##BUILD##\rm_debug.ldd		\sys\bin\rm_debug.ldd
+
+// Debug Security Server
+file=			\Epoc32\Release\##MAIN##\##BUILD##\rm_debug_svr.exe		\sys\bin\rm_debug_svr.exe
+
+#endif
+
+#ifndef KMAIN
+
+// Debug Device Driver
+#ifdef STOP_MODE_DEBUGGING_V2
+extension[VARID]=KERNEL_DIR\DEBUG_DIR\rm_debug_ext.ldd		\sys\bin\rm_debug.ldd
+#else
+extension[VARID]=KERNEL_DIR\DEBUG_DIR\rm_debug.ldd		\sys\bin\rm_debug.ldd
+#endif
+
+// Debug Security Server
+file=KERNEL_DIR\DEBUG_DIR\rm_debug_svr.exe		\sys\bin\rm_debug_svr.exe
+
+#endif
+
+
+#endif	// INST_ARM4
+
+#endif	// __RM_DEBUG_SVR_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/group/sis/eula.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,1 @@
+RMDebug Test Sw. For Nokia use only.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/group/sis/mk_rmdbg.bat	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,18 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description: 
+@rem
+
+makesis rmdbg.pkg
+signsis rmdbg.sis rmdbg.sisx  RDTest_02.der RDTest_02.key
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/group/sis/rmdbg.pkg	Tue Aug 31 16:45:49 2010 +0300
@@ -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: 
+;
+
+
+
+;Languages
+&EN
+
+;Header
+#{"RMDBG"},(0x101F7157),1,4,1, TYPE=SA,RU
+
+
+;Localised Vendor name
+%{"Nokia"}
+
+;Unique Vendor name
+:"Nokia"
+
+;Supports Series 60 v 5.0
+[0x1028315], 0, 0, 0, {"Series60ProductID"}
+
+"eula.txt"-"", FILETEXT, TEXTEXIT
+
+; Files to install
+; Note D Drive is RAM in HW79 products
+
+"\epoc32\release\armv5\udeb\rm_debug_svr.exe"		-"d:\sys\bin\rm_debug_svr.exe"
+"\epoc32\release\armv5\udeb\rm_debug.ldd"				-"d:\sys\bin\rm_debug.ldd"
+
+
+; Required files
+; None
+
+; Component .sis files
+; None
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/d_debug_agent.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,151 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Purpose: Kernel-side tracking of debug agent information associated
+// with each process being debugged.
+// 
+//
+
+#ifndef D_DEBUG_AGENT_H
+#define D_DEBUG_AGENT_H
+
+#include <rm_debug_api.h>
+#include "d_driver_event_info.h"
+
+/**
+* Handles events from the kernel, filters them according to the debug agent's requests, 
+* and signals these events to the user side in FIFO-style. 
+* @see TKernelEventAction
+* @see TEventInfo
+*/
+class DDebugAgent : public DBase
+	{
+public:
+	static DDebugAgent* New(TUint64 aId);
+	~DDebugAgent();
+
+	TInt SetEventAction(Debug::TEventType aEvent, Debug::TKernelEventAction aEventAction);
+	void GetEvent(TClientDataRequest<Debug::TEventInfo>* aAsyncGetValueRequest, DThread* aClientThread);
+	TInt EventAction(Debug::TEventType aEvent);
+
+	TInt CancelGetEvent(void);
+	void NotifyEvent(const TDriverEventInfo& aEventInfo);
+	TUint64 Id();
+
+protected:
+	DDebugAgent(TUint64 aId);
+	TInt Construct();
+
+private:
+	void QueueEvent(const TDriverEventInfo& aEventInfo);
+	TBool BufferEmpty() const;
+	TBool BufferFull() const;
+	TBool BufferCanStoreEvent() const;
+	TBool BufferAtCriticalLevel() const;
+	void IncrementHeadPosition(void);
+	void IncrementTailPosition(void);
+	TInt NumberOfEmptySlots() const;
+	void LockEventQueue(void);
+	void UnlockEventQueue(void);
+
+private:
+
+	TUint64	iId;
+	Debug::TKernelEventAction iEventActions[Debug::EEventsLast];
+
+	/**
+	* Object used to write events back to DSS thread
+	* @see TEventInfo
+	*/
+	TClientDataRequest<Debug::TEventInfo>* iRequestGetEventStatus;
+
+	DThread* iClientThread;
+
+	/** 
+	* Ring buffer of pending events. Access to it is controlled by 
+	* @see iEventQueueLock
+	*/
+	RArray<TDriverEventInfo> iEventQueue;
+
+	/**
+	* Ring buffer head. Points to the next empty slot in iEventQueue
+	* @see iEventQueue
+	*/
+	TInt iHead;	
+
+	/**
+	* Ring buffer tail. Points to the oldest full slot in iEventQueue
+	* @see iEventQueue 
+	*/
+	TInt iTail;
+
+	/** 
+	* Control access to event queue.
+	* @see iEventQueue
+	*/
+	DSemaphore* iEventQueueLock;
+
+	/**
+	* Keeps track of how many free slots are available in the event queue.
+	* @see iEventQueue
+	*/
+	TInt iFreeSlots;
+
+	/**
+	* Boolean to indicate if we have told the agent that we are ignoring trace events
+	* @see QueueEvent
+	*/
+	TBool iIgnoringTrace;
+	
+	/**
+	* Used to control the delivery of events to the client so that only 
+	* when more requests than deliveries have taken place can we deliver the 
+	* next event
+	* 
+	* Incremented when a request for event takes place
+	* @see GetEvent
+	* 
+	* Decremented when an event is delivered. 
+	* @see NotifyEvent
+	* 
+	* Cleared when event requests are cancelled
+	* @see CancelGetEvent
+	* 
+	*/
+	TInt   iEventBalance;
+
+	/**
+	* Length of kernel-event queue.
+	* This is a power of two for efficiency when using the 
+	* remainder operator
+	* @see DDebugAgent::iEventQueue
+	*/
+	static const TUint KNumberOfEventsToQueue = 128;
+
+	/**
+	* This determines the number of events at which we stop accepting 
+	* low priority events into the event queue.
+	* @see DDebugAgent::BufferAtCriticalLevel
+	* @see DDebugAgent::iEventQueue
+	*/
+	static const TUint KCriticalBufferSize = 64;
+
+	/**
+	* If we encounter an event that will take down the agent (eg a process critical thread crashing)
+	* we use this flag to stop trying to deliver thread death notifications to it.
+	*/
+	TBool iAgentDying;
+	};
+
+#endif // D_DEBUG_AGENT_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/d_debug_agent.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,109 @@
+// 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 the License "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:
+// Inline methods for debug agent class
+//
+
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+
+#ifndef D_DEBUG_AGENT_INL
+#define D_DEBUG_AGENT_INL
+
+
+/**
+ Checks whether the event queue is empty
+*/
+inline TBool DDebugAgent::BufferEmpty() const
+	{
+	return (NumberOfEmptySlots() == KNumberOfEventsToQueue);
+	}
+
+/**
+ Checks whether the event queue is full
+*/
+inline TBool DDebugAgent::BufferFull() const
+	{
+	return (NumberOfEmptySlots() == 0);
+	}
+
+/**
+ Checks whether there is room in the event queue to store an event
+*/
+inline TBool DDebugAgent::BufferCanStoreEvent() const
+	{
+	return (NumberOfEmptySlots() > 0);
+	}
+
+/**
+ This looks to see if the buffer is close to being full and should only
+ accept higher priority debug events (user trace is the only low priority event) 
+*/
+inline TBool DDebugAgent::BufferAtCriticalLevel() const
+	{
+	return (NumberOfEmptySlots() < KNumberOfEventsToQueue - KCriticalBufferSize);
+	}
+
+/**
+ Increments Head position, wrapping at KNumberOfEventsToQueue if necessary
+*/
+inline void DDebugAgent::IncrementHeadPosition(void)
+	{
+	iHead = (iHead + 1) % KNumberOfEventsToQueue;
+
+	iFreeSlots--;
+	}
+
+/**
+ Increments Tail position, wrapping at KNumberOfEventsToQueue if necessary
+*/
+inline void DDebugAgent::IncrementTailPosition(void)
+	{
+	iTail = (iTail + 1) % KNumberOfEventsToQueue;
+
+	iFreeSlots++;
+}
+
+/**
+ Returns the number of free slots in the event queue
+*/
+inline TInt DDebugAgent::NumberOfEmptySlots() const
+	{
+	return iFreeSlots;
+	}
+
+/**
+ Lock access to this agent's event queue
+*/
+inline void DDebugAgent::LockEventQueue(void)
+	{
+	NKern::ThreadEnterCS(); // Waiting on a semaphore is broken but this makes things marginally better.
+	// Anyone changing this, bear in mind the CS is also needed for some of the DebugUtils::OpenThreadHandle calls
+	Kern::SemaphoreWait(*iEventQueueLock);
+	}
+
+/**
+ Release the lock on this agent's event queue
+*/
+inline void DDebugAgent::UnlockEventQueue(void)
+	{
+	Kern::SemaphoreSignal(*iEventQueueLock);
+	NKern::ThreadLeaveCS();
+	}
+
+
+#endif	// D_DEBUG_AGENT_INL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/d_debug_functionality.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Internal class used to assemble debug functionality data block
+// 
+
+#ifndef T_DEBUG_FUNCTIONALITY_H
+#define T_DEBUG_FUNCTIONALITY_H
+
+/**
+ * This class is used to represent and assemble the debug functionality
+ * block
+ */
+class TDebugFunctionality
+	{
+
+	public:
+		TUint32 GetDebugFunctionalityBufSize(void);
+		TBool GetDebugFunctionality(TDes8& aDFBlock);
+		static TInt GetRegister(const Debug::TRegisterInfo aRegisterInfo, Debug::TTag& aTag);
+		static TUint32 GetMemoryOperationMaxBlockSize();
+
+	private:
+
+		// Helper functions when assembling the buffer
+		void AppendBlock(const Debug::TSubBlock& aDFSubBlock, TDes8& aDFBlock);
+		TUint32 ComputeBlockSize(const Debug::TSubBlock& aDFSubBlock);
+};
+
+#endif	// T_DEBUG_FUNCTIONALITY_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/d_driver_event_info.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,90 @@
+// 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 the License "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:
+// Purpose: Kernel-side tracking of event information
+//
+//
+
+#ifndef T_DRIVER_EVENT_INFO_H
+#define T_DRIVER_EVENT_INFO_H
+
+#include <rm_debug_api.h>
+#include <kernel/kernel.h> 
+
+/**
+@file
+@internalComponent
+*/
+
+class TDriverEventInfo
+	{
+public:
+	TDriverEventInfo();
+	void Reset();
+	TInt WriteEventToClientThread(TClientDataRequest<Debug::TEventInfo>* aAsyncGetValueRequest, DThread* aClientThread) const;
+	TBool FreezeOnSuspend() const;
+
+private:
+	TInt PopulateCommonEventInfo(Debug::TEventInfo& aEventInfo) const;
+	TInt PopulateEventSpecificInfo(Debug::TEventInfo& aEventInfo) const;
+	TInt PopulateThreadBreakPointInfo(Debug::TEventInfo& aEventInfo) const;
+	TInt PopulateThreadHwExceptionInfo(Debug::TEventInfo& aEventInfo) const;
+	TInt PopulateThreadSwExceptionInfo(Debug::TEventInfo& aEventInfo) const;
+	TInt PopulateThreadKillInfo(Debug::TEventInfo& aEventInfo) const;
+	TInt PopulateLibraryLoadedInfo(Debug::TEventInfo& aEventInfo) const;
+	TInt PopulateLibraryUnloadedInfo(Debug::TEventInfo& aEventInfo) const;
+	TInt PopulateRmdArmExcInfo(Debug::TEventInfo& aEventInfo) const;
+	TInt PopulateUserTraceInfo(Debug::TEventInfo& aEventInfo) const;
+	TInt PopulateStartThreadInfo(Debug::TEventInfo& aEventInfo) const;
+	TInt PopulateAddProcessInfo(Debug::TEventInfo& aEventInfo) const;
+	TInt PopulateRemoveProcessInfo(Debug::TEventInfo& aEventInfo) const;
+	TBool TookException() const;
+
+public:
+	Debug::TEventType iEventType;
+	TUint64 iProcessId;
+	TUint64 iThreadId;
+	TUint64 iCreatorThreadId;
+	TUint32 iCurrentPC;
+	TInt iExceptionNumber;
+	TBuf8<KMaxName> iFileName;
+	TBuf8<Debug::KPanicCategoryMaxName> iPanicCategory;
+	TUint32 iCodeAddress;
+	TUint32 iDataAddress;
+	TUint8 iExitType;
+	TUint8 iThreadIdValid;
+	TUint8 iProcessIdValid;
+	TUidType iUids;
+	TUint8 iUidsValid;
+	Debug::TKernelEventAction iActionTaken;
+	TUint32 iThreadFlags;
+
+	//The objects that these pointers point to are not
+	//owned by the Debug::TEventInfo class so no cleanup is required
+	TAny* iArg1;	// a1
+	TAny* iArg2;	// a2
+
+	union
+	{
+		Debug::TRmdArmExcInfo iRmdArmExcInfo;
+		//To store Trace info
+		TUint8 iUserTraceText[Debug::TUserTraceSize];
+	};
+
+	//status of trace message
+	Debug::TUserTraceMessageContext iMessageStatus;
+
+	};
+
+
+#endif //T_DRIVER_EVENT_INFO_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/d_list_manager.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,57 @@
+// 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 the License "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:
+// Definitions for the list manager
+// 
+//
+
+#ifndef T_LIST_MANAGER_H
+#define T_LIST_MANAGER_H
+
+#include <e32cmn.h>
+#include <kernel/kern_priv.h>
+#include <rm_debug_api.h>
+
+/**
+@file
+@internalComponent
+@released
+*/
+
+class TListManager
+{
+public:
+	TInt GetThreadListForThread(TDes8& aBuffer, TUint32& aDataSize, const TUint64 aTargetThreadId) const;
+	TInt GetThreadListForProcess(TDes8& aBuffer, TUint32& aDataSize, const TUint64 aTargetProcessId) const;
+	TInt GetGlobalThreadList(TDes8& aBuffer, TUint32& aDataSize) const;
+	TInt GetProcessList(TDes8& aBuffer, TUint32& aDataSize) const;
+	TInt GetCodeSegListForThread(TDes8& aBuffer, TUint32& aDataSize, const TUint64 aTargetThreadId) const;
+	TInt GetCodeSegListForProcess(TDes8& aBuffer, TUint32& aDataSize, const TUint64 aTargetProcessId) const;
+	TInt GetGlobalCodeSegList(TDes8& aBuffer, TUint32& aDataSize) const;
+	TInt GetXipLibrariesList(TDes8& aBuffer, TUint32& aDataSize) const;
+private:
+	TInt GetThreadList(TDes8& aBuffer, TUint32& aDataSize, TBool aGlobal, const TUint64 aTargetProcessId) const;
+	TInt GetDirectoryContents(RPointerArray<TRomEntry>& aRomEntryArray, const TLinAddr aAddress) const;
+	TInt GetDirectoryEntries(RPointerArray<TRomEntry>& aRomEntryArray, const TDesC& aDirectoryName) const;
+	TInt FindDirectory(const TDesC& aDirectory, TLinAddr& aAddress) const;
+	TInt GetDirectoryEntries(RPointerArray<TRomEntry>& aRomEntryArray, RArray<TPtr8>& aArray, TLinAddr& aAddress) const;
+
+	TInt AppendCodeSegData(TDes8& aBuffer, TUint32& aDataSize, const TModuleMemoryInfo& aMemoryInfo, const TBool aIsXip, const Debug::TCodeSegType aCodeSegType, const TDesC8& aFileName, const TUint32 aUid3) const;
+	void AppendThreadData(TDes8& aBuffer, TUint32& aDataSize, DThread* aThread) const;
+	TInt CopyAndExpandDes(const TDesC& aSrc, TDes& aDest) const;
+	TInt GetCodeSegType(const DCodeSeg* aCodeSeg, Debug::TCodeSegType& aType) const;
+	TInt SplitDirectoryName(const TDesC& aDirectoryName, RArray<TPtr8>& aSubDirectories) const;
+};
+
+#endif //T_LIST_MANAGER_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/d_process_tracker.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,73 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Purpose: Kernel-side tracking of process state
+// 
+//
+ 
+#ifndef D_PROCESS_TRACKER_H
+#define D_PROCESS_TRACKER_H
+
+#include "d_target_process.h"
+
+// The global class which tracks all debugged processes.
+// 
+// Note that multiple debug agents may attach to a process,
+// as the security server will ensure only one is an 'active'
+// agent, preventing conflicts. Other agents will be 'passive',
+// typically interested only in recording events.
+//
+// The above requirement generates the requirement for the class
+// to track the agent IDs, as multiple debug agents may be interested
+// in a process.
+
+class DProcessTracker : public DBase
+{
+public:
+	DProcessTracker();
+	~DProcessTracker();
+
+	TInt AttachProcess(const TDesC8& aProcessName, TUint64 aAgentId);
+
+	TInt DetachProcess(const TDesC8& aProcessName, TUint64 aAgentId);
+
+	TInt DetachAgent(TUint64 aAgentId);
+
+	DTargetProcess* FindProcess(const TDesC8& aProcessName) const;
+	DTargetProcess* FuzzyFindProcess(const TDesC8& aProcessName);
+
+	DDebugAgent* GetCurrentAgentAttachedToAll() const;
+	DDebugAgent* FindAgentForProcessAndId(const TDesC8& aProcessName, TUint64 aAgentId) const;
+	TBool NotifyAgentsForProcessEvent(const TDesC8& aProcessName, const TDriverEventInfo& aEvent, TBool aAllowFuzzy=EFalse);
+
+	TInt SuspendThread(DThread* aTargetThread, TBool aFreezeThread=EFalse);
+	TInt ResumeThread(DThread* aTargetThread);
+	void FSWait();
+	TInt ResumeFrozenThread(DThread* aThread);
+	TInt FreezeThread();
+
+private:
+	TInt RemoveSuspendedThread(DThread* aThread);
+	TInt AddSuspendedThread(DThread* aThread);
+	const TDesC8* GetFileName(DThread* aThread) const;
+
+private:
+	RPointerArray<DTargetProcess> iProcesses;
+	RPointerArray<DDebugAgent> iAgentsAttachedToAll;
+	RPointerArray<NFastSemaphore> iFrozenThreadSemaphores;
+	};
+
+// static global object
+extern DProcessTracker TheDProcessTracker;
+
+#endif // D_PROCESS_TRACKER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/d_rmd_breakpoints.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,213 @@
+// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Refactored class containing breakpoint related code from rm_debug_kerneldriver.cpp
+//
+
+
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+
+#ifndef D_RMD_BREAKPOINTS_H
+#define D_RMD_BREAKPOINTS_H
+
+#include <rm_debug_api.h>
+#include <kernel/kern_priv.h>
+#include "rm_debug_kerneldriver.h"
+
+// fwd declaration of friend classes needed due to re-factoring
+class DRM_DebugChannel;
+
+class DRMDStepper;
+
+//
+// Macros
+//
+const TUint32 KArmBreakPoint = 0xE7F123F4;
+const TUint16 KThumbBreakPoint = 0xDE56;
+const TUint16 KT2EEBreakPoint = 0xC100;	// From ARM ARM DDI0406A, section A9.2.1 Undefined instruction encoding for Thumb2-EE.
+
+#define NUMBER_OF_TEMP_BREAKPOINTS 10
+
+#define NUMBER_OF_MAX_BREAKPOINTS 100
+
+//
+// class TBreakEntry
+//
+class TBreakEntry
+{
+public:
+
+	inline TBreakEntry() { Reset(); };
+
+	inline TBreakEntry(Debug::TBreakId aBreakId, TUint64 aId, TBool aThreadSpecific, TUint32 aAddress, Debug::TArchitectureMode aMode)
+			: iBreakId(aBreakId),
+			  iId(aId),
+			  iAddress(aAddress),
+			  iMode(aMode),
+			  iThreadSpecific(aThreadSpecific)
+	{
+		 iInstruction.FillZ(4);
+		 iPageAddress = 0;
+		 iDisabledForStep = EFalse;
+		 iObsoleteLibraryBreakpoint = EFalse;
+		 iResumeOnceOutOfRange = EFalse;
+		 iSteppingInto = EFalse;
+		 iRangeStart = 0;
+		 iRangeEnd = 0;
+		 iStepTarget = EFalse;
+		 iNumSteps = 0;
+	};
+	
+	inline void Reset()
+	{
+		 iId = 0;
+		 iAddress = 0;
+		 iMode = Debug::EArmMode;
+		 iInstruction.FillZ(4);
+		 iPageAddress = 0;
+		 iDisabledForStep = EFalse;
+		 iObsoleteLibraryBreakpoint = EFalse;
+		 iResumeOnceOutOfRange = EFalse;
+		 iSteppingInto = EFalse;
+		 iRangeStart = 0;
+		 iRangeEnd = 0;
+		 iStepTarget = EFalse;
+		 iNumSteps = 0;
+	};
+
+public:
+	// Unique Id for this breakpoint. Assigned by D_RMD_Breakpoints::DoSetBreak(). @see D_RMD_Breakpoints::DoSetBreak
+	TInt32		iBreakId;
+	// Consider making the iId into a union of TProcessId, TThreadId, global etc. to make things more obvious
+	// Object Id in which this breakpoint should operate.
+	TUint64		iId;
+	// Address at which this breakpoint should operate
+	TUint32		iAddress;
+	// CPU ISA which this breakpoint uses, e.g. EArmMode/EThumbMode.
+	Debug::TArchitectureMode iMode;
+	// The original instruction which was stored at iAddress.
+	TBuf8<4>	iInstruction;
+	TUint32		iPageAddress;   //not used: BC if we remove it
+
+	// Indicates whether this breakpoint has been temporarily replaced with original instruction to enable step-off this breakpoint
+	TBool		iDisabledForStep;
+	/* This is used when libraries and processes are removed, so that
+	 * the driver can say 'ok' when requested to remove breakpoints
+	 * that existed in these cases, rather than 'Not Found'.
+	 *
+	 * Its not logical, but its a BC break if we change it :-(
+	 */
+	TBool		iObsoleteLibraryBreakpoint;
+	// Indicates whether this thread should be resumed after stepping off this breakpoint
+	TBool		iResumeOnceOutOfRange;
+	TBool		iSteppingInto;
+	TUint32		iRangeStart;
+	TUint32		iRangeEnd;
+	TBool		iThreadSpecific;
+	TBool		iStepTarget;
+
+	// Indicates how many more instruction steps should occur after hitting this breakpoint
+	TInt		iNumSteps;
+};
+/**
+@internalTechnology
+
+This class encapsulates all the data concerning run-mode and stop mode breakpoints
+as understood by the run-mode and stop-mode debug system.
+
+Note:                                                                        
+	The internal list of breakpoints is currently divided into two sections. The range from
+	0...NUMBER_OF_TEMP_BREAKPOINTS is used internally by the debug driver for implementing
+	stepping. The range from NUMBER_OF_TEMP_BREAKPOINTS to NUMBER_OF_MAX_BREAKPOINTS is used
+	to store information about breakpoints set by the client debug agents.
+                                                                                                                                                            
+	In future, this should change, so that each breakpoint knows what kind of breakpoint it
+	is (user/temp etc).
+
+
+*/
+class D_RMD_Breakpoints : public DBase
+{
+public:
+	D_RMD_Breakpoints(DRM_DebugChannel* aChannel);
+	~D_RMD_Breakpoints();
+
+	TInt Init();
+
+	// from rm_debug_driver.h
+	TInt DoSetBreak(TInt32 &aBreakId, const TUint64 aId, const TBool aThreadSpecific, const TUint32 aAddress, const Debug::TArchitectureMode aMode );
+	TInt DoEnableBreak(TBreakEntry &aEntry, TBool aSaveOldInstruction);
+	TInt DoClearBreak(const TInt32 aBreakId, TBool aIgnoreTerminatedThreads=EFalse);
+	TInt DoModifyBreak(TModifyBreakInfo* aBreakInfo);
+	TInt DoModifyProcessBreak(TModifyProcessBreakInfo* aBreakInfo);
+	TInt DoBreakInfo(TGetBreakInfo* aBreakInfo);
+	void ClearAllBreakPoints();
+	TInt DisableBreakAtAddress(TUint32 aAddress);
+	TInt DoEnableDisabledBreak(TUint64 aThreadId);
+
+	void DoRemoveThreadBreaks(TUint64 aThreadId);
+	void RemoveBreaksForProcess(TUint64 aProcessId, TUint32 aCodeAddress, TUint32 aCodeSize);
+	void InvalidateLibraryBreakPoints(TUint32 aCodeAddress, TUint32 aCodeSize);
+	TInt BreakPointCount() const;
+	TBreakEntry* GetNextBreak(const TBreakEntry* aBreakEntry) const;
+	TBool IsTemporaryBreak(const TBreakEntry& aBreakEntry) const;
+
+	TInt DoGetBreakList(TUint32* aBuffer, const TUint32 aBufSize, const TUint32 aElement, TUint32& aLastElement);
+
+	// Useful helper functions for debugging breakpoint issues
+	inline void print_BreakpointsDisabledForStep();
+	inline void print_BreakpointsList();
+
+private:
+	// Locked versions of public functions
+	TInt priv_DoSetBreak(TInt32 &aBreakId, const TUint64 aId,  const TBool aThreadSpecific, const TUint32 aAddress, const Debug::TArchitectureMode aMode );
+	TInt priv_DoEnableBreak(TBreakEntry &aEntry, TBool aSaveOldInstruction);
+	TInt priv_DoClearBreak(const TInt32 aBreakId, TBool aIgnoreTerminatedThreads);
+	TInt priv_DoModifyBreak(TModifyBreakInfo* aBreakInfo);
+	TInt priv_DoModifyProcessBreak(TModifyProcessBreakInfo* aBreakInfo);
+	TInt priv_DoBreakInfo(TGetBreakInfo* aBreakInfo);	
+	TInt priv_DisableBreakAtAddress(TUint32 aAddress);
+	TInt priv_DoEnableDisabledBreak(TUint64 aThreadId);
+	void priv_DoRemoveThreadBreaks(TUint64 aThreadId);
+	void priv_ClearAllBreakPoints();
+	TBool priv_IsTemporaryBreak(const TBreakEntry& aBreakEntry) const;
+
+	// helper functions
+	TBool Aligned(TUint32 aAddress, Debug::TArchitectureMode aMode);
+	TInt BreakSize(Debug::TArchitectureMode aMode);
+	TBool BreakpointsOverlap(TBreakEntry& aFirst, TBreakEntry& aSecond);
+	TUint32 BreakInst(Debug::TArchitectureMode aMode);
+
+private:
+	RArray<TBreakEntry> iBreakPointList;
+	TInt iNextBreakId;
+
+	DRM_DebugChannel* iChannel;	// temporary reference back to DRM_DebugChannel to help with refactoring
+
+	/* Protect access to the breakpoint list with a DSemaphore
+	 *
+	 * This means that stop-mode debuggers know when the list is being updated by the run-mode debug subsystem.
+	 */
+	DSemaphore* iLock;
+
+	TBool iInitialised;
+};
+
+#include "d_rmd_breakpoints_debug.inl" 
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/d_rmd_breakpoints_debug.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+//
+
+#include "debug_logging.h"
+
+// Print breakpoints disabled for stepping
+inline void D_RMD_Breakpoints::print_BreakpointsDisabledForStep()
+	{
+	for (TInt i = 0; i < iBreakPointList.Count(); i++)
+		{
+		if(iBreakPointList[i].iDisabledForStep)
+			{
+				LOG_MSG2("Breakpoint disabled for stepping: iBreakPointList[%d]", i);
+				LOG_MSG4("iBreakId = %x, iId = %d, iAddress = %x", iBreakPointList[i].iBreakId, iBreakPointList[i].iId, iBreakPointList[i].iAddress );
+			}
+		}
+	}
+
+// Print breakpoint list
+inline void D_RMD_Breakpoints::print_BreakpointsList()
+	{
+	for (TInt i = NUMBER_OF_TEMP_BREAKPOINTS; i < iBreakPointList.Count(); i++)
+		{
+			LOG_MSG2("Breakpoint list: iBreakPointList[%d]", i);
+			LOG_MSG4("iBreakId = %x, iId = %d, iAddress = %x", iBreakPointList[i].iBreakId, iBreakPointList[i].iId, iBreakPointList[i].iAddress );
+		}
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/d_rmd_stepping.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,126 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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 D_RMD_STEPPING_H
+#define D_RMD_STEPPING_H
+
+// fwd declaration of DRM_DebugChannel
+class DRM_DebugChannel;
+
+// extracted from rm_debug_kerneldriver.h
+// Register definitions
+#define SP_REGISTER			13
+#define LINK_REGISTER		14
+#define PC_REGISTER			15
+#define STATUS_REGISTER		16
+
+class DRMDStepping : public DBase
+{
+public:
+	// ctor
+	DRMDStepping(DRM_DebugChannel* aChannel);
+
+	// dtor
+	~DRMDStepping();
+
+	// extracted from rm_debug_kerneldriver.cpp
+	TBool IsExecuted(TUint8 aCondition, TUint32 aStatusRegister);
+	TBool IsPreviousInstructionMovePCToLR(DThread *aThread);
+	void DecodeDataProcessingInstruction(TUint8 aOpcode, TUint32 aOp1, TUint32 aOp2, TUint32 aStatusRegister, TUint32 &aBreakAddress);
+	TUint32 PCAfterInstructionExecutes(DThread *aThread, TUint32 aCurrentPC, TUint32 aStatusRegister, TInt aInstSize, TUint32 &aNewRangeEnd, TBool &aChangingModes);
+	TUint32 ShiftedRegValue(DThread *aThread, TUint32 aInstruction, TUint32 aCurrentPC, TUint32 aStatusRegister);
+	TInt ModifyBreaksForStep(DThread *aThread, TUint32 aRangeStart, TUint32 aRangeEnd,TBool aResumeOnceOutOfRange, TBool aCheckForStubs, const TUint32 aNumSteps);
+
+private:
+
+	// Needed to access private data until re-structuring work is complete.
+	friend class DRM_DebugChannel;
+
+	DRM_DebugChannel* iChannel;	// temporary reference back to DRM_DebugChannel to help with refactoring
+
+	// Set of inline functions for decoding instructions. Formerly these were all macros
+
+	// ARM instruction bitmasks
+	inline TUint32 arm_opcode(const TUint32 aInst);
+
+	// Generic instruction defines
+	inline TUint32 arm_rm(const TUint32 aInst);
+	inline TUint32 arm_rs(const TUint32 aInst);
+	inline TUint32 arm_rd(const TUint32 aInst);
+	inline TUint32 arm_rn(const TUint32 aInst);
+	inline TUint32 arm_load(const TUint32 aInst);
+
+	// Data processing instruction defines
+	inline TUint32 arm_data_shift(const TUint32 aInst);
+	inline TUint32 arm_data_c(const TUint32 aInst);
+	inline TUint32 arm_data_imm(const TUint32 aInst);
+	inline TUint32 arm_data_rot(const TUint32 aInst);
+
+	// Single date transfer instruction defines
+	inline TUint32 arm_single_imm(const TUint32 aInst);
+	inline TUint32 arm_single_byte(const TUint32 aInst);
+	inline TUint32 arm_single_u(const TUint32 aInst);
+	inline TUint32 arm_single_pre(const TUint32 aInst);
+
+	// Block data transfer instruction defines
+	inline TUint32 arm_block_reglist(const TUint32 aInst);
+	inline TUint32 arm_block_u(const TUint32 aInst);
+	inline TUint32 arm_block_pre(const TUint32 aInst);
+
+	// Branch instruction defines
+	inline TUint32 arm_b_addr(const TUint32 aInst);
+	inline TUint32 arm_instr_b_dest(const TUint32 aInst, TUint32& aAddr);
+	inline TUint32 thumb_b_addr(const TUint32 aInst);
+	inline TUint32 thumb_instr_b_dest(const TUint32 aInst, TUint32& aAddr);
+	inline TUint32 arm_carry_bit(void);
+	
+
+	// Thumb instruction bitmasks
+	inline TUint16 thumb_opcode(const TUint16 aInst);
+	inline TUint16 thumb_inst_7_15(const TUint16 aInst);
+	inline TUint16 thumb_inst_8_15(const TUint16 aInst);
+
+	// Thumb2 decode support functions
+	inline TUint16 t2opcode16(const TUint16 aInst);
+
+	inline TUint16 t2opcode16special(const TUint16 aInst);
+
+	// Helper functions
+	TInt CurrentPC(DThread* aThread, TUint32& aPC);
+
+	TInt CurrentCPSR(DThread* aThread, TUint32& aCPSR);	
+
+	TInt CurrentInstruction(DThread* aThread, TUint32& aInstruction);
+
+	TInt CurrentArchMode(const TUint32 cpsr, Debug::TArchitectureMode& mode);
+
+	TInt RegisterValue(DThread *aThread, const TUint32 aKernelRegisterId, TUint32 &aValue);
+
+	TInt ReadMem32(DThread* aThread, const TUint32 aAddress, TUint32& aValue);
+
+	TInt ReadMem16(DThread* aThread, const TUint32 aAddress, TUint16& aValue);
+
+	TInt ReadMem8(DThread* aThread, const TUint32 aAddress, TUint8& aValue);
+
+	inline TUint32 BitCount(const TUint32 aVal);
+
+	inline TUint32 IsBitSet(const TUint32 aBitset, const TUint8 aBitNum);
+};
+
+#include "d_rmd_stepping.inl"
+
+#endif	// D_RMD_STEPPPING_H
+
+// End of file - d-rmd-stepping.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/d_rmd_stepping.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,313 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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
+ @internalComponent
+ @released
+*/
+
+#ifndef D_RMD_STEPPING_INL
+#define D_RMD_STEPPING_INL
+
+//
+// IsBitSet
+//
+// Returns 1 if the bit 'aNum' is set within aBitset, 0 otherwise
+inline TUint32 DRMDStepping::IsBitSet(const TUint32 aBitset, const TUint8 aNum)
+	{
+	return (aBitset & (1 << aNum) );
+	}
+
+// 
+// BitCount
+//
+// Count number of bits in aVal
+inline TUint32 DRMDStepping::BitCount(const TUint32 aVal)
+	{
+	TUint32 num = 0;
+
+	for(TInt i = 0; i < 32; i++)
+		{
+		if ((1 << i) & aVal)
+			{
+			num++;
+			}
+		}
+	return num;
+	}
+
+//
+// Thumb2 opcode decoding
+//
+// Special data instructions and branch and exchange.
+//
+// Returns Opcode as defined in ARM ARM DDI0406A, section A6.2.3
+inline TUint16 DRMDStepping::t2opcode16special(const TUint16 aInst)
+	{
+	TUint8 aVal = (aInst & 0x03C0) >> 5;
+
+	return aVal;
+	}
+
+
+// Thumb2 opcode decoding instructions
+// 
+// Returns Opcode as defined in ARM ARM DDI0406A, section A6.2
+// 16-bit Thumb instruction encoding
+inline TUint16 DRMDStepping::t2opcode16(const TUint16 aInst)
+{
+	TUint16 aVal = (aInst & 0xFC00) >> 9;
+
+	return aVal;
+}
+
+// ARM opcode decoding functions
+inline TUint32 DRMDStepping::arm_opcode(const TUint32 aInst)
+{
+// #define ARM_OPCODE(x)		(((TUint32)(x) & 0x0E000000) >> 25)
+
+	TUint32 aVal = ((aInst) & 0x0E000000) >> 25;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping:: arm_rm(const TUint32 aInst)
+{
+//#define ARM_RM(x)				((TUint32)(x) & 0x0000000F)			// bit 0- 4
+
+	TUint32 aVal = (aInst) & 0x0000000F;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping:: arm_rs(const TUint32 aInst)
+{
+//#define ARM_RS(x)				(((TUint32)(x) & 0x00000F00) >> 8)	// bit 8-11
+
+	TUint32 aVal = ((aInst) & 0x00000F00) >> 8;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping:: arm_rd(const TUint32 aInst)
+{
+//#define ARM_RD(x)				(((TUint32)(x) & 0x0000F000) >> 12)	// bit 12-15
+
+	TUint32 aVal = ((aInst) & 0x0000F000) >> 12;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping:: arm_rn(const TUint32 aInst)
+{
+//#define ARM_RN(x)				(((TUint32)(x) & 0x000F0000) >> 16)	// bit 16-19
+
+	TUint32 aVal = ((aInst) & 0x000F0000) >> 16;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping::arm_load(const TUint32 aInst)
+{
+//#define ARM_LOAD(x)				(((TUint32)(x) & 0x00100000) >> 20)	// bit 20
+
+	TUint32 aVal = ((aInst) & 0x00100000) >> 20;
+
+	return aVal;
+}
+
+// Data processing instruction defines
+inline TUint32 DRMDStepping::arm_data_shift(const TUint32 aInst)
+{
+//#define ARM_DATA_SHIFT(x)		(((TUint32)(x) & 0x00000060) >> 5) 	// bit 5- 6
+	
+	TUint32 aVal = ((aInst) & 0x00000060) >> 5;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping::arm_data_c(const TUint32 aInst)
+{
+//#define ARM_DATA_C(x)			(((TUint32)(x) & 0x00000F80) >> 7) 	// bit 7-11
+
+	TUint32 aVal = ((aInst) & 0x00000F80) >> 7;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping::arm_data_imm(const TUint32 aInst)
+{
+//#define ARM_DATA_IMM(x)			((TUint32)(x) & 0x000000FF)			// bit 0-7
+
+	TUint32 aVal = (aInst) & 0x000000FF;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping::arm_data_rot(const TUint32 aInst)
+{
+//#define ARM_DATA_ROT(x)			(((TUint32)(x) & 0x00000F00) >> 8) 	// bit 8-11
+
+	TUint32 aVal = ((aInst) & 0x00000F00) >> 8;
+
+	return aVal;
+}
+
+// Single date transfer instruction defines
+inline TUint32 DRMDStepping::arm_single_imm(const TUint32 aInst)
+{
+//#define ARM_SINGLE_IMM(x)		((TUint32)(x) & 0x00000FFF)			// bit 0-11
+
+	TUint32 aVal = (aInst) & 0x00000FFF;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping::arm_single_byte(const TUint32 aInst)
+{
+//#define ARM_SINGLE_BYTE(x)		(((TUint32)(x) & 0x00400000) >> 22)	// bit 22
+
+	TUint32 aVal = ((aInst) & 0x00400000) >> 22;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping::arm_single_u(const TUint32 aInst)
+{
+//#define ARM_SINGLE_U(x)			(((TUint32)(x) & 0x00800000) >> 23)	// bit 23
+
+	TUint32 aVal = ((aInst) & 0x00800000) >> 23;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping::arm_single_pre(const TUint32 aInst)
+{
+//#define ARM_SINGLE_PRE(x)		(((TUint32)(x) & 0x01000000) >> 24)	// bit 24
+
+	TUint32 aVal = ((aInst) & 0x01000000) >> 24;
+
+	return aVal;
+}
+
+// Block data transfer instruction defines
+inline TUint32 DRMDStepping::arm_block_reglist(const TUint32 aInst)
+{
+//#define ARM_BLOCK_REGLIST(x)	((TUint32)(x) & 0x0000FFFF)		// bit 0-15
+
+	TUint32 aVal = (aInst) & 0x0000FFFF;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping::arm_block_u(const TUint32 aInst)
+{
+//#define ARM_BLOCK_U(x)			(((TUint32)(x) & 0x00800000) >> 23)	// bit 23
+
+	TUint32 aVal = ((aInst) & 0x00800000) >> 23;
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping::arm_block_pre(const TUint32 aInst)
+{
+//#define ARM_BLOCK_PRE(x)		(((TUint32)(x) & 0x01000000) >> 24)	// bit 24
+
+	TUint32 aVal = ((aInst) & 0x01000000) >> 24;
+
+	return aVal;
+}
+
+// Branch instruction defines
+inline TUint32 DRMDStepping::arm_b_addr(const TUint32 aInst)
+{
+//#define ARM_B_ADDR(x)			((x & 0x00800000) ? ((TUint32)(x) & 0x00FFFFFF | 0xFF000000) : (TUint32)(x) & 0x00FFFFFF)
+
+	TUint32 aVal = ((aInst & 0x00800000) ? ((TUint32)(aInst) & 0x00FFFFFF | 0xFF000000) : (TUint32)(aInst) & 0x00FFFFFF);
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping::arm_instr_b_dest(const TUint32 aInst, TUint32& aAddress)
+{
+//#define ARM_INSTR_B_DEST(x,a)	(ARM_B_ADDR(x) << 2) + ((TUint32)(a) + 8)
+
+	TUint32 aVal = (arm_b_addr(aInst) << 2) + ((TUint32)(aAddress) + 8);
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping::thumb_b_addr(const TUint32 aInst)
+{
+//#define THUMB_B_ADDR(x) ((x & 0x0400) ? ((((TUint32)(x) & 0x07FF)<<11) | (((TUint32)(x) & 0x07FF0000)>>16) | 0xFFC00000) :\
+                                            ((TUint32)(x) & 0x07FF)<<11) | (((TUint32)(x) & 0x07FF0000)>>16)
+
+	TUint32 aVal = ((((TUint32)(aInst) & 0x07FF)<<11) | ((TUint32)(aInst) & 0x07FF0000)>>16);
+
+	return ((aInst & 0x0400) ? (aVal | 0xFFC00000) : aVal);
+}
+
+inline TUint32 DRMDStepping::thumb_instr_b_dest(const TUint32 aInst, TUint32& aAddress)
+{
+//#define THUMB_INSTR_B_DEST(x,a)	(THUMB_B_ADDR(x) << 1) + ((TUint32)(a) + 4)
+
+	TUint32 aVal = (thumb_b_addr(aInst) << 1) + ((TUint32)(aAddress) + 4);
+
+	return aVal;
+}
+
+inline TUint32 DRMDStepping::arm_carry_bit(void)
+{
+//#define ARM_CARRY_BIT			0x20000000	// bit 30
+
+	TUint32 aVal = 0x20000000;
+
+	return aVal;
+}
+
+// Thumb instruction bitmasks
+inline TUint16 DRMDStepping::thumb_opcode(const TUint16 aInst)
+{
+//	#define THUMB_OPCODE(x)		(((TUint16)(x) & 0xF800) >> 11)
+
+	TUint16 aVal = ((aInst) & 0xF800) >> 11;
+
+	return aVal;
+}
+
+inline TUint16 DRMDStepping::thumb_inst_7_15(const TUint16 aInst)
+{
+//	#define THUMB_INST_7_15(x)	(((TUint16)(x) & 0xFF80) >> 7)
+
+	TUint16 aVal = ((aInst) & 0xFF80) >> 7;
+
+	return aVal;
+}
+
+inline TUint16 DRMDStepping::thumb_inst_8_15(const TUint16 aInst)
+{
+//	#define THUMB_INST_8_15(x)	(((TUint16)(x) & 0xFF00) >> 8)
+
+	TUint16 aVal = ((aInst) & 0xFF00) >> 8;
+
+	return aVal;
+}
+
+#endif	// D_RMD_STEPPPING_INL
+
+// End of file - d-rmd-stepping.inl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/d_target_process.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,57 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Purpose: Kernel-side tracking of process state
+// 
+//
+ 
+#ifndef D_TARGET_PROCESS_H
+#define D_TARGET_PROCESS_H
+
+#include "d_debug_agent.h"
+
+// Debug Process Tracker class
+class DTargetProcess : public DBase
+{
+public:
+	DTargetProcess();
+	~DTargetProcess();
+
+	static TInt Compare(const DTargetProcess& aFirst, const DTargetProcess& aSecond);
+
+	TInt SetProcessName(const TDesC8& aProcessName);
+	const TDesC8& ProcessName() const;
+
+	TInt AddAgent(const TUint64 aAgentId);
+
+	TInt RemoveAgent(TUint64 aAgentId);
+
+	DDebugAgent* operator[](TInt aIndex);
+
+	DDebugAgent* Agent(TUint64 aAgentId);
+
+	TInt AgentCount() const;
+	void NotifyEvent(const TDriverEventInfo& aEventInfo);
+
+private:
+	HBuf8* iProcessName;
+	RPointerArray<DDebugAgent> iAgentList;
+
+	RArray<TUint64> iSuspendedThreads;
+
+	RPointerArray<NFastSemaphore> iFrozenThreadSemaphores;
+
+};
+
+#endif // D_TARGET_PROCESS_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/debug_logging.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,108 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Logging macros for use in debug subsystem
+// 
+//
+
+#ifndef DEBUG_LOGGING_H
+#define DEBUG_LOGGING_H
+
+/**
+ * Debug messages
+ * 
+ * Debug messages are only generated for debug builds.
+ * 
+ * For kernel mode, use __KTRACE_OPT(KDEBUGGER, Kern::Printf(), 
+ * for user mode use RDebug::Printf(). 
+ * 
+ */
+
+#ifdef _DEBUG
+
+  #ifdef __KERNEL_MODE__
+
+	#include <kernel/kernel.h>
+	#include <nk_trace.h>
+
+	#define LOG_MSG( a )				__KTRACE_OPT(KDEBUGGER, Kern::Printf( a ))
+	#define LOG_MSG2( a, b )			__KTRACE_OPT(KDEBUGGER, Kern::Printf( a, b ))
+	#define LOG_MSG3( a, b, c )			__KTRACE_OPT(KDEBUGGER, Kern::Printf( a, b, c ))
+	#define LOG_MSG4( a, b, c, d )		__KTRACE_OPT(KDEBUGGER, Kern::Printf( a, b, c, d ))
+	#define LOG_MSG5( a, b, c, d, e )	__KTRACE_OPT(KDEBUGGER, Kern::Printf( a, b, c, d, e ))
+
+	#ifdef __LOG_EVENTS__
+
+	#define LOG_EVENT_MSG( a )				__KTRACE_OPT(KDEBUGGER, Kern::Printf( a ))
+	#define LOG_EVENT_MSG2( a, b )			__KTRACE_OPT(KDEBUGGER, Kern::Printf( a, b ))
+	#define LOG_EVENT_MSG3( a, b, c )		__KTRACE_OPT(KDEBUGGER, Kern::Printf( a, b, c ))
+	#define LOG_EVENT_MSG4( a, b, c, d )	__KTRACE_OPT(KDEBUGGER, Kern::Printf( a, b, c, d ))
+	#define LOG_EVENT_MSG5( a, b, c, d, e )	__KTRACE_OPT(KDEBUGGER, Kern::Printf( a, b, c, d, e ))
+	
+	#else
+
+	#define LOG_EVENT_MSG( a )
+	#define LOG_EVENT_MSG2( a, b )
+	#define LOG_EVENT_MSG3( a, b, c )
+	#define LOG_EVENT_MSG4( a, b, c, d )
+	#define LOG_EVENT_MSG5( a, b, c, d, e )
+
+	#endif
+
+  #else
+
+    #include <e32debug.h>
+
+	#define LOG_MSG( a )				RDebug::Printf( a )
+	#define LOG_MSG2( a, b )			RDebug::Printf( a, b )
+	#define LOG_MSG3( a, b, c )			RDebug::Printf( a, b, c )
+	#define LOG_MSG4( a, b, c, d )		RDebug::Printf( a, b, c, d )
+	#define LOG_MSG5( a, b, c, d, e )	RDebug::Printf( a, b, c, d, e )
+
+	#ifdef __LOG_EVENTS__
+
+	#define LOG_EVENT_MSG( a )					RDebug::Printf( a )
+	#define LOG_EVENT_MSG2( a, b )				RDebug::Printf( a, b )
+	#define LOG_EVENT_MSG3( a, b, c )			RDebug::Printf( a, b, c )
+	#define LOG_EVENT_MSG4( a, b, c, d )		RDebug::Printf( a, b, c, d )
+	#define LOG_EVENT_MSG5( a, b, c, d, e )		RDebug::Printf( a, b, c, d, e )
+
+	#else
+
+	#define LOG_EVENT_MSG( a )
+	#define LOG_EVENT_MSG2( a, b )
+	#define LOG_EVENT_MSG3( a, b, c )
+	#define LOG_EVENT_MSG4( a, b, c, d )
+	#define LOG_EVENT_MSG5( a, b, c, d, e )
+
+    #endif
+
+    #endif
+#else
+
+	#define LOG_MSG( a )
+	#define LOG_MSG2( a, b )
+	#define LOG_MSG3( a, b, c )
+	#define LOG_MSG4( a, b, c, d )
+	#define LOG_MSG5( a, b, c, d, e )
+
+	#define LOG_EVENT_MSG( a )
+	#define LOG_EVENT_MSG2( a, b )
+	#define LOG_EVENT_MSG3( a, b, c )
+	#define LOG_EVENT_MSG4( a, b, c, d )
+	#define LOG_EVENT_MSG5( a, b, c, d, e )
+
+#endif
+
+#endif //DEBUG_LOGGING_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/debug_utils.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,38 @@
+// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Purpose: Static functions for use by debug driver classes
+//
+
+/**
+ * @file
+ * @internalComponent
+ * @released
+ */
+
+#ifndef DEBUG_UTILS_H
+#define DEBUG_UTILS_H
+
+#include <kernel/kern_priv.h>
+#include <rm_debug_api.h>
+
+class DebugUtils
+	{
+public:
+	static DThread* OpenThreadHandle(TUint64 aThreadId);
+	static DProcess* OpenProcessHandle(TUint64 aProcessId);
+	static DThread* OpenFirstThreadForProcess(DProcess* aProcess);
+	};
+
+#endif //DEBUG_UTILS_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/rm_debug_driver.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,199 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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
+ @internalTechnology
+ @released
+*/
+
+#ifndef __RM_DEBUG_DRIVER_H__
+#define __RM_DEBUG_DRIVER_H__
+
+#include "d_rmd_stepping.h"
+#include "d_rmd_breakpoints.h"
+#include "d_driver_event_info.h"
+
+// From mmboot.h header
+const TLinAddr	KDataSectionEnd			=0x40000000u;
+const TLinAddr	KRomLinearBase			=0xF8000000u;
+
+
+#define ROM_LINEAR_BASE KRomLinearBase
+
+// Result checking
+#define ReturnIfError(x) { TInt y = x; if (KErrNone != y) return y; }
+
+//
+// class DRM_DebugDriverFactory
+//
+class DRM_DebugDriverFactory : public DLogicalDevice
+{
+public:
+
+	DRM_DebugDriverFactory();
+	virtual TInt Install();
+	virtual void GetCaps(TDes8& aDes) const;
+	virtual TInt Create(DLogicalChannelBase*& aChannel);
+};
+
+class DRM_DebugEventHandler;
+//
+// DRM_DebugChannel
+//
+class DRM_DebugChannel : public DLogicalChannel
+{
+public:
+
+	DRM_DebugChannel(DLogicalDevice* aLogicalDevice);
+	~DRM_DebugChannel();
+
+	virtual TInt DoCreate(TInt aUnit, const TDesC* anInfo, const TVersion& aVer);	
+	virtual void HandleMsg(TMessageBase* aMsg);
+	virtual TInt SendMsg(TMessageBase* aMsg);
+	TInt SendRequest(TMessageBase* aMsg);
+	
+	//called from the event handler
+	TBool RemoveProcess(TAny* a1, TAny* a2);
+	TBool StartThread(TAny* a1, TAny* a2);
+	TBool AddLibrary(TAny* a1, TAny* a2);
+	TBool RemoveLibrary(TAny* a1, TAny* a2);
+	TBool HandleEventKillThread(TAny* a1, TAny* a2);
+	TBool HandleSwException(TAny* a1, TAny* a2);
+	TBool HandleHwException(TAny* a1, TAny* a2);
+	TBool HandleUserTrace(TAny* a1, TAny* a2);
+	TBool HandleUnsupportedEvent(TAny* a1, TAny* a2) { return EFalse; }
+	TBool HandleAddProcessEvent(TAny* a1, TAny* a2);
+	TBool HandleRemoveProcessEvent(TAny* a1, TAny* a2);
+	
+	// Used to be able to signal events to the DSS
+	DThread* ClientThread(void) {return iClientThread; };
+	
+protected:
+	virtual void DoCancel(TInt aReqNo);
+	virtual void DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2);
+	virtual TInt DoControl(TInt aFunction, TAny *a1, TAny *a2);
+	
+private:
+	TInt PreAsyncGetValue(Debug::TEventInfo* aValue, TRequestStatus* aStatus);
+	TInt CreateDfcQ();
+	void DestroyDfcQ();
+	TBool HandleInvalidOpCodeException(TDriverEventInfo& aEventInfo, DThread* aCurrentThread);
+
+	TInt SetBreak(TSetBreakInfo* aBreakInfo);
+	TInt StepRange(DThread* aThread, TRM_DebugStepInfo* aStepInfo);
+	TInt ReadMemory(DThread* aThread, TRM_DebugMemoryInfo* aMemoryInfo);
+	TInt WriteMemory(DThread* aThread, TRM_DebugMemoryInfo* aMemoryInfo);
+	TInt ReadRegistersLegacy(DThread* aThread, TRM_DebugRegisterInfo* aRegisterInfo);
+	TInt WriteRegistersLegacy(DThread* aThread, const TRM_DebugRegisterInfo* aRegisterInfo);
+	TInt ReadRegisters(DThread* aThread, TRM_DebugRegisterInformation* aRegisterInfo) const;
+	TInt WriteRegisters(DThread* aThread, TRM_DebugRegisterInformation* aRegisterInfo) const;
+	TInt GetProcessInfo(TInt aIndex, TRM_DebugTaskInfo* aTaskInfo);
+	TInt GetThreadInfo(TInt aIndex, TRM_DebugTaskInfo* aTaskInfo);
+	TInt GetList(TListInformation* aListInformation) const;
+	
+	TInt Step(const TUint32 aThreadId, const TUint32 aNumSteps);
+	TInt KillProcess(const TUint32 aProcessId, const TInt aReason);
+
+	//Crash Flash	
+	TInt ReadCrashLog(TFlashInfo* aBuffer);
+	TInt WriteCrashLog(TFlashInfo* aBuffer) const;
+	TInt EraseCrashLog();
+
+	// Stop/go
+	TInt DoSuspendThread(DThread *aThread);
+	TInt DoResumeThread(DThread *aThread);
+	TInt DoStepRange(DThread *aThread, const TUint32 aStartAddress, const TUint32 aStopAddress, TBool aStepInto, TBool aResumeOnceOutOfRange, const TUint32 aNumSteps, TBool aUserRequest = EFalse);
+	TInt DoReadMemory(const DThread *aThread, const TUint32 aAddress, const TUint32 aLength, TDes8 &aData) const;
+	TInt DoWriteMemory(DThread *aThread, const TUint32 aAddress, const TUint32 aLength, TDes8 &aData);
+	TInt DoReadRegisters(DThread *aThread, const TInt16 aFirstRegister, const TInt16 aLastRegister, TDes8 &aValues);
+	TInt DoReadRegisters(DThread *aThread, const TDesC8 &aRegisterIds, TDes8 &aRegisterValues, TDes8 &aRegisterFlags) const;
+	TInt DoWriteRegisters(DThread *aThread, const TInt16 aFirstRegister, const TInt16 aLastRegister, TDesC8 &aValues);
+	TInt DoWriteRegisters(DThread *aThread, const TDesC8 &aRegisterIds, TDesC8 &aRegisterValues, TDes8 &aRegisterFlags) const;
+	TInt DoGetProcessInfo(const TInt aIndex, TRM_DebugTaskInfo *aInfo);
+	TInt DoGetThreadInfo(const TInt aIndex, TRM_DebugTaskInfo *aInfo);
+	TBool DoSecurityCheck();
+
+	TInt TryToReadMemory(const DThread *aThread, const TAny *aSrc, TAny *aDest, const TUint32 aLength) const;
+	TInt TryToWriteMemory(const DThread *aThread, TAny *aDest, const TAny *aSrc, const TUint32 aLength);
+	TInt32 ReadRegister(DThread *aThread, TInt aNum);
+	TInt32 ReadDebugRegisterValue(DThread *aThread, const Debug::TRegisterInfo aDebugRegisterId, T4ByteRegisterValue &aValue) const;
+	TInt32 ReadKernelRegisterValue(DThread *aThread, const TArmReg aKernelRegisterId, T4ByteRegisterValue &aValue) const;
+	
+	void NotifyEvent(const TDriverEventInfo& aEventInfo);
+
+	TInt GetTRegisterInfo(const TDesC8 &aRegisterIds, const TUint aIndex, Debug::TRegisterInfo &aValue) const;
+	TInt GetDebugRegisterId(const TArmReg aKernelRegister, Debug::TRegisterInfo& aDebugRegister) const;
+	TInt GetKernelRegisterId(const Debug::TRegisterInfo aDebugRegister, TArmReg& aKernelRegister) const;
+	TBool GetFlagAtOffset(const TUint32 aFlags, const TArmReg aIndex) const;
+
+	TInt AllocAndReadDes(DThread *aThread, const TDesC8& aSrcDes, TPtr8& aDestDes, const TBool aReadFromClient=ETrue, const TUint aOffset=0) const;
+
+	TInt AttachProcess(TAny* a1, TAny* a2);
+	TInt DetachProcess(TAny* a1, TAny* a2);
+	TInt DetachAgent(TAny* a1, TAny* a2);
+	TInt SetEventAction(TAny* a1, TAny* a2);
+	TBool CheckSuspended(const DThread *aThread) const;
+
+	// Needed so moved functions can access iBreakpoint list and related functions
+	friend class D_RMD_Breakpoints;
+	// Needed so moved functions can access stepping functionality
+	friend class DRMDStepping;
+
+	// helper function was previously in rm_debug_kerneldriver.cpp
+	inline TInt Bitcount(TUint32 val)
+		{
+			TInt nbits;
+
+			for (nbits = 0; val != 0; nbits++)
+			{
+				val &= val - 1;		// delete rightmost 1-bit in val
+			}
+			
+			return nbits;
+		}
+
+	// Security critical - this returns whether the specified process is debuggable or not
+	TInt IsDebuggable(const TUint32 aProcessId);
+	
+	TInt NotifyAgentsFromEventPid(const TDriverEventInfo& aEventInfo);
+
+private:
+	DThread* iClientThread;
+	DRM_DebugEventHandler* iEventHandler;
+	
+	TUint32 iExcludedROMAddressStart;
+	TUint32 iExcludedROMAddressEnd;
+	
+	TUint32 iPageSize;
+	
+	RArray<Debug::TProcessInfo> iDebugProcessList; //processes that we are debugging
+
+	D_RMD_Breakpoints* iBreakManager;	// new D_RMD_Breakpoints
+
+	DRMDStepping* iStepper;				// new DRMDStepping
+
+	DSemaphore* iStepLock;				// Synchronisation for stepping code.
+
+	TDynamicDfcQue* iDfcQ;
+
+	TBool	iInitialisedCodeModifier;	// Ensures we control its lifetime
+
+	TClientDataRequest<Debug::TEventInfo>* iAsyncGetValueRequest;
+};
+
+#endif //__RM_DEBUG_DRIVER_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/rm_debug_eventhandler.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,60 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+//
+
+/** Event handler and container for all objects being tracked.  */
+#ifndef __RM_DEBUG_EVENTHANDLER_H__
+#define __RM_DEBUG_EVENTHANDLER_H__
+
+
+class DRM_DebugEventHandler : public DKernelEventHandler
+{
+	public:
+		DRM_DebugEventHandler();
+		TInt Create(DLogicalDevice* aDevice, DLogicalChannel* aChannel, DThread* aClient);
+		~DRM_DebugEventHandler();
+		TInt Start();
+		TInt Stop();
+		
+		inline void DRM_DebugEventHandler::LockDataAccess()
+		    {
+		    Kern::SemaphoreWait(*iProtectionLock);
+		    }
+
+		inline void DRM_DebugEventHandler::ReleaseDataAccess()
+		    {
+		    Kern::SemaphoreSignal(*iProtectionLock);
+		    }
+		
+	private:
+		static TUint EventHandler(TKernelEvent aEvent, TAny* a1, TAny* a2, TAny* aThis);
+		TUint HandleEvent(TKernelEvent aType, TAny* a1, TAny* a2);
+		TBool HandleSpecificEvent(TKernelEvent aType, TAny* a1, TAny* a2);
+		
+	private:
+		/** Used to serialise access data structures */
+		DSemaphore* iProtectionLock;
+
+		TBool iTracking;
+
+		DLogicalDevice* iDevice;	// open reference to LDD for avoiding lifetime issues
+		DThread* iClientThread;
+		DRM_DebugChannel* iChannel;
+
+		// typdef for functions which handle our specific events
+		typedef TBool (DRM_DebugChannel::*eventHandler)(TAny* a1, TAny* a2);
+		eventHandler iEventHandlers[EEventLimit];
+};
+
+#endif //__RM_DEBUG_EVENTHANDLER_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/inc/rm_debug_kerneldriver.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,777 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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
+ @internalTechnology
+ @released
+*/
+
+#ifndef __RM_DEBUG_KERNELDRIVER_H__
+#define __RM_DEBUG_KERNELDRIVER_H__
+
+#include <rm_debug_api.h>
+
+/**
+Used to store a value read from or written to an ARM register
+*/
+typedef TUint32 T4ByteRegisterValue;
+
+
+/** 
+Provides static methods for accessing the information stored in a TRegisterInfo
+object.
+*/
+class Register
+	{
+public:
+	static TBool IsCoreReg(const Debug::TRegisterInfo aRegister);
+	static TBool IsCoproReg(const Debug::TRegisterInfo aRegister);
+	static TUint32 GetCoreRegId(const Debug::TRegisterInfo aRegister);
+	static TUint32 GetCRm(const Debug::TRegisterInfo aRegister);
+	static TUint32 GetCRn(const Debug::TRegisterInfo aRegister);
+	static TUint32 GetOpcode1(const Debug::TRegisterInfo aRegister);
+	static TUint32 GetOpcode2(const Debug::TRegisterInfo aRegister);
+	static TUint32 GetCoproNum(const Debug::TRegisterInfo aRegister);
+	};
+
+/**
+Identify whether aRegister is a core register
+@param aRegister register ID to analyse
+@return ETrue if core register, EFalse otherwise
+*/
+inline TBool Register::IsCoreReg(const Debug::TRegisterInfo aRegister)
+	{
+	return ((aRegister & 0xff) == 0x0);
+	}
+
+/**
+Identify whether aRegister is a coprocessor register
+@param aRegister register ID to analyse
+@return ETrue if coprocessor register, EFalse otherwise
+*/
+inline TBool Register::IsCoproReg(const Debug::TRegisterInfo aRegister)
+	{
+	return ((aRegister & 0xff) == 0x1);
+	}
+
+/**
+Get the ID of the core register
+@param aRegister register ID to analyse
+@return ID of the core register
+*/
+inline TUint32 Register::GetCoreRegId(const Debug::TRegisterInfo aRegister)
+	{
+	return ((aRegister >> 8) & 0xff);
+	}
+
+/**
+Get the CRm value of a coprocessor register
+@param aRegister register ID to analyse
+@return the CRm value of a coprocessor register
+*/
+inline TUint32 Register::GetCRm(const Debug::TRegisterInfo aRegister)
+	{
+	return ((aRegister >> 16) & 0xf);
+	}
+
+/**
+Get the CRm value of a coprocessor register
+@param aRegister register ID to analyse
+@return the CRm value of a coprocessor register
+*/
+inline TUint32 Register::GetCRn(const Debug::TRegisterInfo aRegister)
+	{
+	return ((aRegister >> 20) & 0xf);
+	}
+
+/**
+Get the Opcode1 value of a coprocessor register
+@param aRegister register ID to analyse
+@return the Opcode1 value of a coprocessor register
+*/
+inline TUint32 Register::GetOpcode1(const Debug::TRegisterInfo aRegister)
+	{
+	return ((aRegister >> 24) & 0x8);
+	}
+	
+/**
+Get the Opcode2 value of a coprocessor register
+@param aRegister register ID to analyse
+@return the Opcode2 value of a coprocessor register
+*/
+inline TUint32 Register::GetOpcode2(const Debug::TRegisterInfo aRegister)
+	{
+	return ((aRegister >> 27) & 0x8);
+	}
+
+/**
+Get the coprocessor number of a coprocessor register
+@param aRegister register ID to analyse
+@return the coprocessor number of a coprocessor register
+*/
+inline TUint32 Register::GetCoproNum(const Debug::TRegisterInfo aRegister)
+	{
+	return ((aRegister >> 8) & 0xff);
+	}
+
+//
+// class TCapsRM_DebugDriver
+//
+class TCapsRM_DebugDriver
+{
+public:
+	TVersion	iVersion;
+};
+
+/**
+Stores listings information for passing between the DSS and the kernel driver
+*/
+class TListInformation
+{
+public:
+	inline TListInformation(const Debug::TListId aType=(Debug::TListId)NULL, const Debug::TListScope aListScope=(Debug::TListScope)NULL, TDes8* aBuffer=NULL, TUint32* aDataSize=NULL, TUint64 aTargetId=0)
+		: iType(aType),
+		  iListScope(aListScope),
+		  iBuffer(aBuffer),
+		  iDataSize(aDataSize),
+		  iTargetId(aTargetId) {};
+public:
+	Debug::TListId iType;
+	Debug::TListScope iListScope;
+	TDes8* iBuffer;
+	TUint32* iDataSize;
+	TUint64 iTargetId;
+};
+
+/**
+Data structure to hold information to the crash flash
+(Possibly: Could be expanded to hold on configuration data too)
+*/
+class TFlashInfo
+{
+public:
+	inline TFlashInfo(TUint32 aPos, TUint32* aSize, TDes8* aData)
+		:iPos(aPos),
+		iSize(aSize),
+		iData(aData){};
+public:
+	TUint32 iPos;
+	TUint32* iSize;	
+	 TDes8* iData;	
+};
+//
+// class TRM_DebugMemoryInfo
+//
+class TRM_DebugMemoryInfo
+{
+public:
+
+	inline TRM_DebugMemoryInfo(const TUint32 aAddress, const TUint32 aLength, TDesC8 *aData)
+				: iAddress(aAddress),
+				  iLength(aLength),
+				  iData(aData) {};
+	
+public:
+
+	TUint32 iAddress;
+	TUint32	iLength;
+	TDesC8*	iData;
+};
+
+
+/**
+@deprecated
+This class is only used by TRK phase 1 functions.
+
+@see TRM_DebugRegisterInformation which offers similar storage suitable for use
+with the TRK pahse 2 API.
+*/
+class TRM_DebugRegisterInfo
+{
+public:
+
+	inline TRM_DebugRegisterInfo(const TInt16 aFirstRegister, const TInt16 aLastRegister, TDesC8 *aValues)
+				: iFirstRegister(aFirstRegister),
+				  iLastRegister(aLastRegister),
+				  iValues(aValues) {};
+	
+public:
+
+	TInt16	iFirstRegister;
+	TInt16	iLastRegister;
+	TDesC8*	iValues;
+};
+
+/**
+Structure used to store information about registers
+*/
+class TRM_DebugRegisterInformation
+{
+public:
+
+	inline TRM_DebugRegisterInformation(const TDes8 *aRegisterIds=NULL, TDes8 *aRegisterValues=NULL, TDes8 *aRegisterFlags=NULL)
+		: iRegisterIds(aRegisterIds),
+		  iRegisterValues(aRegisterValues),
+		  iRegisterFlags(aRegisterFlags) {};
+	
+public:
+
+	const TDes8* iRegisterIds;
+	TDes8* iRegisterValues;
+	TDes8* iRegisterFlags;
+};
+
+//
+// class TRM_DebugTaskInfo
+//
+class TRM_DebugTaskInfo
+{
+public:
+
+	inline TRM_DebugTaskInfo(TUint32 aOtherId)
+				: iId(0),
+				  iOtherId(aOtherId),
+				  iPriority(0) { iName.FillZ(); };
+
+public:
+
+	TUint32 iId;
+	TUint32 iOtherId;
+	TUint32 iPriority;	
+	TBuf8<KMaxName> iName;
+};
+
+//
+// class TRM_DebugStepInfo
+//
+class TRM_DebugStepInfo
+{
+public:
+
+	inline TRM_DebugStepInfo(const TUint32 aStartAddress, const TUint32 aStopAddress, const TBool aStepInto)
+				: iStartAddress(aStartAddress),
+				  iStopAddress(aStopAddress),
+				  iStepInto(aStepInto) {};
+
+public:
+
+	TUint32 iStartAddress;
+	TUint32 iStopAddress;
+	TBool iStepInto;
+};
+
+
+//
+// class TRM_DebugDriverInfo
+//
+class TRM_DebugDriverInfo
+{
+public:
+
+	TUint32 iPanic1Address;
+	TUint32 iPanic2Address;
+	TUint32 iException1Address;
+	TUint32 iException2Address;
+	TUint32 iLibraryLoadedAddress;
+	TUint32 iUserLibraryEnd;
+};
+
+
+//
+// class TRM_DebugProcessInfo
+//
+class TRM_DebugProcessInfo
+{
+public:
+
+	inline TRM_DebugProcessInfo(TUint32 *aCodeAddress, TUint32 *aDataAddress)
+				: iCodeAddress(aCodeAddress),
+				  iDataAddress(aDataAddress) {};
+
+public:
+
+	TUint32* iCodeAddress;
+	TUint32* iDataAddress;
+};
+
+//
+// class TRM_DebugEventActionInfo
+//
+class TRM_DebugEventActionInfo
+{
+public:
+	inline TRM_DebugEventActionInfo(TUint32 aEvent, TUint32 aAction, TUint64 aAgentId)
+		: iEvent(aEvent),
+		iAction(aAction),
+		iAgentId(aAgentId) {};
+public:
+	TUint32 iEvent;
+	TUint32 iAction;
+	TUint64 iAgentId;
+};
+
+//
+// class TRM_DebugEventInfo
+//
+class TRM_DebugEventInfo
+{
+public:
+	inline TRM_DebugEventInfo(TDesC8& aProcessName, TUint32& aBufSize)
+		: iProcessName(aProcessName),
+		iBufSize(aBufSize) {};
+
+public:
+	TDesC8& iProcessName;
+	TUint32& iBufSize;
+};
+
+//
+// class TRMD_DebugAgentId
+//
+class TRM_DebugAgentId
+{
+public:
+	inline TRM_DebugAgentId(TUint64 aAgentId)
+		: iAgentId(aAgentId) {};
+
+public:
+	TUint64 iAgentId;
+};
+
+//
+// Class TRMD_DebugCancelInfo
+//
+class TRMD_DebugCancelInfo
+{
+public:
+	inline TRMD_DebugCancelInfo(TUint32 aCancelRequest,TDesC8& aProcessName, TUint64 aAgentId)
+		: iCancelRequest(aCancelRequest),
+		iProcessName(aProcessName),
+		iAgentId(aAgentId) {};
+
+	inline TRMD_DebugCancelInfo(void)
+		: iCancelRequest(0),
+	iAgentId(0)
+	{
+	};
+
+public:
+	TUint32 iCancelRequest;
+	TBuf8<KMaxName> iProcessName;
+	TUint64 iAgentId;
+};
+
+class TEventMetaData
+	{
+public:
+	TBuf8<KMaxName> iTargetProcessName;
+	TUint64 iDebugAgentProcessId;
+	};
+
+/**
+@internalComponent
+*/
+class TSetBreakInfo
+{
+public:
+
+	inline TSetBreakInfo(Debug::TBreakId* aBreakId,
+		TUint64 aId,\
+		TUint32 aAddress,\
+		Debug::TArchitectureMode aMode,
+		TBool aThreadSpecific)
+				: iBreakId(aBreakId),
+				  iId(aId),
+				  iAddress(aAddress),
+				  iMode(aMode),
+       				  iThreadSpecific(aThreadSpecific) {};
+
+inline TSetBreakInfo(void)
+			: iBreakId((Debug::TBreakId*)0),
+			  iId(0),
+			  iAddress(0),
+			  iMode(Debug::EArmMode),
+       			  iThreadSpecific(ETrue) {};
+
+
+public:
+	Debug::TBreakId* iBreakId;
+	TUint64 iId;
+	TUint32 iAddress;
+	Debug::TArchitectureMode iMode;
+	TBool iThreadSpecific;
+};
+
+/**
+@internalComponent
+*/
+class TModifyBreakInfo
+{
+public:
+
+	inline TModifyBreakInfo(Debug::TBreakId aBreakId,\
+		const TUint64 aThreadId,\
+		const TUint32 aAddress,\
+		const Debug::TArchitectureMode aMode)
+				: iBreakId(aBreakId),
+				  iThreadId(aThreadId),
+				  iAddress(aAddress),
+				  iMode(aMode) {};
+
+public:
+	const Debug::TBreakId iBreakId;
+	const TUint64 iThreadId;
+	const TUint32 iAddress;
+	const Debug::TArchitectureMode iMode;
+};
+
+/**
+@internalComponent
+*/
+class TModifyProcessBreakInfo
+{
+public:
+
+	inline TModifyProcessBreakInfo(Debug::TBreakId aBreakId,\
+		const TUint64 aProcessId,\
+		const TUint32 aAddress,\
+		const Debug::TArchitectureMode aMode)
+				: iBreakId(aBreakId),
+				  iProcessId(aProcessId),
+				  iAddress(aAddress),
+				  iMode(aMode) {};
+
+public:
+	const Debug::TBreakId iBreakId;
+	const TUint64 iProcessId;
+	const TUint32 iAddress;
+	const Debug::TArchitectureMode iMode;
+};
+
+/**
+@internalComponent
+*/
+class TGetBreakInfo
+{
+public:
+
+	inline TGetBreakInfo(Debug::TBreakId aBreakId,\
+		TUint64& aId,\
+		TUint32& aAddress,\
+		Debug::TArchitectureMode& aMode,
+		TBool& aThreadSpecific)
+				: iBreakId(aBreakId),
+				  iId(&aId),
+				  iAddress(&aAddress),
+				  iMode(&aMode),
+       				  iThreadSpecific(&aThreadSpecific) {};
+
+	inline TGetBreakInfo()
+				: iBreakId((Debug::TBreakId)0),
+				  iId((TUint64*)0),
+				  iAddress((TUint32*)0),
+				  iMode((Debug::TArchitectureMode*)0),
+       				  iThreadSpecific((TBool*)0)	{};
+
+public:
+	const Debug::TBreakId iBreakId;
+	TUint64* iId;
+	TUint32* iAddress;
+	Debug::TArchitectureMode* iMode;
+	TBool* iThreadSpecific;
+};
+
+//
+// class RRM_DebugDriver
+//
+class RRM_DebugDriver : public RBusLogicalChannel
+{
+public:
+
+	enum TControl
+	{
+		EControlSetBreak = 0,
+		EControlClearBreak,
+		EControlModifyBreak,
+		EControlBreakInfo,
+		EControlSuspendThread,
+		EControlResumeThread,
+		EControlStepRange,
+		EControlReadMemory,
+		EControlWriteMemory,
+		EControlReadRegisters,
+		EControlWriteRegisters,
+		EControlGetStaticLibraryInfo,
+		EControlGetDebugFunctionalityBufSize,
+		EControlGetDebugFunctionality,
+		EControlReadRegistersLegacy,
+		EControlWriteRegistersLegacy,		
+		EControlGetMemoryOperationMaxBlockSize,		
+		EControlAttachProcess,
+		EControlDetachProcess,
+		EControlDetachAgent,
+		EControlSetEventAction,
+		EControlGetList,
+		EControlStep,
+		EControlIsDebuggable,
+		EControlKillProcess,		
+		EControlModifyProcessBreak,
+	};
+	
+	enum TRequest
+	{
+		ERequestGetEvent=0x0, ERequestGetEventCancel=0x1
+	};	
+		
+public:
+
+	inline TInt Open(const TRM_DebugDriverInfo aDriverInfo);
+
+	inline TInt	SetBreak(Debug::TBreakId &aBreakId,const TUint32 aThreadId, const TUint32 aAddress, const Debug::TArchitectureMode aThumbMode );
+	inline TInt	SetProcessBreak(Debug::TBreakId &aBreakId,const TUint32 aProcessId, const TUint32 aAddress, const Debug::TArchitectureMode aThumbMode );
+	
+	inline TInt	ClearBreak(const TInt32 aBreakId);
+	
+	inline TInt	ModifyBreak(const Debug::TBreakId aBreakId, const TUint32 aThreadId, const TUint32 aAddress, const Debug::TArchitectureMode aArchitectureMode );
+	inline TInt	ModifyProcessBreak(const Debug::TBreakId aBreakId, const TUint32 aProcessId, const TUint32 aAddress, const Debug::TArchitectureMode aArchitectureMode );
+	
+	inline TInt BreakInfo(const Debug::TBreakId aBreakId, TUint64& aId, TUint32& aAddress, Debug::TArchitectureMode& aMode, TBool& aThreadSpecific);
+	
+	inline TInt	SuspendThread(const TUint32 aThreadId);
+	inline TInt	ResumeThread(const TUint32 aThreadId);
+	inline TInt	StepRange(const TUint32 aThreadId, const TUint32 aStartAddress, const TUint32 aStopAddress, TBool aStepInto);
+	inline TInt ReadMemory(const TUint32 aThreadId, const TUint32 aAddress, const TUint32 aLength, TDes8 &aData);
+	inline TInt WriteMemory(const TUint32 aThreadId, const TUint32 aAddress, const TUint32 aLength, const TDesC8 &aData);
+	inline TInt ReadRegisters(const TUint32 aThreadId, const TDes8 &aRegisterIds, TDes8 &aRegisterValues, TDes8 &aRegisterFlags);
+	inline TInt WriteRegisters(const TUint32 aThreadId, const TDes8 &aRegisterIds, const TDes8 &aRegisterValues, TDes8 &aRegisterFlags);
+	inline TInt ReadRegisters(const TUint32 aThreadId, const TInt32 aFirstRegister, const TInt32 aLastRegister, TDes8 &aValues);
+	inline TInt WriteRegisters(const TUint32 aThreadId, const TInt32 aFirstRegister, const TInt32 aLastRegister, TDesC8 &aValues);
+	inline void GetEvent(TDesC8& aProcessName, TUint64 aAgentId, TRequestStatus &aStatus, Debug::TEventInfo &aEventInfo);
+	inline void CancelGetEvent(TDesC8& aProcessName, TUint64 aAgentId);
+//	inline TInt GetProcessInfo(const TInt aIndex, TRM_DebugTaskInfo &aInfo);
+//	inline TInt GetThreadInfo(const TInt aIndex, TRM_DebugTaskInfo &aInfo);
+	inline TInt GetStaticLibraryInfo(const TInt aIndex, Debug::TEventInfo &aInfo);
+	inline TInt GetDebugFunctionalityBufSize(TUint32 &aBufSize);
+	inline TInt GetDebugFunctionality(TDes8& aDebugFunctionality);
+	inline TInt GetMemoryOperationMaxBlockSize(TUint32 &aMaxSize);
+	inline TInt AttachProcess(TDesC8& aProcessName, TUint64 aAgentId);
+	inline TInt DetachProcess(TDesC8& aProcessName, TUint64 aAgentId);
+	inline TInt DetachAgent(TUint64 aAgentId);
+	inline TInt SetEventAction(TDesC8& aProcessName, Debug::TEventType aEvent, Debug::TKernelEventAction aEventAction, TUint64 aAgentId);
+	inline TInt GetList(const Debug::TListId aType, const Debug::TListScope aListScope, const TUint64 aTargetId, const TUint64 aDebugProcessId, TDes8& aBuffer, TUint32& aDataSize);
+	inline TInt Step(const TUint32 aThreadId, const TUint32 aNumSteps);
+	inline TInt IsDebuggable(const TUint32 aProcessId);
+	inline TInt KillProcess(const TUint32 aProcessId, const TInt32 aReason);
+};
+
+_LIT(KRM_DebugDriverName,"RM Debug Driver");
+
+//priority set equal to that of KDfcThread0Priority defined in e32/kernel/sinit.cpp
+const TInt KRmDebugDriverThreadPriority = 27;
+
+// Version information
+const TInt KMajorVersionNumber=2;
+const TInt KMinorVersionNumber=1;
+const TInt KBuildVersionNumber=0;
+
+
+inline TInt RRM_DebugDriver::Open(const TRM_DebugDriverInfo aDriverInfo)
+{
+	TBuf8<32> buf;
+	buf.Append((TUint8*)&aDriverInfo.iPanic1Address, 4);
+	buf.Append((TUint8*)&aDriverInfo.iPanic2Address, 4);
+	buf.Append((TUint8*)&aDriverInfo.iException1Address, 4);
+	buf.Append((TUint8*)&aDriverInfo.iException2Address, 4);
+	buf.Append((TUint8*)&aDriverInfo.iLibraryLoadedAddress, 4);
+	buf.Append((TUint8*)&aDriverInfo.iUserLibraryEnd, 4);
+	
+	#ifdef EKA2
+	return DoCreate(KRM_DebugDriverName, TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber), KNullUnit, NULL, &buf);
+	#else
+	return DoCreate(KRM_DebugDriverName, TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber), NULL, KNullUnit, NULL, &buf);
+	#endif
+}
+
+inline TInt RRM_DebugDriver::SetBreak(Debug::TBreakId &aBreakId, const TUint32 aThreadId, const TUint32 aAddress, const Debug::TArchitectureMode aMode )
+{
+	TSetBreakInfo info(&aBreakId, aThreadId, aAddress, aMode, ETrue);
+	return DoSvControl(EControlSetBreak, reinterpret_cast<TAny*>(&info),0);
+}
+inline TInt RRM_DebugDriver::SetProcessBreak(Debug::TBreakId &aBreakId, const TUint32 aProcessId, const TUint32 aAddress, const Debug::TArchitectureMode aMode )
+{
+	TSetBreakInfo info(&aBreakId, aProcessId, aAddress, aMode, EFalse);
+	return DoSvControl(EControlSetBreak, reinterpret_cast<TAny*>(&info),0);
+}
+
+inline TInt RRM_DebugDriver::ClearBreak(const Debug::TBreakId aBreakId)
+{
+	return DoSvControl(EControlClearBreak, reinterpret_cast<TAny*>(aBreakId), 0);
+}
+
+inline TInt RRM_DebugDriver::ModifyBreak(const Debug::TBreakId aBreakId, const TUint32 aThreadId, const TUint32 aAddress, const Debug::TArchitectureMode aMode)
+{
+	TModifyBreakInfo info(aBreakId, aThreadId, aAddress, aMode);
+	return DoControl(EControlModifyBreak, reinterpret_cast<TAny*>(&info), 0);
+}
+
+inline TInt RRM_DebugDriver::ModifyProcessBreak(const Debug::TBreakId aBreakId, const TUint32 aProcessId, const TUint32 aAddress, const Debug::TArchitectureMode aMode)
+{
+	TModifyProcessBreakInfo info(aBreakId, aProcessId, aAddress, aMode);
+	return DoControl(EControlModifyProcessBreak, reinterpret_cast<TAny*>(&info), 0);
+}
+
+inline TInt RRM_DebugDriver::BreakInfo(const Debug::TBreakId aBreakId, TUint64& aId, TUint32& aAddress, Debug::TArchitectureMode& aMode, TBool& aThreadSpecific)
+{
+	TGetBreakInfo info(aBreakId, aId, aAddress, aMode, aThreadSpecific);
+	return DoControl(EControlBreakInfo, reinterpret_cast<TAny*>(&info), 0);
+}
+
+inline TInt RRM_DebugDriver::SuspendThread(const TUint32 aThreadId)
+{
+	return DoControl(EControlSuspendThread, reinterpret_cast<TAny*>(aThreadId));
+}
+
+inline TInt RRM_DebugDriver::ResumeThread(const TUint32 aThreadId)
+{
+	return DoSvControl(EControlResumeThread, reinterpret_cast<TAny*>(aThreadId));
+}
+
+inline TInt RRM_DebugDriver::StepRange(const TUint32 aThreadId, const TUint32 aStartAddress, const TUint32 aStopAddress, TBool aStepInto)
+{
+	TRM_DebugStepInfo info(aStartAddress, aStopAddress, aStepInto);
+	return DoSvControl(EControlStepRange, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
+}
+
+inline TInt RRM_DebugDriver::ReadMemory(const TUint32 aThreadId, const TUint32 aAddress, const TUint32 aLength, TDes8 &aData)
+{
+	TRM_DebugMemoryInfo info(aAddress, aLength, &aData);
+	return DoControl(EControlReadMemory, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
+}
+
+inline TInt RRM_DebugDriver::WriteMemory(const TUint32 aThreadId, const TUint32 aAddress, const TUint32 aLength, const TDesC8 &aData)
+{
+	TRM_DebugMemoryInfo info(aAddress, aLength, (TDesC8*)&aData);
+	return DoControl(EControlWriteMemory, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
+}
+
+inline TInt RRM_DebugDriver::ReadRegisters(const TUint32 aThreadId, const TDes8 &aRegisterIds, TDes8 &aRegisterValues, TDes8 &aRegisterFlags)
+	{
+	TRM_DebugRegisterInformation info(&aRegisterIds, &aRegisterValues, &aRegisterFlags);
+	return DoControl(EControlReadRegisters, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);	
+	}
+
+inline TInt RRM_DebugDriver::WriteRegisters(const TUint32 aThreadId, const TDes8 &aRegisterIds, const TDes8 &aRegisterValues, TDes8 &aRegisterFlags)
+	{
+	TRM_DebugRegisterInformation info(&aRegisterIds, (TDes8*)&aRegisterValues, &aRegisterFlags);
+	return DoControl(EControlWriteRegisters, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
+	}
+
+inline TInt RRM_DebugDriver::ReadRegisters(const TUint32 aThreadId, const TInt32 aFirstRegister, const TInt32 aLastRegister, TDes8 &aValues)
+{
+	TRM_DebugRegisterInfo info(aFirstRegister, aLastRegister, &aValues);
+	return DoControl(EControlReadRegistersLegacy, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
+}
+
+inline TInt RRM_DebugDriver::WriteRegisters(const TUint32 aThreadId, const TInt32 aFirstRegister, const TInt32 aLastRegister, TDesC8 &aValues)
+{
+	TRM_DebugRegisterInfo info(aFirstRegister, aLastRegister, &aValues);
+	return DoControl(EControlWriteRegistersLegacy, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
+}
+
+inline void RRM_DebugDriver::GetEvent(TDesC8& aProcessName, TUint64 aAgentId, TRequestStatus &aStatus, Debug::TEventInfo &aEventInfo)
+{
+	// temporary object not needed beyond the DoRequest call
+	TEventMetaData eventMetaData;
+	eventMetaData.iTargetProcessName.Copy(aProcessName);
+	eventMetaData.iDebugAgentProcessId = aAgentId;
+	DoRequest(ERequestGetEvent, aStatus, (TAny*)&aEventInfo, (TAny*)&eventMetaData);
+}
+
+inline void RRM_DebugDriver::CancelGetEvent(TDesC8& aProcessName, TUint64 aAgentId)
+{
+	TRMD_DebugCancelInfo info(ERequestGetEventCancel,aProcessName,aAgentId);
+	DoCancel(reinterpret_cast<TInt>(&info));
+}
+
+inline TInt RRM_DebugDriver::GetStaticLibraryInfo(const TInt aIndex, Debug::TEventInfo &aInfo)
+{
+	return DoControl(EControlGetStaticLibraryInfo, reinterpret_cast<TAny*>(aIndex), (TAny*)&aInfo);
+}
+
+inline TInt RRM_DebugDriver::GetDebugFunctionalityBufSize(TUint32 &aBufSize)
+{
+	return DoControl(EControlGetDebugFunctionalityBufSize, reinterpret_cast<TAny*>(&aBufSize));
+}
+
+inline TInt RRM_DebugDriver::GetDebugFunctionality(TDes8& aDebugFunctionality)
+{
+	return DoControl(EControlGetDebugFunctionality,reinterpret_cast<TAny*>(&aDebugFunctionality));
+}
+
+inline TInt RRM_DebugDriver::GetMemoryOperationMaxBlockSize(TUint32 &aMaxSize)
+{
+	return DoControl(EControlGetMemoryOperationMaxBlockSize, reinterpret_cast<TAny*>(&aMaxSize));
+}
+
+inline TInt RRM_DebugDriver::AttachProcess(TDesC8& aProcessName, TUint64 aAgentId)
+{
+	TRM_DebugAgentId info(aAgentId);
+	return DoControl(EControlAttachProcess,reinterpret_cast<TAny*>(&aProcessName),reinterpret_cast<TAny*>(&info));
+}
+
+inline TInt RRM_DebugDriver::DetachProcess(TDesC8& aProcessName, TUint64 aAgentId)
+{
+	TRM_DebugAgentId info(aAgentId);
+	return DoControl(EControlDetachProcess,reinterpret_cast<TAny*>(&aProcessName),reinterpret_cast<TAny*>(&info));
+}
+
+inline TInt RRM_DebugDriver::DetachAgent(TUint64 aAgentId)
+{
+	TRM_DebugAgentId info(aAgentId);
+	return DoControl(EControlDetachAgent,reinterpret_cast<TAny*>(&info),0);
+}
+
+inline TInt RRM_DebugDriver::SetEventAction(TDesC8& aProcessName, Debug::TEventType aEvent, Debug::TKernelEventAction aEventAction, TUint64 aAgentId)
+{
+	TRM_DebugEventActionInfo info (aEvent,aEventAction, aAgentId);
+	return DoControl(EControlSetEventAction,reinterpret_cast<TAny*>(&aProcessName),(TAny*)&info);
+}
+
+inline TInt RRM_DebugDriver::GetList(const Debug::TListId aType, const Debug::TListScope aListScope, const TUint64 aTargetId, const TUint64 aDebugProcessId, TDes8& aBuffer, TUint32& aDataSize)
+{
+	TListInformation info(aType, aListScope, &aBuffer, &aDataSize, aTargetId);
+	return DoControl(EControlGetList, (TAny*)&info);
+}
+
+inline TInt RRM_DebugDriver::Step(const TUint32 aThreadId, const TUint32 aNumSteps)
+{
+	return DoControl(EControlStep,reinterpret_cast<TAny*>(aThreadId),reinterpret_cast<TAny*>(aNumSteps));
+}
+
+inline TInt RRM_DebugDriver::IsDebuggable(const TUint32 aProcessId)
+{
+	return DoControl(EControlIsDebuggable,reinterpret_cast<TAny*>(aProcessId),NULL);
+}
+
+inline TInt RRM_DebugDriver::KillProcess(const TUint32 aProcessId, const TInt32 aReason)
+{
+	return DoControl(EControlKillProcess,reinterpret_cast<TAny*>(aProcessId),reinterpret_cast<TAny*>(aReason));
+}
+
+#endif // __RM_DEBUG_KERNELDRIVER_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/src/d_debug_agent.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,468 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Purpose: Kernel-side tracking of debug agent information associated
+// with each process being debugged.
+// 
+//
+
+#include <e32def.h>
+#include <e32def_private.h>
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include <kernel/kernel.h> 
+#include <kernel/kern_priv.h>
+#include <nk_trace.h>
+#include <arm.h>
+
+#include "d_process_tracker.h"
+#include "debug_logging.h"
+
+#include "d_debug_agent.h"
+#include "debug_utils.h"
+
+#include "d_debug_agent.inl"
+
+using namespace Debug;
+
+// ctor
+DDebugAgent::DDebugAgent(TUint64 aId) :
+	iId(aId),
+	iRequestGetEventStatus(NULL),
+	iClientThread(0),
+	iEventQueue(KNumberOfEventsToQueue, 0),
+	iHead(0),
+	iTail(0),
+	iEventQueueLock(NULL),
+	iFreeSlots(KNumberOfEventsToQueue),
+	iIgnoringTrace(EFalse),
+	iEventBalance(0)
+	{
+	LOG_MSG2("DDebugAgent::DDebugAgent(), this=0x%x ", this);
+
+	// Initialize all the Event Actions to Ignore
+	for(TInt i=0; i<EEventsLast; i++)
+		{
+		iEventActions[i] = EActionIgnore;
+		}
+	}
+
+DDebugAgent* DDebugAgent::New(TUint64 aId)
+	{
+	LOG_MSG2("DDebugAgent::New(id=0x%lx)", aId);
+	DDebugAgent* agent = new DDebugAgent(aId);
+	if(agent == NULL)
+		{
+		return (NULL);
+		}
+	if(KErrNone != agent->Construct())
+		{
+		delete agent;
+		return (NULL);
+		}
+
+	// Use a semaphore to serialise access
+	TInt err = Kern::SemaphoreCreate(agent->iEventQueueLock, _L("RM_DebugAgentQueueLock"), 1 /* Initial count */);
+	if (err != KErrNone)
+		return NULL;
+
+	return agent;
+	}
+
+/** Standard contructor.
+ * Fills event queue with empty events
+ * @return : standard system error code
+ */
+TInt DDebugAgent::Construct()
+	{
+	// Empty the event queue
+	TDriverEventInfo emptyEvent;
+	TInt err = KErrNone;
+
+	for (TInt i=0; i<KNumberOfEventsToQueue; i++)
+		{
+		err = iEventQueue.Append(emptyEvent);
+		if (err != KErrNone)
+			{
+			LOG_MSG("Error appending blank event entry");
+			return err;
+			}
+		}
+
+	err = Kern::CreateClientDataRequest(iRequestGetEventStatus);
+	if(err != KErrNone)
+		{
+		LOG_MSG("Error creating TClientDataRequest");
+		return err;
+		}
+
+	LOG_MSG2("DDebugAgent::Construct() iRequestGetEventStatus=0x%08x", iRequestGetEventStatus);
+
+	return err;
+	}
+
+// dtor
+DDebugAgent::~DDebugAgent()
+	{
+	iEventQueue.Reset();
+
+	if (iEventQueueLock)
+		iEventQueueLock->Close(NULL);
+	
+	if(iRequestGetEventStatus)
+		Kern::DestroyClientRequest(iRequestGetEventStatus);
+	
+	}
+
+// Associate an action with a particular kernel event
+TInt DDebugAgent::SetEventAction(TEventType aEvent, TKernelEventAction aEventAction)
+	{
+	// Valid Event?
+	if (aEvent >= EEventsLast)
+		{
+		LOG_MSG2("DDebugAgent::EventAction: Bad Event number %d",aEvent);
+		return KErrArgument;
+		}
+
+	iEventActions[aEvent] = aEventAction;
+
+	return KErrNone;
+	}
+
+/** Get the aEventAction associated with aEvent
+ *
+ * @return : aEventAction (always +ve), or KErrArgument.
+ */
+TInt DDebugAgent::EventAction(TEventType aEvent)
+	{
+	// Validate the Event id
+	if (aEvent >= EEventsLast)
+		{
+		LOG_MSG2("DDebugAgent::EventAction: Bad Event number %d",aEvent);
+		return KErrArgument;
+		}
+
+	// Return the action associated with this event
+	return iEventActions[aEvent];
+	}
+
+/** Obtain the details of the latest kernel event (if it exists) and place the details in aEventInfo
+ * If there is no event in the queue for this process+agent combination, store the details
+ * so that it can be notified later when an event actually occurs.
+ * 
+ * @param aAsyncGetValueRequest - TClientDataRequest object used for pinning user memory
+ * @param aClientThread - The ThreadId of the requesting user-side process. In this case the DSS.
+ */
+void DDebugAgent::GetEvent(TClientDataRequest<TEventInfo>* aAsyncGetValueRequest, DThread* aClientThread)
+	{
+	LockEventQueue();
+
+	iRequestGetEventStatus->Reset();
+	TInt err = iRequestGetEventStatus->SetStatus( aAsyncGetValueRequest->StatusPtr() );
+	if (err != KErrNone)
+		{
+		LOG_MSG2("Error :iRequestGetEventStatus->SetStatus ret %d", err);
+		UnlockEventQueue();
+		return;
+		}
+	
+	iRequestGetEventStatus->SetDestPtr( aAsyncGetValueRequest->DestPtr() );
+
+	iEventBalance++;
+	
+	LOG_MSG5("DDebugAgent::GetEvent: this=0x%08x, iRequestGetEventStatus=0x%08x, iEventBalance=%d, destPrt=0x%08x", 
+		this, iRequestGetEventStatus, iEventBalance, aAsyncGetValueRequest->DestPtr() );
+	
+	iClientThread = aClientThread;
+	
+	if (BufferEmpty())
+		{
+		LOG_MSG2("Event buffer empty, iEventBalance=%d", iEventBalance);		
+		UnlockEventQueue();
+		return;
+		}
+
+	LOG_MSG5("Event already available at queue pos (tail)=%d, evType=%d, threadId=0x%x, actionTaken=%d", 
+	        iTail,	iEventQueue[iTail].iEventType,	
+	        iEventQueue[iTail].iThreadId, iEventQueue[iTail].iActionTaken );
+	
+	// returning the event to the client
+	err = iEventQueue[iTail].WriteEventToClientThread(iRequestGetEventStatus,iClientThread);
+	if (err != KErrNone)
+		{
+		LOG_MSG2("Error writing event info: %d", err);
+		UnlockEventQueue();
+		return;
+		}
+
+	// signal the DSS thread
+	Kern::QueueRequestComplete(iClientThread, iRequestGetEventStatus, KErrNone);
+	iEventBalance--;
+
+	iEventQueue[iTail].Reset();
+
+	// move to the next slot
+	IncrementTailPosition();
+
+	UnlockEventQueue();
+	}
+
+/**
+ * Stop waiting for an event to occur. This means events will be placed 
+ * in the iEventQueue (by setting iEventBalance to 0) until GetEvent is called. 
+ */ 
+TInt DDebugAgent::CancelGetEvent(void)
+	{
+	LOG_MSG2("DDebugAgent::CancelGetEvent. iEventBalance=%d. > QueueRequestComplete", iEventBalance);
+	Kern::QueueRequestComplete(iClientThread, iRequestGetEventStatus, KErrCancel);
+	iEventBalance=0;
+	iClientThread = 0;
+	return KErrNone;
+	}
+
+/** Signal a kernel event to the user-side DSS when it occurs, or queue it for later
+ * if the user-side has not called GetEvent (see above).
+ * 
+ * @param aEventInfo - the details of the event to queue.
+ */
+void DDebugAgent::NotifyEvent(const TDriverEventInfo& aEventInfo)
+	{
+
+	if(aEventInfo.iEventType >= EEventsLast)
+		{
+		LOG_MSG3("DDebugAgent::NotifyEvent(),iEventType %d, this=0x%x. Ignoring since > EEventsLast", aEventInfo.iEventType, this);
+		return;
+		}
+
+	LockEventQueue();
+
+	DThread* currentThread = &Kern::CurrentThread();
+	
+
+	TKernelEventAction action = iEventActions[aEventInfo.iEventType];
+
+	if (aEventInfo.iProcessId == Id() &&
+		(aEventInfo.iEventType == EEventsSwExc || aEventInfo.iEventType == EEventsHwExc ||	aEventInfo.iEventType == EEventsKillThread))
+		{
+
+		// It might be nice not to deliver *any* events about the debug agent to the agent itself, but this is a bit too drastic a change to make.
+		// There's a risk it might completely break TRK or similar, and at a more practical level it would require major rewriting of the t_rmdebug2
+		// tests.
+		//
+		// So instead, we only don't suspend&deliver events about the debug agent IF it's a thread crash event AND the thread is process
+		// critical/permanent AND (in the case of a critical thread) it's an abnormal exit. We're not worrying (yet) about the case where the entire
+		// process is set as system critical
+		// This fixes the original problem with CDS's worker thread crashing, and doesn't wreck the t_rmdebug2 tests.
+
+		TBool problematic = (
+			(aEventInfo.iThreadFlags & (KThreadFlagProcessCritical|KThreadFlagSystemCritical) && (aEventInfo.iEventType != EEventsKillThread || aEventInfo.iExitType != EExitKill)) // process or system critical, and either an exception (not a EEventsKillThread) or a non EExitKill exit
+			|| (aEventInfo.iThreadFlags & (KThreadFlagProcessPermanent|KThreadFlagSystemPermanent))
+			);
+
+		if (problematic)
+			{
+			LOG_MSG("Agent is dying - no further events will be delivered to it");
+			iAgentDying = ETrue;
+			}
+
+		}
+
+	if (iAgentDying && action == EActionSuspend)
+		{
+		LOG_MSG("Not delivering this event or suspending the thread because agent is dying");
+		action = EActionIgnore;
+		}
+
+	switch (action)
+		{
+		case EActionSuspend:
+			{
+			LOG_MSG5("DDebugAgent::NotifyEvent(), Suspend thread, iEventType %d, this=0x%x currThrd=0x%08x, iEventBalance=%d",
+				aEventInfo.iEventType, this, currentThread, iEventBalance );
+
+			switch(aEventInfo.iEventType)
+				{
+				case EEventsAddLibrary:
+				case EEventsRemoveLibrary:
+					// TomS: Anybody want to explain what is going on here??
+					currentThread = DebugUtils::OpenThreadHandle(aEventInfo.iThreadId);
+					if(currentThread)
+						{
+						currentThread->Close(NULL);
+						}
+					break;
+				default:
+					break;
+				}
+			
+			// Do not call suspend for breakpoints, since the breakpoint code that runs when deciding if an exception
+			// is a breakpoint will itself suspend the thread 
+			if( (aEventInfo.iEventType != EEventsBreakPoint) && (aEventInfo.iEventType != EEventsProcessBreakPoint) )
+			    {
+                TInt err = TheDProcessTracker.SuspendThread(currentThread, aEventInfo.FreezeOnSuspend());
+                if((err != KErrNone) && (err != KErrAlreadyExists))
+                    {
+                    // Is there anything we can do in the future to deal with this error having happened?
+                    LOG_MSG2("DDebugAgent::NotifyEvent() Problem while suspending thread: %d", err);
+                    }
+			    }
+
+			// now drop through to the continue case, which typically notifies
+			// the debug agent of the event
+			}
+		case EActionContinue:
+			{
+			if( action == EActionContinue )
+				{
+				LOG_MSG5("DDebugAgent::NotifyEvent(), Action continue, iEventType %d, this=0x%x currThrd=0x%08x, iEventBalance=%d",
+					aEventInfo.iEventType, this, currentThread, iEventBalance );
+				}
+
+			// Queue this event
+			TDriverEventInfo eventInfo = aEventInfo;
+			eventInfo.iActionTaken = action;
+			QueueEvent(eventInfo);
+
+			// Tell the user about the oldest event in the queue
+			if ( iClientThread )
+				{
+				if( iRequestGetEventStatus && (iEventBalance > 0) )
+					{
+					// Fill the event data
+					TInt err = iEventQueue[iTail].WriteEventToClientThread(iRequestGetEventStatus,iClientThread);
+					if (err != KErrNone)
+						{
+						LOG_MSG2("Error writing event info: %d", err);
+						}
+
+					// signal the debugger thread 
+					LOG_MSG4("> QueueRequestComplete iRequestGetEventStatus=0x%08x, iEventBalance=%d, iTail=%d",
+						iRequestGetEventStatus->iStatus, iEventBalance, iTail );
+					Kern::QueueRequestComplete(iClientThread, iRequestGetEventStatus, KErrNone);
+
+					iEventBalance--;
+
+					iEventQueue[iTail].Reset();
+
+					// move to the next slot
+					IncrementTailPosition();
+					}
+				else
+					{
+					if( !iRequestGetEventStatus )
+						{
+						LOG_MSG("iRequestGetEventStatus is NULL so not signalling client" );
+						}
+					else
+						{
+						LOG_MSG2("Queued event. iEventBalance=%d (unbalanced event requests vs notifications)", 
+							iEventBalance );
+						}
+					}
+				}
+			else
+				{
+				 LOG_MSG("DDebugAgent::NotifyEvent() : Not informing client since its thread is NULL");
+				}
+			break;
+			}
+		case EActionIgnore:
+		default:
+			// Ignore everything we don't understand.
+			break;
+		}
+
+	UnlockEventQueue();
+
+	}
+
+// Used to identify which Debug Agent this DDebugAgent is associated with.
+TUint64 DDebugAgent::Id(void)
+	{
+	return iId;
+	}
+
+/**
+ * Used to add an event to the event queue for this debug agent if event 
+ * queue is not at critical level. If it is at critical and it is trace event, 
+ * we start ignoring trace events and insert a lost trace event.
+ * If the buffer cannot store an event, only insert a buffer full event.
+ * @see EEventsBufferFull
+ * @see EEventsUserTracesLost
+ * @see TDriverEventInfo
+ * @see iEventQueue
+ */
+void DDebugAgent::QueueEvent(const TDriverEventInfo& aEventInfo)
+	{
+	// Have we caught the tail?
+	if(BufferFull())
+		{
+		LOG_MSG("DDebugAgent::QueueEvent : BufferFull. Not queueing");
+		return;
+		}
+
+	// Assert if we think there is space but the slot is not marked empty
+	__NK_ASSERT_DEBUG(iEventQueue[iHead].iEventType == EEventsUnknown);
+
+	const TBool bufferAtCritical = BufferAtCriticalLevel();
+
+	if(!bufferAtCritical)
+		{
+		//reset the iIgnoringTrace flag as we are not at 
+		//critical level and can store event
+		iIgnoringTrace = EFalse; 
+		
+		// Insert the event into the ring buffer at iHead
+		iEventQueue[iHead] = aEventInfo;
+		IncrementHeadPosition();
+		}
+	else if(bufferAtCritical && BufferCanStoreEvent())
+		{
+		LOG_MSG("DDebugAgent::QueueEvent : BufferCritical");
+		if(aEventInfo.iEventType == EEventsUserTrace)
+			{
+			if(!iIgnoringTrace)
+				{
+				//if this is the first time we are ignoring trace events, 
+				//we need to issue a EEventsUserTracesLost event
+				iEventQueue[iHead].Reset();
+				iEventQueue[iHead].iEventType = EEventsUserTracesLost;
+				IncrementHeadPosition();
+
+				iIgnoringTrace = ETrue;
+				}
+			else
+				{
+				//otherwise, ignore this event
+				LOG_MSG("DDebugAgent::QueueEvent : Ignore EEventsUserTrace event");
+				}
+			}
+		else
+			{
+			// Store the event since its not a trace event
+			iEventQueue[iHead] = aEventInfo;
+			IncrementHeadPosition();
+			}
+		}
+	else
+		{
+		//At critical level and cannot store new events, so 
+		//only one space left. Store a EEventsBufferFull event
+		LOG_MSG("DDebugAgent::QueueEvent : Event Buffer Full, ignoring event");
+		iEventQueue[iHead].Reset();
+		iEventQueue[iHead].iEventType = EEventsBufferFull;
+		IncrementHeadPosition();
+		}
+	}
+
+// End of file - d_debug_agent.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/src/d_debug_functionality.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,426 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Defines the DebugFunctionality class. This is responsible for
+// providing configuration data needed by a host debugger to be able
+// to correctly use the functionality provided by the run-mode debug subsystem.
+// 
+
+#include <e32def.h>
+#include <e32def_private.h>
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include <u32std.h>
+#include <kernel/kernel.h>
+#include <rm_debug_api.h>
+#include "d_rmd_breakpoints.h"
+#include "rm_debug_kerneldriver.h"
+#include "d_debug_functionality.h"
+
+using namespace Debug;
+
+// Core
+const TTag DebugFunctionalityCoreInfo[] =
+	{
+	{ECoreEvents,ETagTypeBoolean,0,ETrue},
+	{ECoreStartStop,ETagTypeBoolean,0,ETrue},
+	{ECoreMemory,ETagTypeBoolean,0,ETrue},
+	{ECoreRegister,ETagTypeBoolean,0,ETrue},
+	{ECoreBreakpoint,ETagTypeBoolean,0,ETrue},
+	{ECoreStepping,ETagTypeBoolean,0,ETrue},
+	{ECoreLists,ETagTypeBoolean,0,ETrue},
+	{ECoreLogging,ETagTypeBoolean,0,EFalse},
+	{ECoreHardware,ETagTypeBoolean,0,EFalse},
+	{ECoreApiConstants,ETagTypeBoolean,0,ETrue},
+	{ECoreKillObjects,ETagTypeBoolean,0,ETrue},
+	{ECoreSecurity,ETagTypeBoolean,0,ETrue},	
+	};
+
+const TSubBlock DebugFunctionalityCore[] =
+	{
+	ETagHeaderIdCore,ECoreLast,
+	(TTag*)DebugFunctionalityCoreInfo
+	};
+
+// Memory
+const TTag DebugFunctionalityMemoryInfo[] =
+	{
+	{EMemoryRead,ETagTypeBoolean,0,ETrue}, 
+	{EMemoryWrite,ETagTypeBoolean,0,ETrue},
+	{EMemoryAccess64,ETagTypeBoolean,0,EFalse},
+	{EMemoryAccess32,ETagTypeBoolean,0,ETrue},
+	{EMemoryAccess16,ETagTypeBoolean,0,EFalse},
+	{EMemoryAccess8,ETagTypeBoolean,0,EFalse},
+	{EMemoryBE8,ETagTypeBoolean,0,EFalse},
+	{EMemoryBE32,ETagTypeBoolean,0,EFalse},
+	{EMemoryLE8,ETagTypeBoolean,0,ETrue},
+	{EMemoryMaxBlockSize,ETagTypeTUint32,0,16 * KKilo /* 16Kbytes */}	// binaryMax size of memory requests in bytes
+	};
+
+const TSubBlock DebugFunctionalityMemory[]=
+	{
+	ETagHeaderIdMemory,EMemoryLast,
+	(TTag*)DebugFunctionalityMemoryInfo
+	};
+
+// Kill Objects
+const TTag DebugFunctionalityKillObjectsInfo[] =
+	{
+	{EFunctionalityKillThread,ETagTypeBoolean,0,EFalse}, 
+	{EFunctionalityKillProcess,ETagTypeBoolean,0,ETrue}
+	};
+
+const TSubBlock DebugFunctionalityKillObjects[]=
+	{
+	ETagHeaderIdKillObjects,EFunctionalityKillObjectLast,
+	(TTag*)DebugFunctionalityKillObjectsInfo
+	};
+
+// Core Registers
+const TTag DebugFunctionalityRegistersCoreInfo[] =
+	{
+	{ERegisterR0,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR1,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR2,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR3,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR4,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR5,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR6,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR7,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR8,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR9,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR10,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR11,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR12,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR13,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR14,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR15,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterCpsr,ETagTypeEnum, 4,EAccessReadWrite},
+	{ERegisterR13Svc,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR14Svc,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterSpsrSvc,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR13Abt,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR14Abt,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterSpsrAbt,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR13Und,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR14Und,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterSpsrUnd,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR13Irq,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR14Irq,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterSpsrIrq,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR8Fiq,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR9Fiq,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR10Fiq,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR11Fiq,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR12Fiq,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR13Fiq,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterR14Fiq,ETagTypeEnum, 4,EAccessNone},
+	{ERegisterSpsrFiq, ETagTypeEnum, 4,EAccessNone}
+	};
+
+const TSubBlock DebugFunctionalityRegistersCore[] =
+	{
+	ETagHeaderIdRegistersCore, ERegisterLast,
+	(TTag*)DebugFunctionalityRegistersCoreInfo
+	};
+
+// Co-processor registers
+const TTag DebugFunctionalityRegistersCoProInfo[]=
+	{
+	//this is the DACR register
+	{0x00300f01, ETagTypeTUint32, 4, EAccessReadWrite} 
+	};
+
+const TSubBlock DebugFunctionalityRegistersCoPro[]=
+	{
+	ETagHeaderIdCoProRegisters,1,
+	(TTag*)DebugFunctionalityRegistersCoProInfo
+	};
+
+// Breakpoints
+const TTag DebugFunctionalityBreakpointsInfo[]=
+	{
+	{EBreakpointThread,ETagTypeBoolean,0,ETrue},
+	{EBreakpointProcess,ETagTypeBoolean,0,ETrue},
+	{EBreakpointSystem,ETagTypeBoolean,0,EFalse},
+	{EBreakpointArm,ETagTypeBoolean,0,ETrue},
+	{EBreakpointThumb,ETagTypeBoolean,0,ETrue},
+	{EBreakpointT2EE,ETagTypeBoolean,0,ETrue},
+	{EBreakpointArmInst,ETagTypeBoolean,0,EFalse},
+	{EBreakpointThumbInst,ETagTypeBoolean,0,EFalse},
+	{EBreakpointT2EEInst,ETagTypeBoolean,0,ETrue},
+	{EBreakpointSetArmInst,ETagTypeBoolean,0,EFalse},
+	{EBreakpointSetThumbInst,ETagTypeBoolean,0,EFalse},
+	{EBreakpointSetT2EEInst,ETagTypeBoolean,0,ETrue}
+	};
+
+const TSubBlock DebugFunctionalityBreakpoints[] =
+	{
+	ETagHeaderIdBreakpoints, EBreakpointLast,
+	(TTag*)DebugFunctionalityBreakpointsInfo
+	};
+
+// Stepping
+const TTag DebugFunctionalitySteppingInfo[]=
+	{
+	{EStep,ETagTypeBoolean,0,ETrue}
+	};
+
+const TSubBlock DebugFunctionalityStepping[] =
+	{
+	ETagHeaderIdStepping, EStepLast,
+	(TTag*)DebugFunctionalitySteppingInfo
+	};
+
+// Execution Control
+const TTag DebugFunctionalityExecutionInfo[]=
+	{
+	{EExecThreadSuspendResume,ETagTypeBoolean,0,ETrue},
+	{EExecProcessSuspendResume,ETagTypeBoolean,0,EFalse},
+	{EExecSystemSuspendResume,ETagTypeBoolean,0,EFalse},
+	};
+
+const TSubBlock DebugFunctionalityExecution[]=
+	{
+	ETagHeaderIdExecution, EExecLast,
+	(TTag*)DebugFunctionalityExecutionInfo
+	};
+
+// Events
+const TTag DebugFunctionalityEventsInfo[]=
+	{
+	{EEventsBreakPoint,ETagTypeEnum,0,EActionSuspend},
+	{EEventsProcessBreakPoint,ETagTypeEnum,0,EActionSuspend},
+	{EEventsSwExc,ETagTypeEnum,0,EActionSuspend},
+	{EEventsHwExc,ETagTypeEnum,0,EActionSuspend},
+	{EEventsKillThread,ETagTypeEnum,0,EActionContinue},
+	{EEventsAddLibrary,ETagTypeEnum,0,EActionSuspend},
+	{EEventsRemoveLibrary,ETagTypeEnum,0,EActionSuspend},
+	{EEventsUserTrace,ETagTypeEnum,0,EActionSuspend},
+	{EEventsStartThread,ETagTypeEnum,0,EActionSuspend},
+	{EEventsBufferFull,ETagTypeEnum,0,EActionContinue},
+	{EEventsUnknown,ETagTypeEnum,0,EActionContinue},
+	{EEventsUserTracesLost, ETagTypeEnum, 0, EActionContinue},
+	{EEventsAddProcess,ETagTypeEnum,0,EActionContinue},
+	{EEventsRemoveProcess,ETagTypeEnum,0,EActionContinue}
+	};
+
+const TSubBlock DebugFunctionalityEvents[] =
+	{
+	ETagHeaderIdEvents, EEventsLast,
+	(TTag*)DebugFunctionalityEventsInfo
+	};
+
+// API Constants
+const TTag DebugFunctionalityApiConstantsInfo[]=
+	{
+	{EApiConstantsTEventInfoSize,ETagTypeTUint32,0,sizeof(TEventInfo)},
+	};
+
+const TSubBlock DebugFunctionalityApiConstants[] =
+	{
+	ETagHeaderIdApiConstants, EApiConstantsLast,
+	(TTag*)DebugFunctionalityApiConstantsInfo
+	};
+
+// Listings
+const TTag DebugFunctionalityListInfo[] =
+	{
+	{EProcesses,ETagTypeBitField,0,EScopeGlobal},
+	{EThreads,ETagTypeBitField,0,EScopeGlobal|EScopeProcessSpecific|EScopeThreadSpecific},
+	{ECodeSegs,ETagTypeBitField,0,EScopeGlobal|EScopeProcessSpecific|EScopeThreadSpecific},
+	{EXipLibraries,ETagTypeBitField,0,EScopeGlobal},
+	{EExecutables,ETagTypeBitField,0,EScopeGlobal},
+	{ELogicalDevices,ETagTypeBitField,0,EScopeNone},
+	{EMutexes,ETagTypeBitField,0,EScopeNone},
+	{EServers,ETagTypeBitField,0,EScopeNone},
+	{ESessions,ETagTypeBitField,0,EScopeNone},
+	{ESemaphores,ETagTypeBitField,0,EScopeNone},
+	{EChunks,ETagTypeBitField,0,EScopeNone},
+	{EBreakpoints,ETagTypeBitField,0,EScopeNone},
+	{ESetBreak,ETagTypeBitField,0,EScopeNone},
+	{ERemoveBreak,ETagTypeBitField,0,EScopeNone},
+	{EModifyBreak,ETagTypeBitField,0,EScopeNone},
+	};
+
+const TSubBlock DebugFunctionalityList[] =
+	{
+	ETagHeaderList, EListLast,
+	(TTag*)DebugFunctionalityListInfo
+	};
+
+// Security
+const TTag DebugFunctionalitySecurityInfo[]=
+	{
+	{ESecurityOEMDebugToken,ETagTypeBoolean,0,ETrue}
+	};
+
+const TSubBlock DebugFunctionalitySecurity[] =
+	{
+	ETagHeaderIdSecurity, ESecurityLast,
+	(TTag*)DebugFunctionalitySecurityInfo
+	};
+
+TUint32 TDebugFunctionality::GetDebugFunctionalityBufSize(void)
+	{
+	TUint32 df_size = 0;
+
+	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityCore);
+	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityMemory);
+	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityRegistersCore);
+	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityRegistersCoPro);
+	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityBreakpoints);
+	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityStepping);
+	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityExecution);
+	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityEvents);
+	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityApiConstants);
+	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityList);
+	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityKillObjects);
+	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalitySecurity);
+	
+	return df_size;
+	}
+
+TBool TDebugFunctionality::GetDebugFunctionality(TDes8& aDFBlock)
+	{
+	if (aDFBlock.MaxLength() < GetDebugFunctionalityBufSize() )
+		{
+		// Insufficient space to contain the debug functionality block
+		return EFalse;
+		}
+
+	AppendBlock((const TSubBlock&)DebugFunctionalityCore,aDFBlock);
+	AppendBlock((const TSubBlock&)DebugFunctionalityMemory,aDFBlock);
+	AppendBlock((const TSubBlock&)DebugFunctionalityRegistersCore,aDFBlock);
+	AppendBlock((const TSubBlock&)DebugFunctionalityRegistersCoPro,aDFBlock);
+	AppendBlock((const TSubBlock&)DebugFunctionalityBreakpoints,aDFBlock);
+	AppendBlock((const TSubBlock&)DebugFunctionalityStepping,aDFBlock);
+	AppendBlock((const TSubBlock&)DebugFunctionalityExecution,aDFBlock);
+	AppendBlock((const TSubBlock&)DebugFunctionalityEvents,aDFBlock);
+	AppendBlock((const TSubBlock&)DebugFunctionalityApiConstants,aDFBlock);
+	AppendBlock((const TSubBlock&)DebugFunctionalityList,aDFBlock);
+	AppendBlock((const TSubBlock&)DebugFunctionalityKillObjects,aDFBlock);
+	AppendBlock((const TSubBlock&)DebugFunctionalitySecurity,aDFBlock);
+
+	return ETrue;
+	}
+
+/**
+ * Get the register information associated with aRegisterInfo. If aRegisterInfo is
+ * an unsupported register then an entry of the form:
+ *   {aRegisterInfo, x, 0, EAccessUnknown}
+ *   will be returned where x is an arbitrary value.
+ *   
+ *   @param aRegisterInfo register id information
+ *   @param aTag The functionality information for this register.
+ *   @return One of the system wide error codes
+ */
+TInt TDebugFunctionality::GetRegister(const TRegisterInfo aRegisterInfo, TTag& aTag)
+	{
+	if(Register::IsCoreReg(aRegisterInfo))
+		{
+		for(TInt i=0; i<ERegisterLast; i++)
+			{
+			if(Register::GetCoreRegId(DebugFunctionalityRegistersCoreInfo[i].iTagId) == Register::GetCoreRegId(aRegisterInfo))
+				{
+				aTag = DebugFunctionalityRegistersCoreInfo[i];
+				return KErrNone;
+				}
+			}
+		}
+	else if(Register::IsCoproReg(aRegisterInfo))
+		{
+		//get aRegisterInfo's details
+		TUint32 crn = Register::GetCRn(aRegisterInfo);
+		TUint32 crm = Register::GetCRm(aRegisterInfo);
+		TUint32 opcode1 = Register::GetOpcode1(aRegisterInfo);
+		TUint32 opcode2 = Register::GetOpcode2(aRegisterInfo);
+		TUint32 coproNum = Register::GetCoproNum(aRegisterInfo);
+
+		for(TInt i=0; i<sizeof(DebugFunctionalityRegistersCoProInfo)/sizeof(TTag); i++)
+			{
+			TUint32 tagId = DebugFunctionalityRegistersCoProInfo[i].iTagId;
+
+			//if this entry is the DACR
+			if((Register::GetCRm(tagId) == 3) && (Register::GetCoproNum(tagId) == 15))
+				{
+				if((crm == 3) && (coproNum == 15))
+					{
+					aTag = DebugFunctionalityRegistersCoProInfo[i];
+					return KErrNone;
+					}
+				}
+			//each coprocessor register that is supported will need logic adding here
+			}
+		}
+	else // in the future there could be other types of register supported
+		{
+		//for now just fall through to unsupported case
+		}
+
+	//found an unsupported register so just return EAccessUnknown as the access level
+	aTag.iTagId = aRegisterInfo;
+	aTag.iSize = 0;
+	aTag.iValue = EAccessUnknown;
+
+	return KErrNotSupported;
+	}
+
+/**
+ * Returns the maximum memory block size which can be read or written.
+ * @return the maximum memory block size which can be read or written
+*/
+TUint32 TDebugFunctionality::GetMemoryOperationMaxBlockSize()
+	{
+	return DebugFunctionalityMemoryInfo[EMemoryMaxBlockSize].iValue;
+	}
+
+/**
+ * Helper function to append a DebugFunctionalityXXX SubBlock 
+ * into a TDes buffer
+ */
+void TDebugFunctionality::AppendBlock(const TSubBlock& aDFSubBlock, TDes8& aDFBlock)
+	{
+	// Copy the aSubDFBlock.header into aDFBlock (Note we don't put in a TSubBlock structure
+	// as the block is just that - a flat block so the pointer is not required)
+	TPtr8 SubDFBlockHdrPtr((TUint8*)&aDFSubBlock.iHeader,sizeof(TTagHeader),sizeof(TTagHeader));
+
+	aDFBlock.Append(SubDFBlockHdrPtr);
+
+	// Append all the Tags
+	for (TUint i=0; i<aDFSubBlock.iHeader.iNumTags; i++)
+		{
+		TPtr8 tmpPtr((TUint8*)&aDFSubBlock.iTagArray[i],sizeof(TTag),sizeof(TTag));
+
+		aDFBlock.Append(tmpPtr);
+		}
+	}
+
+/**
+ * Computes the size in bytes of aDFBlock
+ * @param aDFSubBlock
+ * @return TUint32 size of sub block
+ */
+TUint32 TDebugFunctionality::ComputeBlockSize(const TSubBlock& aDFSubBlock)
+	{
+	TUint32 size = 0;
+
+	// Header size
+	size += sizeof(TTagHeader);
+
+	// size of all the tags within the header:
+	size += aDFSubBlock.iHeader.iNumTags * sizeof(TTag); 
+
+	return size;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/src/d_driver_event_info.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,342 @@
+// 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 the License "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:
+//
+
+#include "d_driver_event_info.h"
+#include "debug_logging.h"
+#include <kernel/kernel.h>
+#include <kernel/kern_priv.h>
+
+using namespace Debug;
+
+TDriverEventInfo::TDriverEventInfo()
+	{
+	Reset();
+	}
+
+void TDriverEventInfo::Reset()
+	{
+	iProcessId = 0;
+	iThreadId = 0;
+	iCurrentPC = 0;
+	iExceptionNumber = 0;
+	iFileName.Zero();
+	iPanicCategory.Zero();
+	iCodeAddress = 0;
+	iDataAddress = 0;
+	iThreadIdValid = (TUint8)EFalse;
+	iProcessIdValid = (TUint8)EFalse;
+	iEventType = EEventsUnknown;
+	iUidsValid = (TUint8)EFalse;
+	iActionTaken = EActionIgnore;
+	iThreadFlags = 0;
+	};
+
+/**
+  Copy the data from this object into the object pointed to by aEventInfo in
+  the client thread aClientThread. It is assumed that the write is performed
+  on behalf of aClientThread.
+
+  @param aClientThread client thread to write the data to
+  @param aEventInfo TEventInfo object in the client thread to populate with data
+  @param aAsyncGetValueRequest TClientDataRequest object used for pinning user memory
+
+  @return KErrNone on success, or one of the other system wide error codes
+  */
+TInt TDriverEventInfo::WriteEventToClientThread(TClientDataRequest<TEventInfo>* aAsyncGetValueRequest, DThread* aClientThread) const
+	{
+	// create a temporary TEventInfo to populate with the relevant data
+	TEventInfo eventInfo;
+	TInt err = KErrNone;	
+	
+	// populate the data that is common to all events
+	err = PopulateCommonEventInfo(eventInfo);
+
+	if(KErrNone != err)
+		{
+		return err;
+		}
+	
+	// populate the event specific data (means filling in the correct union member)
+	err = PopulateEventSpecificInfo(eventInfo);
+
+	// write the data to the client and return any error
+	if(KErrNone == err)
+		{
+		aAsyncGetValueRequest->Data() = eventInfo;
+		}
+	
+	return err;
+	}
+	
+/**
+  Write the common event values into aEventInfo
+
+  @param aEventInfo TEventInfo object to write data into
+  */
+TInt TDriverEventInfo::PopulateCommonEventInfo(TEventInfo& aEventInfo) const
+	{
+	aEventInfo.iEventType = iEventType;
+	aEventInfo.iProcessId = iProcessId;
+	aEventInfo.iProcessIdValid = iProcessIdValid;
+	aEventInfo.iThreadId = iThreadId;
+	aEventInfo.iThreadIdValid = iThreadIdValid;
+	aEventInfo.iActionTaken = iActionTaken;
+	LOG_MSG5("TDriverEventInfo:: PopulateCommon : eventType=%d, tidValid=%d, tid=0x%x, actionTaken=%d", 
+	        iEventType, iThreadIdValid, TUint(iThreadId), iActionTaken );
+	return KErrNone;
+	}
+
+/**
+  Write the event specific values into aEventInfo
+
+  @param aEventInfo TEventInfo object to write data into
+  */
+TInt TDriverEventInfo::PopulateEventSpecificInfo(TEventInfo& aEventInfo) const
+	{
+	TInt ret = KErrNone;
+	
+	switch(aEventInfo.iEventType)
+		{
+		case EEventsBreakPoint:
+			ret = PopulateThreadBreakPointInfo(aEventInfo);
+			return ret;
+		case EEventsProcessBreakPoint:
+			ret = PopulateThreadBreakPointInfo(aEventInfo);
+			return ret;
+		case EEventsSwExc:
+			ret = PopulateThreadSwExceptionInfo(aEventInfo);
+			return ret;
+		case EEventsHwExc:
+			ret = PopulateThreadHwExceptionInfo(aEventInfo);
+			return ret;
+		case EEventsKillThread:
+			ret = PopulateThreadKillInfo(aEventInfo);
+			return ret;
+		case EEventsAddLibrary:
+			ret = PopulateLibraryLoadedInfo(aEventInfo);
+			return ret;
+		case EEventsRemoveLibrary:
+			ret = PopulateLibraryUnloadedInfo(aEventInfo);
+			return ret;
+		case EEventsUserTrace:
+			ret = PopulateUserTraceInfo(aEventInfo);
+			return ret;
+		case EEventsStartThread:
+			ret = PopulateStartThreadInfo(aEventInfo);
+			return ret;
+		case EEventsUserTracesLost:
+			//no event specific data to be filled here
+			return KErrNone;
+		case EEventsAddProcess:
+			ret = PopulateAddProcessInfo(aEventInfo);
+			return ret;
+		case EEventsRemoveProcess:
+			ret = PopulateRemoveProcessInfo(aEventInfo);
+			return ret;
+		}
+	
+	return KErrArgument;
+	}
+
+/**
+  Write the event specific values for a break point event into TEventInfo
+
+  @param aEventInfo TEventInfo object to write data into
+  */
+TInt TDriverEventInfo::PopulateThreadBreakPointInfo(TEventInfo& aEventInfo) const
+	{
+	aEventInfo.iThreadBreakPointInfo.iExceptionNumber = (TExcType)iExceptionNumber;
+	TInt ret = PopulateRmdArmExcInfo(aEventInfo);
+	
+	return ret;
+	}
+
+/**
+  Write the event specific values for a thread exception event into TEventInfo
+
+  @param aEventInfo TEventInfo object to write data into
+  */
+TInt TDriverEventInfo::PopulateThreadSwExceptionInfo(TEventInfo& aEventInfo) const
+	{
+	aEventInfo.iThreadSwExceptionInfo.iCurrentPC = iCurrentPC;
+	aEventInfo.iThreadSwExceptionInfo.iExceptionNumber = (TExcType)iExceptionNumber;
+	
+	return KErrNone;
+	}
+
+/**
+  Write the event specific values for a thread exception event into TEventInfo
+
+  @param aEventInfo TEventInfo object to write data into
+  */
+TInt TDriverEventInfo::PopulateThreadHwExceptionInfo(TEventInfo& aEventInfo) const
+	{
+	aEventInfo.iThreadHwExceptionInfo.iExceptionNumber = (TExcType)iExceptionNumber;
+	TInt ret = PopulateRmdArmExcInfo(aEventInfo);
+	return ret;
+	}
+
+/**
+  Write the event specific values for a thread panic event into TEventInfo
+
+  @param aEventInfo TEventInfo object to write data into
+  */
+TInt TDriverEventInfo::PopulateThreadKillInfo(TEventInfo& aEventInfo) const
+	{
+	aEventInfo.iThreadKillInfo.iCurrentPC = iCurrentPC;
+	aEventInfo.iThreadKillInfo.iExitReason = iExceptionNumber;
+	aEventInfo.iThreadKillInfo.iExitType = iExitType;
+	aEventInfo.iThreadKillInfo.iPanicCategoryLength = iPanicCategory.Length();
+	TPtr8 panicCategoryPtr(&(aEventInfo.iThreadKillInfo.iPanicCategory[0]), iPanicCategory.Length());
+	panicCategoryPtr = iPanicCategory;
+	
+	return KErrNone;
+	}
+
+/**
+  Write the event specific values for a library loaded event into TEventInfo
+
+  @param aEventInfo TEventInfo object to write data into
+  */
+TInt TDriverEventInfo::PopulateStartThreadInfo(TEventInfo& aEventInfo) const
+	{
+	aEventInfo.iStartThreadInfo.iFileNameLength = iFileName.Length();
+	TPtr8 fileNamePtr(&(aEventInfo.iStartThreadInfo.iFileName[0]), iFileName.Length());
+	fileNamePtr = iFileName;
+	
+	return KErrNone;
+	}
+
+/**
+  Write the event specific values for an AddProcess event into TEventInfo
+
+  @param aEventInfo TEventInfo object to write data into
+  */
+TInt TDriverEventInfo::PopulateAddProcessInfo(TEventInfo& aEventInfo) const
+	{
+	aEventInfo.iAddProcessInfo.iFileNameLength = iFileName.Length();
+	TPtr8 fileNamePtr(&(aEventInfo.iAddProcessInfo.iFileName[0]), iFileName.Length());
+	fileNamePtr = iFileName;
+
+	const TInt uid3offset = 2;
+	aEventInfo.iAddProcessInfo.iUid3 = iUids.iUid[uid3offset].iUid;
+	aEventInfo.iAddProcessInfo.iCreatorThreadId = iCreatorThreadId;
+
+	return KErrNone;
+	}
+
+/**
+  Write the event specific values for a RemoveProcess event into TEventInfo
+
+  @param aEventInfo TEventInfo object to write data into
+  */
+TInt TDriverEventInfo::PopulateRemoveProcessInfo(TEventInfo& aEventInfo) const
+	{
+	aEventInfo.iRemoveProcessInfo.iFileNameLength = iFileName.Length();
+	TPtr8 fileNamePtr(&(aEventInfo.iRemoveProcessInfo.iFileName[0]), iFileName.Length());
+	fileNamePtr = iFileName;
+	
+	return KErrNone;
+	}
+
+/**
+  Write the event specific values for a library loaded event into TEventInfo
+
+  @param aEventInfo TEventInfo object to write data into
+  */
+TInt TDriverEventInfo::PopulateLibraryLoadedInfo(TEventInfo& aEventInfo) const
+	{
+	aEventInfo.iLibraryLoadedInfo.iCodeAddress = iCodeAddress;
+	aEventInfo.iLibraryLoadedInfo.iDataAddress = iDataAddress;
+	aEventInfo.iLibraryLoadedInfo.iFileNameLength = iFileName.Length();
+	TPtr8 fileNamePtr(&(aEventInfo.iLibraryLoadedInfo.iFileName[0]), iFileName.Length());
+	fileNamePtr = iFileName;
+	
+	return KErrNone;
+	}
+
+/**
+  Write the event specific values for a library unloaded event into TEventInfo
+
+  @param aEventInfo TEventInfo object to write data into
+  */
+TInt TDriverEventInfo::PopulateLibraryUnloadedInfo(TEventInfo& aEventInfo) const
+	{
+	aEventInfo.iLibraryUnloadedInfo.iFileNameLength = iFileName.Length();
+	TPtr8 fileNamePtr(&(aEventInfo.iLibraryUnloadedInfo.iFileName[0]), iFileName.Length());
+	fileNamePtr = iFileName;
+	
+	return KErrNone;
+	}
+
+/**
+  Write the ArmExcInfo values into TEventInfo
+
+  @param aEventInfo TEventInfo object to write data into
+  */
+TInt TDriverEventInfo::PopulateRmdArmExcInfo(TEventInfo& aEventInfo) const
+	{
+	switch(iEventType)
+		{
+		case EEventsProcessBreakPoint:
+		case EEventsBreakPoint:
+			aEventInfo.iThreadBreakPointInfo.iRmdArmExcInfo = iRmdArmExcInfo;
+			break;
+		case EEventsHwExc:
+			aEventInfo.iThreadHwExceptionInfo.iRmdArmExcInfo = iRmdArmExcInfo;
+			break;
+		}
+	
+	return KErrNone;
+	}
+
+/**
+ * Writes the user trace into TEventInfo
+ * 
+ * @param aEventInfo TEventInfo object to write data into
+ */
+TInt TDriverEventInfo::PopulateUserTraceInfo(TEventInfo& aEventInfo) const
+	{	
+	aEventInfo.iUserTraceInfo.iUserTraceLength = (TInt)iArg2;
+	
+	TPtr8 ptr(aEventInfo.iUserTraceInfo.iUserTraceText, (TInt)iArg2, TUserTraceSize );
+	ptr.Copy(iUserTraceText, (TInt)iArg2);
+		
+	return KErrNone;
+	}
+
+TBool TDriverEventInfo::FreezeOnSuspend() const
+	{
+	switch(iEventType)
+		{
+		case EEventsHwExc:
+		case EEventsBreakPoint:
+		case EEventsProcessBreakPoint:
+			return ETrue;
+		case EEventsKillThread:
+			{
+			return (iExitType == EExitPanic);
+			}
+		}
+	return EFalse;
+	}
+
+TBool TDriverEventInfo::TookException() const
+	{
+	return iExitType == EExitPanic &&
+		iExceptionNumber == ECausedException &&
+		iPanicCategory == KLitKernExec;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/src/d_list_manager.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,996 @@
+// 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 the License "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:
+// Provides a class to manage the generation of lists
+// 
+//
+
+#include "d_list_manager.h"
+#include "d_process_tracker.h"
+#include "debug_utils.h"
+#include "plat_priv.h"
+#include "debug_logging.h"
+#include <arm.h>
+
+// make accessing DThread's MState more intuitive
+#define iMState iWaitLink.iSpare1
+// make accessing NThread's NState more intuitive
+#define iNState iSpare3
+
+//constants to match against a rom entry's attributes,
+//these are defined in the file server (can't be included kernel side)
+//and in the ROM tools (also inaccessible) so redefined here
+const TUint KEntryAttXIP=0x0080;
+const TUint KEntryAttDir=0x0010;
+
+using namespace Debug;
+
+/**
+  Get thread listing for the specified thread, if the thread data will not fit
+  in the buffer then an error is returned.
+
+  @param aBuffer buffer to put data in
+  @param aDataSize on return will contain size of data
+  @param aTargetThreadId thread ID to return listing for
+
+  @return KErrNone on success,
+  KErrTooBig if data won't fit in aBuffer
+  or one of the other system wide error codes on failure
+  */
+TInt TListManager::GetThreadListForThread(TDes8& aBuffer, TUint32& aDataSize, const TUint64 aTargetThreadId) const
+	{
+	LOG_MSG("TListManager::GetThreadListForThread()");
+
+	// open a handle to check whether the thread actually exists
+	NKern::ThreadEnterCS();
+	DThread* thread = DebugUtils::OpenThreadHandle(aTargetThreadId);
+	TUint64 processId = 0;
+	if (thread)
+		{
+		processId = thread->iOwningProcess->iId;
+		thread->Close(NULL);
+		}
+	NKern::ThreadLeaveCS();
+	if (!thread)
+		{
+		return KErrArgument;
+		}
+
+	//request a process specific list
+	return GetThreadListForProcess(aBuffer, aDataSize, processId);
+	}
+
+TInt TListManager::GetThreadListForProcess(TDes8& aBuffer, TUint32& aDataSize, const TUint64 aTargetProcessId) const
+	{
+	LOG_MSG("TListManager::GetThreadListForProcess()");
+
+	// open a handle to check whether the process actually exists
+	DProcess* process = DebugUtils::OpenProcessHandle(aTargetProcessId);
+	if(!process)
+		{
+		return KErrArgument;
+		}
+	process->Close(NULL);
+
+	//request a process specific list
+	return GetThreadList(aBuffer, aDataSize, EFalse, aTargetProcessId);
+	}
+
+/**
+  Get global thread listing
+
+  @param aBuffer buffer to put data in
+  @param aDataSize on return will contain size of data
+
+  @return KErrNone on success,
+  KErrTooBig if data won't fit in aBuffer
+  or one of the other system wide error codes on failure
+  */
+TInt TListManager::GetGlobalThreadList(TDes8& aBuffer, TUint32& aDataSize) const
+	{
+	LOG_MSG("TListManager::GetGlobalThreadList()");
+
+	//request a global list
+	return GetThreadList(aBuffer, aDataSize, ETrue, 0);
+	}
+
+/**
+  Get thread listing, if the thread data will not fit
+  in the buffer then an error is returned.
+
+  @param aBuffer buffer to put data in
+  @param aDataSize on return will contain size of data
+  @param aGlobal whether or not the listing should be global or thread specific
+  @param aTargetProcessId process ID to return listing for, relevant only if aGlobal == ETrue
+
+  @return KErrNone on success,
+  KErrTooBig if data won't fit in aBuffer
+  or one of the other system wide error codes on failure
+  */
+TInt TListManager::GetThreadList(TDes8& aBuffer, TUint32& aDataSize, TBool aGlobal, const TUint64 aTargetProcessId) const
+	{
+	LOG_MSG("TListManager::GetThreadList\n");
+
+	NKern::ThreadEnterCS();
+	DObjectCon *threads = Kern::Containers()[EThread];
+	threads->Wait();
+
+	aDataSize = 0;
+	aBuffer.SetLength(0);
+	//iterate through the threads adding them to the buffer
+	for(TInt i=0; i<threads->Count(); i++)
+		{
+		DThread* thread = (DThread*)(*threads)[i];
+
+		//skip this thread pointer is the thread is NULL
+		if(thread)
+			{
+			NThread& nThread = thread->iNThread;
+
+			// if the thread is marked as being dead then don't return information about it in the listing
+#ifndef __SMP__
+			if((NThread::EDead != nThread.iNState) && (DThread::EDead != thread->iMState))
+#else
+ 			if((!nThread.IsDead()) && (DThread::EDead != thread->iMState))
+#endif
+				{
+				if( aGlobal || (aTargetProcessId == (TUint64)thread->iOwningProcess->iId))
+					{
+					//store the data in the buffer
+					AppendThreadData(aBuffer, aDataSize, thread);
+					}
+				}
+			}
+		}
+
+	//leave critical section
+	threads->Signal();
+	NKern::ThreadLeaveCS();
+
+	//return indication of whether the kernel's data was too big
+	return (aDataSize > aBuffer.Length()) ? KErrTooBig : KErrNone;
+	}
+
+/**
+  Helper function for writing thread data into a buffer
+
+  @pre call in a critical section
+  @pre call only on threads which have NThread state not equal to NThread::EDead
+
+  @param aBuffer buffer to put data in
+  @param aDataSize on return will contain size of data
+  @param aThread thread object to include information about
+
+  @return KErrNone on success, or one of the other system wide error codes
+*/
+void TListManager::AppendThreadData(TDes8& aBuffer, TUint32& aDataSize, DThread* aThread) const
+	{
+	LOG_MSG3("TListManager::AppendThreadData for thrd 0x%08x, currThrd=0x%08x", 
+			aThread->iId, Kern::CurrentThread().iId );
+	
+	//get aThread's name
+	TFileName fileName;
+	aThread->FullName(fileName);
+	TUint16 nameLength = fileName.Length();
+
+	//increase aDataSize by the size of this entry
+	aDataSize = Align4(aDataSize + (2*nameLength) + sizeof(TThreadListEntry) - sizeof(TUint16));
+	//if the data would not cause overflow then add it to the buffer
+	if(aDataSize <= aBuffer.MaxLength())
+		{
+		//Create a TThreadListEntry which references the buffer.
+		TThreadListEntry& entry = *(TThreadListEntry*)(aBuffer.Ptr()+aBuffer.Length());
+		//add data to entry
+		entry.iProcessId = (TUint64)aThread->iOwningProcess->iId;
+		entry.iThreadId = (TUint64)aThread->iId;
+		entry.iSupervisorStackBase = (TUint32)aThread->iSupervisorStack;
+		entry.iSupervisorStackBaseValid = ETrue;
+		entry.iSupervisorStackSize = aThread->iSupervisorStackSize;
+		entry.iSupervisorStackSizeValid = ETrue;
+		entry.iNameLength = nameLength;
+
+		entry.iSupervisorStackPtrValid = EInValid;
+		entry.iSupervisorStackPtr = 0;
+		
+		if(aThread->iId != Kern::CurrentThread().iId)
+			{
+			NThread& nThread = aThread->iNThread;
+
+			TArmRegSet regSet;
+			TUint32 flags;
+			NKern::ThreadGetSystemContext(&nThread, &regSet, flags);
+			entry.iSupervisorStackPtr = (TUint32)regSet.iR13;
+			//need to check that the stack pointer flag is valid
+			if(flags & (1<<EArmSp))
+				{
+				entry.iSupervisorStackPtrValid = EValid;
+				}
+			}
+
+		//copy name data into the buffer
+		TUint16* ptr = &(entry.iName[0]);
+		const TUint8* ptr8 = fileName.Ptr();
+		const TUint8* ptr8End = ptr8 + nameLength;
+		while(ptr8 < ptr8End)
+			{
+			*ptr++ = (TUint16)*ptr8++;
+			}
+ 
+		aBuffer.SetLength(aDataSize);
+		}
+	}
+
+/**
+  Get global process listing
+
+  @param aBuffer buffer to put data in
+  @param aDataSize on return will contain size of data
+
+  @return KErrNone on success,
+  KErrTooBig if data won't fit in aBuffer
+  or one of the other system wide error codes on failure
+  */
+TInt TListManager::GetProcessList(TDes8& aBuffer, TUint32& aDataSize) const
+	{
+	LOG_MSG("TListManager::GetProcessList()");
+
+	//get a pointer to the kernel's process list
+	DObjectCon* processes = Kern::Containers()[EProcess];
+
+	if(processes == NULL)
+		{
+		//if can't get container then something is seriously wrong
+		return KErrNotFound;
+		}
+
+	//have to read the processes in a critical section
+	NKern::ThreadEnterCS();
+	processes->Wait();
+
+	aDataSize = 0;
+	//iterate through the processes adding them to the buffer
+	for(TInt i=0; i<processes->Count(); i++)
+		{
+		DProcess* process = (DProcess*)(*processes)[i];
+		if(process)
+			{
+			//get process's file name length
+			DCodeSeg* codeSeg = process->iCodeSeg;
+			TUint16 fileNameLength = (codeSeg) ? (*codeSeg->iFileName).Length() : 0;
+
+			//get process's dynamic name length and name
+			TFullName fullName;
+			process->FullName(fullName);
+			TUint16 dynamicNameLength = fullName.Length();
+
+			//increase aDataSize to reflect size of entry
+			aDataSize = Align4(aDataSize + (2*fileNameLength) + (2*dynamicNameLength) + sizeof(TProcessListEntry) - sizeof(TUint16));
+			//if the data would not cause overflow then add it to the buffer
+			if(aDataSize <= aBuffer.MaxLength())
+				{
+				//Create a TProcessListEntry which references the buffer.
+				TProcessListEntry& entry = *(TProcessListEntry*)(aBuffer.Ptr() + aBuffer.Length());
+
+				//set values
+				entry.iProcessId = (TUint64)process->iId;
+				entry.iFileNameLength = fileNameLength;
+				entry.iDynamicNameLength = dynamicNameLength;
+				entry.iUid3 = process->iUids.iUid[2].iUid;
+
+				if(codeSeg)
+					{
+					//create TPtr to where the file name should be written
+					TPtr name = TPtr((TUint8*)&(entry.iNames[0]), fileNameLength*2, fileNameLength*2);
+					//copy the file name
+					TInt err = CopyAndExpandDes(*codeSeg->iFileName, name);
+					if(err != KErrNone)
+						{
+						processes->Signal();
+						NKern::ThreadLeaveCS();
+						return KErrGeneral;
+						}
+					}
+
+				//create TPtr to where the dynamic name should be written
+				TPtr name = TPtr((TUint8*)(&(entry.iNames[0]) + fileNameLength), dynamicNameLength*2, dynamicNameLength*2);
+				//copy the dynamic name
+				TInt err = CopyAndExpandDes(fullName, name);
+				if(err != KErrNone)
+					{
+					processes->Signal();
+					NKern::ThreadLeaveCS();
+					return KErrGeneral;
+					}
+
+				//set length same as aDataSize
+				aBuffer.SetLength(aDataSize);
+				}
+			}
+		}
+
+	//leave critical section
+	processes->Signal();
+	NKern::ThreadLeaveCS();
+
+	//return indication of whether the kernel's data was too big
+	return (aDataSize > aBuffer.Length()) ? KErrTooBig : KErrNone;
+	}
+
+/**
+  Copy the descriptor aSrc to aDest and converting each byte from aSrc
+  into the two-byte equivalent. For example if aSrc contains 'XYZ' then
+  aDest will be filled with 'X\0Y\0Z\0' where \0 is the null character.
+  The length of aDest is set to twice the length of aSrc.
+
+  @param aSrc source descriptor
+  @param aDest destination descriptor to copy and expand aSrc into
+
+  @return KErrNone on success,
+  KErrArgument if the max length of aDest is less than twice the length of aSrc
+  */
+TInt TListManager::CopyAndExpandDes(const TDesC& aSrc, TDes& aDest) const
+	{
+	//check bounds
+	if(aSrc.Length() * 2 > aDest.MaxLength())
+		{
+		return KErrArgument;
+		}
+
+	//get a pointer to the start of the destination descriptor
+	TUint16* destPtr = (TUint16*)aDest.Ptr();
+
+	//get pointers to the start and end of the aSrc descriptor
+	const TUint8* srcPtr = aSrc.Ptr();
+	const TUint8* srcEnd = srcPtr + aSrc.Length();
+
+	//copy the characters from aSrc into aDest, expanding to make them 16-bit characters
+	while(srcPtr < srcEnd)
+		{
+		*destPtr = (TUint16)*srcPtr;
+		destPtr++;
+		srcPtr++;
+		}
+
+	//set aDest's length to reflect the new contents
+	aDest.SetLength(2*aSrc.Length());
+	return KErrNone;
+	}
+
+/**
+  Get global code segment listing
+
+  @param aBuffer buffer to put data in
+  @param aDataSize on return will contain size of data
+
+  @return KErrNone on success,
+  KErrTooBig if data won't fit in aBuffer,
+  or one of the other system wide error codes
+  */
+TInt TListManager::GetGlobalCodeSegList(TDes8& aBuffer, TUint32& aDataSize) const
+	{
+	LOG_MSG("TListManager::GetGlobalCodeSegList()");
+
+	// Acquire code seg lock mutex
+	NKern::ThreadEnterCS();
+	DMutex* codeMutex = Kern::CodeSegLock();
+	Kern::MutexWait(*codeMutex);
+
+	//get global code seg list
+	SDblQue* codeSegList = Kern::CodeSegList();
+
+	//create a memory info object for use in the loop
+	TModuleMemoryInfo memoryInfo;
+
+	//iterate through the list
+	aDataSize = 0;
+	for (SDblQueLink* codeSegPtr= codeSegList->First(); codeSegPtr!=(SDblQueLink*) (codeSegList); codeSegPtr=codeSegPtr->iNext)
+		{
+		DEpocCodeSeg* codeSeg = (DEpocCodeSeg*)_LOFF(codeSegPtr,DCodeSeg, iLink);
+		//the code seg shouldn't be null as we're in critical section, ignore if it is null
+		if(codeSeg)
+			{
+			//get the memory info
+			TInt err = codeSeg->GetMemoryInfo(memoryInfo, NULL);
+			if(err != KErrNone)
+				{
+				// Release the codeseglock mutex again
+				Kern::MutexSignal(*codeMutex);
+				NKern::ThreadLeaveCS();
+
+				//there's been an error so return it
+				return err;
+				}
+			//calculate data values
+			TFileName fileName(codeSeg->iFileName->Ptr());
+			TBool isXip = (TBool)(codeSeg->iXIP);
+
+			//get the code seg type, can ignore error as have already checked codeSeg is not NULL
+			TCodeSegType type = EUnknownCodeSegType;
+			err = GetCodeSegType(codeSeg, type);
+			if(err != KErrNone)
+				{
+				LOG_MSG("TListManager::GetGlobalCodeSegList() : code seg is NULL");
+				}
+
+			TUint32 uid3 = codeSeg->iUids.iUid[2].iUid;
+			//append data to buffer
+			err = AppendCodeSegData(aBuffer, aDataSize, memoryInfo, isXip, type, fileName, uid3);
+			if(err != KErrNone)
+				{
+				// Release the codeseglock mutex again
+				Kern::MutexSignal(*codeMutex);
+				NKern::ThreadLeaveCS();
+
+				return KErrGeneral;
+				}
+			}
+		}
+
+	// Release the codeseglock mutex again
+	Kern::MutexSignal(*codeMutex);
+	NKern::ThreadLeaveCS();
+
+	return (aDataSize > aBuffer.MaxLength()) ? KErrTooBig : KErrNone;
+	}
+
+/**
+  Get code segment list for a thread
+
+  @param aBuffer buffer to store data in
+  @param aDataSize size of kernel's data
+  @param thread ID to get listing for
+
+  @return KErrNone on success,
+  KErrTooBig if data won't fit in aBuffer,
+  or one of the other system wide error codes
+  */
+TInt TListManager::GetCodeSegListForThread(TDes8& aBuffer, TUint32& aDataSize, const TUint64 aTargetThreadId) const
+	{
+	LOG_MSG("TListManager::GetCodeSegListForThread()");
+
+	TUint64 processId = 0;
+	NKern::ThreadEnterCS();
+	DThread* thread = DebugUtils::OpenThreadHandle(aTargetThreadId);
+	if (thread)
+		{
+		processId = thread->iOwningProcess->iId;
+		thread->Close(NULL);
+		}
+	NKern::ThreadLeaveCS();
+
+	if (processId == 0)
+		{
+		return KErrArgument;
+		}
+
+	return GetCodeSegListForProcess(aBuffer, aDataSize, processId);
+	}
+
+/**
+  Get code segment list for a process
+
+  @param aBuffer buffer to store data in
+  @param aDataSize size of kernel's data
+  @param process ID to get listing for
+
+  @return KErrNone on success,
+  KErrTooBig if data won't fit in aBuffer,
+  or one of the other system wide error codes
+  */
+TInt TListManager::GetCodeSegListForProcess(TDes8& aBuffer, TUint32& aDataSize, const TUint64 aTargetProcessId) const
+	{
+	LOG_MSG("TListManager::GetCodeSegListForProcess()");
+
+	NKern::ThreadEnterCS();
+
+	//get the process
+	DProcess* process = DebugUtils::OpenProcessHandle(aTargetProcessId);
+
+	if(!process)
+		{
+		NKern::ThreadLeaveCS();
+		return KErrArgument;
+		}
+
+	// acquire code segment mutex
+	Kern::AccessCode();
+
+	//memory info object to use in loop
+	TModuleMemoryInfo memoryInfo;
+
+	//get code seg list
+	SDblQue queue;
+	process->TraverseCodeSegs(&queue, NULL, DCodeSeg::EMarkDebug, DProcess::ETraverseFlagAdd);
+
+	//iterate through the list
+	aDataSize = 0;
+	TInt err = KErrNone;
+	for(SDblQueLink* codeSegPtr= queue.First(); codeSegPtr!=(SDblQueLink*) (&queue); codeSegPtr=codeSegPtr->iNext)
+		{
+		//get the code seg
+		DEpocCodeSeg* codeSeg = (DEpocCodeSeg*)_LOFF(codeSegPtr,DCodeSeg, iTempLink);
+
+		//the code seg shouldn't be null as we're in critical section, ignore if it is null
+		if(codeSeg)
+			{
+			err = codeSeg->GetMemoryInfo(memoryInfo, NULL);
+			if (err) break;
+
+			TFileName fileName(codeSeg->iFileName->Ptr());
+			TBool isXip = (TBool)(codeSeg->iXIP);
+
+			//get the code seg type, can ignore error as have already checked codeSeg is not NULL
+			TCodeSegType type = EUnknownCodeSegType;
+			err = GetCodeSegType(codeSeg, type);
+			if(err != KErrNone)
+				{
+				LOG_MSG("TListManager::GetCodeSegListForProcess() : code seg is NULL");
+				}
+
+			TUint32 uid3 = codeSeg->iUids.iUid[2].iUid;
+			//append data to buffer
+			err = AppendCodeSegData(aBuffer, aDataSize, memoryInfo, isXip, type, fileName, uid3);
+			if (err) break;
+			}
+		}
+
+	//un mark the code segs that we've iterated over
+	DCodeSeg::EmptyQueue(queue, DCodeSeg::EMarkDebug);
+
+	//release mutex
+	Kern::EndAccessCode();
+
+	process->Close(NULL);
+	NKern::ThreadLeaveCS();
+	return (aDataSize > aBuffer.MaxLength()) ? KErrTooBig : err;
+	}
+
+/**
+  Appends data to a specified buffer and puts the resulting size in aDataSize.
+  If the data won't fit then aDataSize is updated to reflect what the new length
+  would be.
+
+  @param aBuffer buffer to append data to
+  @param aDataSize will contain buffer size (or the size the buffer would be) on return
+  @param aMemoryInfo info to append to buffer
+  @param aIsXip boolean indicating whether the code segment is XIP
+  @param aFileName file name to append to buffer
+
+  @return KErrNone on success, or one of the other system wide error codes
+  */
+TInt TListManager::AppendCodeSegData(TDes8& aBuffer, TUint32& aDataSize, const TModuleMemoryInfo& aMemoryInfo, const TBool aIsXip, const TCodeSegType aCodeSegType, const TDesC8& aFileName, const TUint32 aUid3) const
+	{
+	//get some data elements to put in buffer
+	TUint16 fileNameLength = aFileName.Length();
+
+	//calculate the resultant size
+	aDataSize = Align4(aDataSize + sizeof(TCodeSegListEntry) + (2*fileNameLength) - sizeof(TUint16));
+	if(aDataSize <= aBuffer.MaxLength())
+		{
+		//Create a TCodeSegListEntry which references the buffer.
+		TCodeSegListEntry& entry = *(TCodeSegListEntry*)(aBuffer.Ptr() + aBuffer.Length());
+		entry.iCodeBase = aMemoryInfo.iCodeBase;
+		entry.iCodeSize = aMemoryInfo.iCodeSize;
+		entry.iConstDataSize = aMemoryInfo.iConstDataSize;
+		entry.iInitialisedDataBase = aMemoryInfo.iInitialisedDataBase;
+		entry.iInitialisedDataSize = aMemoryInfo.iInitialisedDataSize;
+		entry.iUninitialisedDataSize = aMemoryInfo.iUninitialisedDataSize;
+		entry.iIsXip = aIsXip;
+		entry.iCodeSegType = aCodeSegType;
+		entry.iNameLength = fileNameLength;
+		entry.iUid3 = aUid3;
+
+		//have to convert the stored name to 16 bit unicode
+		TPtr name = TPtr((TUint8*)&(entry.iName[0]), fileNameLength*2, fileNameLength*2);
+		TInt err = CopyAndExpandDes(aFileName, name);
+		if(err != KErrNone)
+			{
+			return KErrGeneral;
+			}
+
+		//increase length
+		aBuffer.SetLength(aDataSize);
+		}
+
+	return KErrNone;
+	}
+
+/**
+  Get global XIP libraries list. The ROM file system is searched for files in
+  z:\sys\bin. The files are filtered to only include library files which
+  correspond to the correct hardware variant.
+
+  In the rom, a directory is represented as a list of TRomEntrys, corresponding to
+  the files and directories in that directory. A TRomEntry corresponding to a file
+  contains a pointer to that file's location in the rom. If the TRomEntry
+  corresponds to a directory then it contains a pointer to that directory in the
+  ROM header. As such, from a pointer to the root directory of the z: drive, it is
+  possible to extract the directory contents for a particular directory (i.e. z:\sys\bin)
+  by recursively finding the subdirectories (i.e. find 'sys' in 'z:', then 'bin' in 'sys')
+  and then listing the contents of that directory.
+
+  @param aBuffer buffer to store data in
+  @param aDataSize size of kernel's data
+
+  @return KErrNone on success,
+  KErrTooBig if data won't fit in aBuffer,
+  or one of the other system wide error codes
+  */
+TInt TListManager::GetXipLibrariesList(TDes8& aBuffer, TUint32& aDataSize) const
+	{
+	LOG_MSG("TListManager::GetXipLibrariesList()");
+
+	// z:\sys\bin expressed as 16 bit unicode..
+	_LIT(KZSysBin, "z\0:\0\\\0s\0y\0s\0\\\0b\0i\0n\0\\\0");
+
+	//array to store pointers to directory entries in
+	RPointerArray<TRomEntry> entries;
+	//get the entries in KZSysBin
+	TInt err = GetDirectoryEntries(entries, KZSysBin());
+	if(KErrNone != err)
+		{
+		entries.Close();
+		return err;
+		}
+
+	aDataSize = 0;
+	for(TInt i=0; i<entries.Count(); i++)
+		{
+		//if the entry is XIP and it's not a directory then it's a candidate to add
+		if( (entries[i]->iAtt & KEntryAttXIP) && ! (entries[i]->iAtt & KEntryAttDir) )
+			{
+			//get a reference to the dll's header
+			const TRomImageHeader& header = *(const TRomImageHeader*)(entries[i]->iAddressLin);
+
+			//check that it's uid1 value corresponds to that for a library
+			if(header.iUid1 == KDynamicLibraryUidValue)
+				{
+				//get the current hardware variant
+				TSuperPage& superPage = Kern::SuperPage();
+				TUint variant = superPage.iActiveVariant;
+				TUint cpu = (variant >> 16) & 0xff;
+				TUint asic = (variant >> 24);
+
+				//check this dll is compatible with the current variant
+				if(THardwareVariant(header.iHardwareVariant).IsCompatibleWith(cpu,asic,variant))
+					{
+					const TInt fileNameLength16 = entries[i]->iNameLength;
+					const TInt fullNameLength16 = (KZSysBin().Length() / 2) + fileNameLength16;
+					aDataSize += Align4((2 * fullNameLength16) + sizeof(TXipLibraryListEntry) - sizeof(TUint16));
+
+					if(aDataSize <= aBuffer.MaxLength())
+						{
+						//Create a TXipLibraryListEntry which references the buffer.
+						TXipLibraryListEntry& libraryInfo = *(TXipLibraryListEntry*)(aBuffer.Ptr() + aBuffer.Length());
+
+						//add the data
+						libraryInfo.iCodeBase = header.iCodeAddress;
+						libraryInfo.iCodeSize = header.iTextSize;
+						libraryInfo.iConstDataSize = header.iCodeSize - header.iTextSize;
+						libraryInfo.iInitialisedDataBase = header.iDataBssLinearBase;
+						libraryInfo.iInitialisedDataSize = header.iDataSize;
+						libraryInfo.iUninitialisedDataSize = header.iBssSize;
+						libraryInfo.iNameLength = fullNameLength16;
+
+						//create a TPtr8 to contain the fully qualified name (i.e. z:\sys\bin\ prefixed)
+						TPtr8 name((TUint8*)&(libraryInfo.iName[0]), 0, 2 * fullNameLength16);
+						name.Append(KZSysBin());
+						name.Append(TPtr8((TUint8*)&(entries[i]->iName), 2 * fileNameLength16, 2 * fileNameLength16));
+
+						//increase the buffer's length to reflect the new data size
+						aBuffer.SetLength(aDataSize);
+						}
+					}
+				}
+			}
+		}
+	entries.Close();
+	return (aDataSize == aBuffer.Length()) ? KErrNone : KErrTooBig;
+	}
+
+/**
+Get the list of TRomEntry objects in the specified directory aDirectory
+
+@param aRomEntryArray array to store pointers to the TRomEntry objects in
+@param aDirectoryName directory to get contents of. The passed in string should be
+16 bit unicode and should begin with z:. Single backslashes should be used as delimiters
+rather than forward slashes and a terminating backslash is optional.
+For example: z:\sys\bin
+
+@return KErrNone on success, or one of the other system wide error codes
+*/
+TInt TListManager::GetDirectoryEntries(RPointerArray<TRomEntry>& aRomEntryArray, const TDesC& aDirectoryName) const
+	{
+	LOG_MSG("TListManager::GetDirectoryEntries()");
+
+	//definition in 16 bit unicode
+	_LIT(KForwardSlash, "/\0");
+
+	//if directory has forward slashes then exit
+	if(aDirectoryName.Find(KForwardSlash()) != KErrNotFound)
+		{
+		return KErrArgument;
+		}
+
+	//create an array to hold the folders in aDirectoryName
+	RArray<TPtr8> folders;
+
+	//split the directory up into its folders, i.e. z:\sys\bin is split into { 'z:', 'sys', 'bin' }
+	TInt err = SplitDirectoryName(aDirectoryName, folders);
+	if(KErrNone != err)
+		{
+		folders.Close();
+		return err;
+		}
+
+	if(folders.Count() == 0)
+		{
+		folders.Close();
+		//empty string passed in
+		return KErrArgument;
+		}
+
+	// z: as 16 bit unicode
+	_LIT(KZColon, "z\0:\0");
+	if(folders[0].CompareF(KZColon()) != 0)
+		{
+		//first argument must be z: otherwise not in rom
+		folders.Close();
+		return KErrArgument;
+		}
+	//remove z: from array
+	folders.Remove(0);
+	for(TInt i=0; i<folders.Count(); i++)
+		{
+		if(folders[i].Length() == 0)
+			{
+			// there were two backslashes in a row
+			folders.Close();
+			return KErrArgument;
+			}
+		}
+
+	//get a pointer to the start of the rom root directory list
+	TLinAddr romRootDirectoryList = Epoc::RomHeader().iRomRootDirectoryList;
+
+	//the first 4 bytes of the rom root directory list is a count of how many sections (rom roots) there are
+	TUint32 rootDirectoryCount = (TUint32)*(TLinAddr*)romRootDirectoryList;
+
+	//rootDirectoryPointer will be shifted through the rom root directory list and will contain pointers to the sections in the rom
+	TLinAddr rootDirectoryPointer = romRootDirectoryList;
+	for(TInt i=0; i<rootDirectoryCount; i++)
+		{
+		//the address of the section is stored in the second four bytes of the 8 byte pair reserved for each section
+		rootDirectoryPointer += 8;
+
+		//romRoot contains the address of the root of the section
+		TLinAddr romRoot = *(TLinAddr*)rootDirectoryPointer;
+
+		//append the directory entries from romRoot's z:\sys\bin subdirectory
+		TInt err = GetDirectoryEntries(aRomEntryArray, folders, romRoot);
+		if(KErrNone != err)
+			{
+			folders.Close();
+			return err;
+			}
+		}
+	folders.Close();
+	return KErrNone;
+	}
+
+/**
+  Recursively finds the subdirectories in aArray and stores references to the
+  entries in the most derived subdirectory in aRomEntryArray
+
+  @param aRomEntryArray on return will contain the entries in the directory corresponding to aArray
+  @param aArray an array containing the directory to get the entries for, i.e. { 'sys', 'bin' }
+  @param aAddress address in rom to being searching from
+
+  @param KErrNone on success, or one of the other system wide error codes
+*/
+TInt TListManager::GetDirectoryEntries(RPointerArray<TRomEntry>& aRomEntryArray, RArray<TPtr8>& aArray, TLinAddr& aAddress) const
+	{
+	LOG_MSG2("TListManager::GetDirectoryEntries() aAddress: 0x%08x", aAddress);
+
+	//find the next subdirectory and store its address in aAddress, return error if we can't find it
+	TInt err = FindDirectory(aArray[0], aAddress);
+	if(err != KErrNone)
+		{
+		return err;
+		}
+
+	//if this is the most derived sub-directory (i.e. the bin of z:\sys\bin) then get the dir contents
+	if(aArray.Count() == 1)
+		{
+		return GetDirectoryContents(aRomEntryArray, aAddress);
+		}
+	else
+		{
+		//get the next subdirectory's contents
+		aArray.Remove(0);
+		return GetDirectoryEntries(aRomEntryArray, aArray, aAddress);
+		}
+	}
+
+/**
+Return the entries of a directory in the rom
+
+@param aRomEntryArray array to store the entries in
+@param aAddress address of a directory block in the rom
+*/
+TInt TListManager::GetDirectoryContents(RPointerArray<TRomEntry>& aRomEntryArray, const TLinAddr aAddress) const
+	{
+	LOG_MSG("TListManager::GetDirectoryContents()");
+
+	TLinAddr address = aAddress;
+
+	//get the size in bytes of the block of rom to iterate over
+	const TUint32 sizeInBytes = *(TUint32*)aAddress;
+
+	//get address of first TRomEntry
+	const TLinAddr initialAddress = aAddress + sizeof(TUint32);
+
+	//get pointer to subdir count
+	address = initialAddress + sizeInBytes;
+
+	//the upper two bytes of this entry contain the number of files in this directory, and the lower two bytes
+	//contains the number of subdirectories in this directory
+	TUint32 filesAndDirectories = *(TUint32*)address;
+
+	//get number of subdirectories in this directory
+	const TUint16 subDirCount = filesAndDirectories & 0xFFFF;
+
+	//get the number of files in this dir
+	const TUint16 filesCount = filesAndDirectories >> 16;
+
+	//get total number of entries in dir
+	const TUint numDirectoryEntries = subDirCount + filesCount;
+
+	//set address to start of first entry
+	address = initialAddress;
+
+	for(TInt i=0; i<numDirectoryEntries; i++)
+		{
+		TRomEntry* romEntry = (TRomEntry*)address;
+
+		//store the entry
+		TInt err = aRomEntryArray.Append(romEntry);
+		if(KErrNone != err)
+			{
+			return err;
+			}
+
+		//length of the name of the rom entry
+		TInt nameLength = romEntry->iNameLength;
+
+		//get the size of the entry including the name
+		TUint32 romEntrySize = sizeof(TRomEntry) - sizeof(romEntry->iName) + (2 * nameLength);
+		//adjust the address to the next entry
+		address += Align4(romEntrySize);
+		}
+	return KErrNone;
+	}
+
+/**
+  Finds the subdirectory with name aDirectory in the directory at aAddress
+
+  @param aDirectory name of subdirectory to search for (i.e. 'bin')
+  @param aAddress address in rom of containing directory (i.e. address of 'sys' directory)
+
+  @param KErrNone if aDirectory could be found in aAddress, KErrNotFound if it could not be found
+  */
+TInt TListManager::FindDirectory(const TDesC& aDirectory, TLinAddr& aAddress) const
+	{
+	LOG_MSG3("TListManager::FindDirectory() aDirectory: %S, aAddress: 0x%08x", &aDirectory, aAddress);
+
+	//get the directory's contents
+	RPointerArray<TRomEntry> dirContents;
+	TInt err = GetDirectoryContents(dirContents, aAddress);
+	if(KErrNone != err)
+		{
+		dirContents.Close();
+		return err;
+		}
+	for(TInt i=0; i<dirContents.Count(); i++)
+		{
+		//create a reference to the TRomEntry in the rom to access its attributes
+		TRomEntry& romEntry = *(dirContents[i]);
+		if(romEntry.iAtt & KEntryAttDir)
+			{
+			// this entry's a directory so check if it matches aDirectory
+			const TInt nameLength = romEntry.iNameLength;
+			TPtr8 name((TUint8*)&(romEntry.iName), nameLength * 2, nameLength * 2);
+			if(0 == aDirectory.CompareF(name))
+				{
+				// names matched so get the address of this directory's contents
+				aAddress = romEntry.iAddressLin;
+				dirContents.Close();
+				return KErrNone;
+				}
+			}
+		}
+	dirContents.Close();
+	//couldn't find it so return error
+	return KErrNotFound;
+	}
+
+/**
+  Helper function to get code seg type.
+
+  @param aCodeSeg code seg to get type of
+  @param aType will contain type on return
+
+  @return KErrNone on success, KErrNotFound if aCodeSeg is NULL
+  */
+TInt TListManager::GetCodeSegType(const DCodeSeg* aCodeSeg, TCodeSegType& aType) const
+	{
+	if(!aCodeSeg)
+		{
+		return KErrNotFound;
+		}
+
+	if(aCodeSeg->IsExe())
+		{
+		aType = EExeCodeSegType;
+		return KErrNone;
+		}
+
+	if(aCodeSeg->IsDll())
+		{
+		aType = EDllCodeSegType;
+		return KErrNone;
+		}
+
+	aType = EUnknownCodeSegType;
+	return KErrNone;
+	}
+
+
+/**
+  Split a directory name into its subdirectories, using a 16-bit backslash ('\\\0') as a delimiter.
+  For example z:\sys\bin would be split into { 'z:', 'sys', 'bin' }
+
+  @param aDirectoryName directory name to split into subdirectories
+  @param aSubDirectories array to store the subdirectories in
+  */
+TInt TListManager::SplitDirectoryName(const TDesC& aDirectoryName, RArray<TPtr8>& aSubDirectories) const
+	{
+	//definition in 16 bit unicode
+	_LIT(KBackSlash, "\\\0");
+
+	//split the directory up into its folders, i.e. z:\sys\bin is split into 
+	TPtr8 string((TUint8*)aDirectoryName.Ptr(), aDirectoryName.Length(), aDirectoryName.Length());
+	while(string.Ptr() < aDirectoryName.Ptr() + aDirectoryName.Length())
+		{
+		TInt offset = string.Find(KBackSlash());
+		if(offset == KErrNotFound)
+			{
+			//reached the end of the string
+			offset = string.Length();
+			}
+		//adjustedOffset takes account of the end of the string case
+		TInt adjustedOffset = (offset == string.Length()) ? offset : offset + KBackSlash().Length();
+		//add sub-folder name
+		TInt err = aSubDirectories.Append(TPtr8((TUint8*)string.Ptr(), offset, offset));
+		if(KErrNone != err)
+			{
+			return err;
+			}
+		//remove the sub-folder name and continue
+		string.Set((TUint8*)string.Ptr() + adjustedOffset, string.Length() - adjustedOffset, string.Length() - adjustedOffset);
+		}
+	return KErrNone;
+	}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/src/d_process_tracker.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,664 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Purpose: The DProcessTracker object tracks which processes are being
+// debugged. The DProcessTracker class uses a DTargetProcess object for
+// each process being debugged.
+// Note: Although TheDProcessTracker object is a global, it will be unique
+// as only the Debug Security Server can load and use rm_debug.ldd.
+// 
+//
+
+#include <e32def.h>
+#include <e32def_private.h>
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include <kernel/kernel.h>
+#include <kernel/kern_priv.h>
+
+#include <rm_debug_api.h>
+#include "debug_logging.h"
+#include "d_process_tracker.h"
+#include "debug_utils.h"
+
+// Global Run-mode debugged process tracking object
+DProcessTracker TheDProcessTracker;
+
+// ctor
+DProcessTracker::DProcessTracker()
+	{
+	}
+
+/**
+ * dtor
+ * Go through forzen thread list and resume each one before clearing our structures
+ * @internalTechnology
+ */
+DProcessTracker::~DProcessTracker()
+	{
+
+	for(TInt i=0; i<iFrozenThreadSemaphores.Count(); i++)
+		{
+		LOG_MSG2("~DProcessTracker Resuming frozen NThread 0x%08x via FSSignal ", iFrozenThreadSemaphores[i]->iOwningThread );
+		NKern::FSSignal(iFrozenThreadSemaphores[i]);
+		}
+
+	NKern::ThreadEnterCS();
+	// The ResetAndDestroy() will call the individual deletes for all objects in the containers
+	iFrozenThreadSemaphores.ResetAndDestroy();
+	iProcesses.ResetAndDestroy();
+	iAgentsAttachedToAll.ResetAndDestroy();
+	NKern::ThreadLeaveCS();
+	}
+
+/**
+ * @internalTechnology
+ *
+ * Creates and stores an internal mapping of debug agent to debugged process.
+ * Note that an individual process may be mapped to a number of debug agents.
+ *
+ * @param aProcessName - The fullly qualified path of the debugged process. E.g. z:\sys\bin\hello_world.exe
+ * @param aAgentId - The process id of the debug agent which is attaching to aProcessName, as returned by RProcess.Id()
+ * @return KErrNone if there are no errors. KErrArgument if the processname is too long/short for a valid filepath.
+ *  KErrNoMemory if there is insufficient memory.
+ */
+TInt DProcessTracker::AttachProcess(const TDesC8& aProcessName,TUint64 aAgentId)
+	{
+	LOG_MSG3("DProcessTracker::AttachProcess name=%S agentId=0x%lx", 
+		&aProcessName, aAgentId);
+
+	// Valid ProcessName?
+	if (aProcessName.Length() < 1 || aProcessName.Length() >= KMaxPath)
+		{
+		return KErrArgument;
+		}
+
+	if (aProcessName == _L8("*"))
+		{
+		DDebugAgent* agent = FindAgentForProcessAndId( aProcessName, aAgentId );
+		if(agent != NULL)
+			{
+			LOG_MSG("Found agent already attached to all");
+			return KErrAlreadyExists;
+			}
+
+		agent = DDebugAgent::New(aAgentId);
+		if(agent == NULL)
+			{
+			LOG_MSG("DProcessTracker::AttachProcess() couldn't allocate memory for DDebugAgent");
+			return KErrNoMemory;
+			}
+		
+		return iAgentsAttachedToAll.Append(agent);
+
+		}
+
+	// Not attach all, but for a specific process/exe
+
+	// Create an DTargetProcess to store
+	DTargetProcess* tmpProcess = new DTargetProcess;
+	if (tmpProcess == 0)
+		{
+		return KErrNoMemory;
+		}
+	LOG_MSG2(" AttachProcess: < new DTargetProcess=0x%08x", tmpProcess );
+	
+	// Set the name
+	TInt err = KErrNone;
+	err = tmpProcess->SetProcessName(aProcessName);
+	if (err != KErrNone)
+		{
+		LOG_MSG2(" AttachProcess: < SetProcessName returned %d", err );
+		return err;
+		}
+
+	// Is this process being debugged (ie already attached?)
+	TInt found = KErrNotFound;
+	const TInt numberOfProcesses = iProcesses.Count();
+	for (TInt index = 0; index < numberOfProcesses; index++)
+		{
+		if (iProcesses[index]->ProcessName().CompareF(aProcessName) == 0)
+			{
+			LOG_MSG3(" Proc count=%d, found proc in iProcesses at %d. Count=%d",
+				index, iProcesses.Count() );
+			found = index;
+			break;
+			}
+		}
+
+	if (found != KErrNotFound)
+		{
+		// Yes, it is being debugged
+
+		// Add the agent to the list of agents for this process
+		LOG_MSG3(" > AddAgent(agent id %d) to existing iProcesses[%d]", I64LOW(aAgentId), found); 
+
+		iProcesses[found]->AddAgent(aAgentId);
+
+		return KErrNone;
+		}
+	else
+		{
+		// No, it is not being debugged
+			
+		// Add the agent to the list of agents for this process
+		LOG_MSG2(" > AddAgent(agent %d) to new proc at index 0", I64LOW(aAgentId) ); 
+
+		tmpProcess->AddAgent(aAgentId);
+
+		// Add the process to the list of processes being debugged
+		return iProcesses.Append(tmpProcess);
+		}
+	}
+
+/**
+ * @internalTechnology
+ * 
+ * Removes a previously created mapping between a debug agent and a debugged process,
+ * as created by AttachProcess.
+ *
+ * @param aProcessName - The fully qualified path of the debugged process. E.g. z:\sys\bin\hello_world.exe
+ * @param aAgentId - The process id of the debug agent which is attaching to aProcessName, as returned by RProcess.Id()
+ * @return KErrNone if there are no problems. KErrArgument if the processname is too long/short for a valid filepath.
+ * KErrNotFound if the mapping does not exist (and therefore cannot be removed).
+ */
+TInt DProcessTracker::DetachProcess(const TDesC8& aProcessName, TUint64 aAgentId)
+	{
+	LOG_MSG3("DProcessTracker::DetachProcess name=%S agentId=0x%lx", 
+		&aProcessName, aAgentId);
+
+	// Valid ProcessName?
+	if (aProcessName.Length() < 1 || aProcessName.Length() >= KMaxPath)
+		{
+		return KErrArgument;
+		}
+
+	if (aProcessName == _L8("*"))
+		{
+		TInt const agentCount = iAgentsAttachedToAll.Count();
+		LOG_MSG2(" iAgentsAttachedToAll size=%d", agentCount );
+
+		for (TInt i = 0; i < agentCount; i++)
+			{
+			if (iAgentsAttachedToAll[i]->Id() == aAgentId)
+				{
+				LOG_MSG2(" Agent id found at index %d, deleting it", i);
+				delete iAgentsAttachedToAll[i];
+				iAgentsAttachedToAll.Remove(i);
+				return KErrNone;
+				}
+			}
+
+		//Not found, so error condition
+		return KErrNotFound;
+		}
+
+	// Are we debugging this process?
+	const TInt numberOfProcesses = iProcesses.Count();
+	TInt foundIdx = KErrNotFound;
+	for(TInt i = 0; i < numberOfProcesses; i++)
+		{
+		if (iProcesses[i]->ProcessName().CompareF(aProcessName) == 0)
+			{
+			foundIdx = i;
+			break;
+			}
+		}
+
+	if (foundIdx == KErrNotFound)
+		{
+		return KErrNotFound;
+		}
+
+	// remove the agent from the process
+	iProcesses[foundIdx]->RemoveAgent(aAgentId);
+
+	// Found it, are there any more attached agents, or suspended threads in the process?
+
+	
+	if (iProcesses[foundIdx]->AgentCount() == 0)
+		{
+		// Delete the process as no more agents are still attached
+		delete iProcesses[foundIdx];
+
+		// Remove the now obsolete pointer from our array.
+		iProcesses.Remove(foundIdx);
+		}
+
+	return KErrNone;
+	}
+
+/**
+ * @internalTechnology
+ *
+ * Detachs a debug agent from every process being debugged. Used when a debug agent is being detached
+ * from the debug security server and has not supplied a specific process name from which to detach.
+ */
+TInt DProcessTracker::DetachAgent(const TUint64 aAgentId)
+	{
+	
+	LOG_MSG2("DProcessTracker::DetachAgent 0x%lx", aAgentId);
+	
+	// Remove this agent from all the processes being tracked.
+	TInt numberOfProcesses = iProcesses.Count();
+	for(TInt i=0; i<numberOfProcesses; i++)
+		{
+		// remove the agent from the process (we don't care about the return code)
+		iProcesses[i]->RemoveAgent(aAgentId);
+		}
+
+	// Increment down through the array as we then don't have to worry about
+	// missing entries which have been shifted after deletes.
+	// The initial value of i correspnds to the index of the final element 
+	// in the array.
+	for(TInt i = iProcesses.Count()-1; i>=0; i--)
+		{
+		if (iProcesses[i]->AgentCount() == 0)
+			{
+			// No agents remain for this process. Delete the
+			// process object and remove the pointer from the array
+			delete iProcesses[i];
+			iProcesses.Remove(i);
+			}
+		}
+
+	TInt const agentCount = iAgentsAttachedToAll.Count();
+	for (TInt i = 0; i < agentCount; i++)
+		{
+		if (iAgentsAttachedToAll[i]->Id() == aAgentId)
+			{
+			LOG_MSG2(" Agent id found at index %d, deleting it", i);
+			delete iAgentsAttachedToAll[i];
+			iAgentsAttachedToAll.Remove(i);
+			}
+		}
+		
+	return KErrNone;
+	}
+
+/**
+ * @internalTechnology
+ *
+ * Returns a pointer to a DTargetProcess object representing the mapping of a debugged process
+ * with all the relevant debug agents interested in that process, as determined
+ * by AttachProcess.
+ *
+ * @param aProcessName - The fully qualified path of the debugged process. E.g. z:\sys\bin\hello_world.exe
+ * @return DTargetProcess* pointer to an object representing the internal mapping of a process to all associated
+ * debug agents. Returns 0 if the mapping cannot be found or the aProcessName is invalid.
+ */
+DTargetProcess* DProcessTracker::FindProcess(const TDesC8& aProcessName) const
+	{
+	// Valid ProcessName?
+	if (aProcessName.Length() < 1 || aProcessName.Length() >= KMaxPath)
+		{
+		return NULL;
+		}
+
+	// Can we find this in the array?
+
+	// Are we debugging this process?
+	const TInt numberOfProcesses = iProcesses.Count();
+	DTargetProcess* found = NULL;
+	for(TInt i = 0; i < numberOfProcesses; i++)
+		{
+		if (iProcesses[i]->ProcessName().CompareF(aProcessName) == 0)
+			{
+			found = iProcesses[i];
+			LOG_EVENT_MSG3("DProcessTracker::FindProcess(%S) found at list pos %i", 
+				&aProcessName, i);
+			break;
+			}
+		}
+
+	if (found == NULL)
+		{
+		LOG_EVENT_MSG2("DProcessTracker::FindProcess(%S), not found", &aProcessName);
+		}
+
+	return found;
+	}
+
+/**
+ * @internalTechnology
+ *
+ * Returns a pointer to a DTargetProcess object representing the mapping of a debugged process
+ * with all the relevant debug agents interested in that process, as determined
+ * by AttachProcess.
+ *
+ * Note: This does not attempt an exact match, because the AddProcess event does not provide
+ * a fully-qualified path, it provides something like [t_rmdebug_security0.exe].
+ *
+ * So for the purposes of dealing with this event, we need a "fuzzier" match which does not use the complete
+ * path.
+ *
+ * @param aProcessName - The fully qualified path of the debugged process. E.g. z:\sys\bin\hello_world.exe
+ * @return DTargetProcess* pointer to an object representing the internal mapping of a process to all associated
+ * debug agents. Returns 0 if the mapping cannot be found or the aProcessName is invalid.
+ */
+DTargetProcess*	DProcessTracker::FuzzyFindProcess(const TDesC8& aProcessName)
+	{
+	// Valid ProcessName?
+	if (aProcessName.Length() < 1 || aProcessName.Length() >= KMaxPath)
+		{
+		return 0;	// not found
+		}
+
+	// Can we find this in the array?
+	TBool found = EFalse;
+	DTargetProcess* foundProcess = 0;
+	const TChar KBackSlash('\\');
+
+	TInt numberOfProcesses = iProcesses.Count();
+	for(TInt i=0; i < numberOfProcesses; i++)
+		{
+		foundProcess = iProcesses[i];
+
+		TInt procListBackSlash = foundProcess->ProcessName().LocateReverse( KBackSlash );
+		if( procListBackSlash == KErrNotFound )
+			{
+			procListBackSlash = 0;
+			}
+		else
+			{
+			//Now move to the char after the backlash
+			procListBackSlash++;
+			}
+
+		TInt eventBackSlash = aProcessName.LocateReverse( KBackSlash );
+		if( eventBackSlash == KErrNotFound )
+			{
+			eventBackSlash = 0;
+			}
+		else
+			{
+			//Now move to the char after the backlash
+			eventBackSlash++;
+			}
+
+		if( ( procListBackSlash == 0 ) && ( eventBackSlash == 0 ) )
+			{
+			//There were no backslashes on either name, so no point in continuing
+			break;
+			}
+
+		TPtrC8 eventCleanName( aProcessName.Mid( eventBackSlash ) );		
+		TPtrC8 procListCleanName( foundProcess->ProcessName().Mid( procListBackSlash ) );
+
+		if ( eventCleanName.CompareF( procListCleanName ) == 0 )
+			{
+			LOG_MSG2("DProcessTracker::FuzzyFindProcess() found a match : process list[%d]", i );
+			found = ETrue;
+			break;
+			}
+		}
+
+	if (found == EFalse)
+		{
+		return 0;	// not found
+		}
+
+	return foundProcess;
+	}
+
+/**
+  Freeze the current thread
+
+  @return KErrNone if the thread is successfully suspended,
+  KErrAlreadyExists if the agent has already suspended the thread,
+  or one of the other system wide error codes
+
+  This marks the current thread for waiting on a Fast Semaphore
+  when exception handling for this thread has completed - see
+  rm_debug_eventhandler.cpp for details.
+  */
+TInt DProcessTracker::FreezeThread()
+	{
+	// create and store a fast semaphore to stop the thread on
+	TInt err = KErrGeneral;
+	NKern::ThreadEnterCS();
+	NFastSemaphore* sem = new NFastSemaphore( &(Kern::CurrentThread().iNThread) );
+	if( sem != NULL )
+		{
+		LOG_MSG3("DProcessTracker::FreezeThread(): new NFastSemaphore(curr NThread=0x%08x), DThread=0x%08x", 
+			sem->iOwningThread, &(Kern::CurrentThread()) );
+		err = iFrozenThreadSemaphores.Append(sem); 
+		}
+	else
+		{
+		LOG_MSG("DProcessTracker::FreezeThread(): Error : could not allocate NFastSemaphore"); 
+		err = KErrNoMemory;
+		}
+
+	NKern::ThreadLeaveCS();
+	return err;
+	}
+
+/**
+ Waits the current thread on a Fast Semaphore.
+
+ This is useful for situations where the current thread
+ has hit a breakpoint within a critical section, and
+ otherwise could not be suspended at this point.
+
+ Note that the Fast Semaphore structure on which the thread
+ waits must be a member data item of this class instance,
+ as it needs to be FSSignal()'d by another thread to resume
+ again.
+ */
+void DProcessTracker::FSWait()
+	{
+	NThread* currentNThread = &(Kern::CurrentThread().iNThread);	
+	for(TInt i=0; i<iFrozenThreadSemaphores.Count(); i++)
+		{
+		if(iFrozenThreadSemaphores[i]->iOwningThread == currentNThread)
+			{
+			LOG_MSG4("DProcessTracker::FSWait(): > FSWait frozen sem %d, currentNThread=0x%08x, id=0x%x", 
+				i, currentNThread, Kern::CurrentThread().iId );
+			NKern::FSWait(iFrozenThreadSemaphores[i]);
+			return;
+			}
+		}
+	}
+	
+/**
+  Resume the specified frozen thread
+
+  @param aThread thread to resume
+
+  @return KErrNone if the thread has previously been suspended and is resumed,
+  KErrNotFound if the thread has not previously been suspended
+  */
+TInt DProcessTracker::ResumeFrozenThread(DThread* aThread)
+	{
+	for(TInt i=0; i<iFrozenThreadSemaphores.Count(); i++)
+		{
+		if(iFrozenThreadSemaphores[i]->iOwningThread == &(aThread->iNThread))
+			{
+			LOG_MSG2("DProcessTracker::ResumeFrozenThread 0x%08x, signalling then deleting this FastSem", aThread->iId );
+			NKern::FSSignal(iFrozenThreadSemaphores[i]);
+			NKern::ThreadEnterCS();
+			delete iFrozenThreadSemaphores[i];
+			NKern::ThreadLeaveCS();
+			iFrozenThreadSemaphores.Remove(i);
+			return KErrNone;
+			}
+		}
+	return KErrNotFound;
+	}
+	
+TInt DProcessTracker::SuspendThread(DThread* aTargetThread, TBool aFreezeThread)
+	{
+	LOG_MSG5("DProcessTracker::SuspendThread() id 0x%08x, iCsCount=%d, , iCsFunction=%d, iSuspendCount=%d ", 
+			aTargetThread->iId, aTargetThread->iNThread.iCsCount, aTargetThread->iNThread.iCsFunction, aTargetThread->iNThread.iSuspendCount );
+	if( !aFreezeThread )
+		{		
+		if(!aTargetThread)
+			{
+			LOG_MSG("DProcessTracker::SuspendThread()  > Kern::ThreadSuspend NullThrd Ptr!!");
+			return KErrBadHandle;
+			}
+		
+		Kern::ThreadSuspend(*aTargetThread, 1);
+		return KErrNone;
+		}
+
+	if( Kern::CurrentThread().iId != aTargetThread->iId )
+		{
+		LOG_MSG2("DProcessTracker::SuspendThread() Error: Freeze for thread 0x%08x, but different from current thread", 
+				aTargetThread->iId);
+		return KErrBadHandle;
+		}
+
+	return FreezeThread();
+	}
+
+
+TInt DProcessTracker::ResumeThread(DThread* aTargetThread)
+	{
+	LOG_MSG5("DProcessTracker::ResumeThread() id 0x%08x, iCsCount=%d, , iCsFunction=%d, iSuspendCount=%d ", 
+			aTargetThread->iId, aTargetThread->iNThread.iCsCount, aTargetThread->iNThread.iCsFunction, aTargetThread->iNThread.iSuspendCount );
+
+	TInt err = ResumeFrozenThread( aTargetThread );
+	if( err == KErrNotFound ) 
+		{
+		LOG_MSG(" ResumeThread() : not found in frozen list. Using Kern::ThreadResume" );
+		Kern::ThreadResume(*aTargetThread);
+		return KErrNone;
+		}
+
+	return err;
+	}
+
+/**
+  Get a thread's originating file name
+
+  @param aThread the thread to get the file name for
+
+  @return a pointer to the thread's file name, if there are problems accessing
+  the file name then NULL will be returned
+  */
+const TDesC* DProcessTracker::GetFileName(DThread* aThread) const
+	{
+	//check if the thread is NULL and return if so
+	if(!aThread)
+		{
+		return NULL;
+		}
+
+	//get the owning process and return if it is NULL
+	DProcess* process = aThread->iOwningProcess;
+	if(!process)
+		{
+		return NULL;
+		}
+
+	//get the process' code seg and return if it is NULL
+	DCodeSeg* codeSeg = process->iCodeSeg;
+	if(!codeSeg)
+		{
+		return NULL;
+		}
+
+	//return the code seg's stored file name (which could theoretically be NULL)
+	return codeSeg->iFileName;
+	}
+
+/**
+If any agent has called AttachToAll, return the most recently attached one.
+*/
+DDebugAgent* DProcessTracker::GetCurrentAgentAttachedToAll() const
+	{
+	if (iAgentsAttachedToAll.Count() > 0)
+		{
+		return iAgentsAttachedToAll[iAgentsAttachedToAll.Count()-1];
+		}
+	else
+		{
+		return NULL;
+		}
+	}
+
+/**
+Returns ETrue if at least one agent was found for this process (either a specifically-attached 
+one or a current attached to all). Search specifically attached first, since these have 
+priority over attach all.
+*/
+TBool DProcessTracker::NotifyAgentsForProcessEvent(const TDesC8& aProcessName, const TDriverEventInfo& aEvent, TBool aAllowFuzzy)
+	{
+	TBool foundAgent = EFalse;
+
+	DTargetProcess* process = FindProcess(aProcessName);
+	if (process == NULL && aAllowFuzzy)
+		{
+		process = FuzzyFindProcess(aProcessName);
+		}
+
+	if (process)
+		{
+		LOG_MSG3("DProcessTracker::NotifyAgentsForProcessEvent name=%S eventtype=%d", 
+			&aProcessName, aEvent.iEventType);
+		process->NotifyEvent(aEvent);
+		return ETrue;
+		}
+
+	// Since no specifically attached agents were found, try the attach all
+
+	DDebugAgent* currentAll = GetCurrentAgentAttachedToAll();
+	if (currentAll)
+		{
+		foundAgent = ETrue;
+		LOG_MSG4("DProcessTracker::NotifyAgentsForProcessEvent via AttachAll name=%S eventtype=%d, agent 0x%lx", 
+			&aProcessName, aEvent.iEventType, currentAll->Id());
+		currentAll->NotifyEvent(aEvent);
+		}
+
+	return foundAgent;
+	}
+
+/**
+ * Find the agent that matches this exe/proc name. Name could be the attachall indicator "*", 
+ * in which case it returns the agent that matched the pid from the attach all list
+ */
+DDebugAgent* DProcessTracker::FindAgentForProcessAndId(const TDesC8& aProcessName, TUint64 aAgentId) const
+	{
+
+	if (aProcessName == _L8("*"))
+		{
+		TInt const agentCount = iAgentsAttachedToAll.Count();
+		
+		LOG_MSG3("FindAgentForProcessAndId : Searching for agent id 0x%lx, iAgentsAttachedToAll size=%d", 
+			aAgentId, agentCount );
+		
+		// Then check the attached to all list. Should not have more than one entry
+		// for each agent, but just in case we search backwards to match the append
+		//
+		for (TInt i = agentCount - 1 ; i >= 0; i--)
+			{
+			DDebugAgent* agent = iAgentsAttachedToAll[i];
+			if (agent->Id() == aAgentId)
+				{
+				return agent;
+				}
+			}
+		}
+	else
+		{
+		DTargetProcess* process = FindProcess(aProcessName);
+		if (process)
+			{
+			return process->Agent(aAgentId);
+			}
+		}
+	return NULL;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/src/d_rmd_breakpoints.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,1816 @@
+// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+//
+
+
+#include <e32def.h>
+#include <e32def_private.h>
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include <u32std.h>
+#include <kernel/kernel.h>
+#include <kernel/kern_priv.h>
+#include <nk_trace.h>
+#include <arm.h>
+#include <kernel/cache.h>
+#include <platform.h>
+#include <nkern.h>
+#include <u32hal.h>
+
+#include <rm_debug_api.h>
+#include "d_rmd_breakpoints.h"
+#include "d_process_tracker.h"
+#include "d_rmd_stepping.h"
+#include "rm_debug_kerneldriver.h"	// needed to access DRM_DebugChannel
+#include "rm_debug_driver.h"
+#include "debug_utils.h"
+#include "debug_logging.h"
+
+using namespace Debug;
+
+/* @internalTechnology
+ *
+ * Checks whether aAddress is correctly aligned for placing a breakpoint of
+ * cpu architecture aMode.
+ *
+ * @param aAddress - Virtual memory address to check
+ * @param aMode - The CPU architecture mode of the breakpoint to be placed at aAddress
+ * @return ETrue if aAddress is suitably aligned, EFalse otherwise.
+ */
+TBool D_RMD_Breakpoints::Aligned(TUint32 aAddress, Debug::TArchitectureMode aMode)
+	{
+	switch(aMode)
+		{
+		case Debug::EArmMode:
+			// ARM breakpoints must be 32-bit aligned (lower two bits must be zero)
+			if (aAddress & 0x3)
+			{
+				// Not 32-bit aligned.
+				return EFalse;
+			}
+			break;
+		case Debug::EThumbMode:
+			// Thumb breakpoints must be 16-bit aligned (low bit must be zero)
+			if (aAddress & 0x1)
+			{
+				// Not 16-bit aligned
+				return EFalse;
+			}
+			break;
+		case Debug::EThumb2EEMode:
+			// Thumb-EE instructions are half-word aligned. See ARM ARM DDI0406A, section A3.2 Alignment Support
+			// Note that some instructions need to be word-aligned, but this function does not know which ones.
+			// It may also depend on the System Control register U bit.
+			if (aAddress & 0x1)
+			{
+				// Not 16-bit aligned
+				return EFalse;
+			}
+			break;
+		default:
+			{
+			// No idea
+			return EFalse;
+			}
+		}
+
+	// Must be OK
+	return ETrue;
+	};
+
+/* @internalTechnology
+ *
+ * Returns the size of a breakpoint of architecture aMode in bytes
+ * 
+ * @param aMode - The architure of the breakpoint
+ * @return The size of the breakpoints in bytes. 0 if un-recognised architecture.
+ */
+TInt D_RMD_Breakpoints::BreakSize(Debug::TArchitectureMode aMode)
+	{
+	switch(aMode)
+		{
+		case Debug::EArmMode:
+			{
+				return 4;
+			}
+		case Debug::EThumbMode:
+			{
+				return 2;
+			}
+		case Debug::EThumb2EEMode:
+			{
+			// Only needs to be two bytes in size.
+			return 2;
+			}
+		default:
+			{
+				// No idea
+				return 0;
+			}
+		}
+	};
+
+/* @internalTechnology
+ *
+ * Checks whether two TBreakEntrys overlap
+ *
+ * @param aFirst - A TBreakEntry with valid iAddress and iMode fields.
+ * @param aSecond  - A TBreakEntry with valid iAddress and iMode fields.
+ * @return ETrue if the aFirst and aSecond overlap or the overlap cannot be determined
+ *         , EFalse otherwise
+ */
+TBool D_RMD_Breakpoints::BreakpointsOverlap(TBreakEntry& aFirst, TBreakEntry& aSecond)
+	{
+	TInt firstSize = BreakSize(aFirst.iMode);
+	TInt secondSize = BreakSize(aSecond.iMode);
+
+	// Do we know the size of each breakpoint?
+	if ((firstSize <= 0) || (secondSize <= 0))
+		{
+		// We don't know the size of the breakpoint, so assume they overlap
+		return ETrue;
+		}
+
+	TInt firstStartAddress = aFirst.iAddress;
+	TInt secondStartAddress = aSecond.iAddress;
+	TInt firstEndAddress = firstStartAddress + firstSize - 1;
+	TInt secondEndAddress = secondStartAddress + secondSize - 1;
+
+	// If second breakpoint is past the end of the first then we're ok
+	if(firstEndAddress < secondStartAddress)
+		{
+		return EFalse;
+		}
+
+	// If first breakpoint is past the end of the second then we're ok
+	if(secondEndAddress < firstStartAddress)
+		{
+		return EFalse;
+		}
+
+	// The breakpoints overlap
+	return ETrue;
+	}
+
+/* @internalTechnology
+ * 
+ * Returns the breakpoint bitpattern to use for each architecture type
+ *
+ * @param aMode - the cpu architecture type
+ * @return The bit-pattern to use for the specified architecture, or 0 if unsupported.
+ */
+TUint32 D_RMD_Breakpoints::BreakInst(Debug::TArchitectureMode aMode)
+	{
+	switch(aMode)
+		{
+		case Debug::EArmMode:
+			{
+				return KArmBreakPoint;
+			}
+		case Debug::EThumbMode:
+			{
+				return KThumbBreakPoint;
+			}
+		case Debug::EThumb2EEMode:
+			{
+			return KT2EEBreakPoint;
+			}
+		default:
+			{
+				// No idea what the breakpoint should be
+				return 0;
+			}
+		}
+	};
+
+/**
+Constructor. Initialises its internal list of empty breakpoints.
+*/
+D_RMD_Breakpoints::D_RMD_Breakpoints(DRM_DebugChannel* aChannel)
+: iBreakPointList(NUMBER_OF_TEMP_BREAKPOINTS, 0),
+  iNextBreakId(NUMBER_OF_TEMP_BREAKPOINTS),
+  iChannel(aChannel),
+  iInitialised(EFalse)
+	{
+	iBreakPointList.Reset();	
+	TBreakEntry emptyTempBreak;
+	
+	for (TInt i = 0; i < NUMBER_OF_TEMP_BREAKPOINTS; i++)
+		{
+		emptyTempBreak.iBreakId = i;
+		
+		if (KErrNone != iBreakPointList.Append(emptyTempBreak))
+			{
+			LOG_MSG("D_RMD_Breakpoints::D_RMD_Breakpoints() - Error appending blank temp break entry");
+			}
+		}
+	}
+
+/**
+Destructor. Clears all the breakpoints in the system, deletes its internal list of breakpoints,
+and closes the exclusivity semaphore.
+*/
+D_RMD_Breakpoints::~D_RMD_Breakpoints()
+	{
+	ClearAllBreakPoints();
+	
+	// close the breakpoint list and free the memory associated with it
+	iBreakPointList.Close();
+
+	if (iLock)
+		iLock->Close(NULL);
+	}
+
+/**
+Initialises the breakpoint list exclusion semaphore. This should be called once immediately after
+the constructor.
+
+@return KErrNone if successful, one of the other system wide error codes otherwise.
+*/
+TInt D_RMD_Breakpoints::Init()
+	{
+	TInt err = KErrNone;
+
+	// Only create a semaphore if we are not initialised
+	if(!iInitialised)
+		{
+		// Initialise the semaphore ensuring exclusive access to the breakpoint list
+		err = Kern::SemaphoreCreate(iLock, _L("RM_DebugBreakpointLock"), 1 /* Initial count */);
+		if (err == KErrNone)
+			{
+			iInitialised = ETrue;
+			}
+		}
+	else
+		{
+		err = KErrNone;
+		}
+
+	return err;
+	}
+
+/** 
+Public member function which sets a thread-specific breakpoint in the specified thread
+and returns an opaque handle to the caller.
+
+Note 1:
+This function ensures exclusive access to the breakpoint data structures
+by using a semaphore to serialise access.
+
+@see priv_DoSetBreak
+
+Note 2:
+As implied by Note 1, the caller must have previously called Init() or this
+function will return KErrNotReady;
+ 
+@param aBreakId - Reference to a TUint32 into which the function will return a unique breakpoint Id.
+@param aThreadId - The thread Id in which to place the breakpoint
+@param aAddress - Address to place the breakpoint
+@param aMode - The cpu instruction set architecture type breakpoint (e.g. EArmMode or EThumbMode)
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt D_RMD_Breakpoints::DoSetBreak(TInt32 &aBreakId, const TUint64 aId, const TBool aThreadSpecific, const TUint32 aAddress, const TArchitectureMode aMode)
+	{
+	// Ensure we have a valid semaphore
+	if (!iInitialised || !iLock)
+		{
+		return KErrNotReady;
+		}
+
+	// Acquire the lock
+	NKern::ThreadEnterCS();
+	Kern::SemaphoreWait(*iLock);
+
+	// Really do the work
+	TInt err = priv_DoSetBreak(aBreakId, aId, aThreadSpecific, aAddress,aMode);
+	
+	// Release the lock
+	Kern::SemaphoreSignal(*iLock);
+	NKern::ThreadLeaveCS();
+	
+	return err;
+	}
+/**
+Private member function which sets a thread-specific breakpoint in the specified thread
+and returns an opaque handle to the caller.
+
+@see DoSetBreak
+
+@param aBreakId - Reference to a TUint32 into which the function will return a unique breakpoint Id.
+@param aThreadId - The thread Id in which to place the breakpoint
+@param aAddress - Address to place the breakpoint
+@param aMode - The cpu instruction set architecture type breakpoint (e.g. EArmMode or EThumbMode)
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt D_RMD_Breakpoints::priv_DoSetBreak(TInt32 &aBreakId, const TUint64 aId, const TBool aThreadSpecific, const TUint32 aAddress, const TArchitectureMode aMode)
+	{
+	LOG_MSG4("D_RMD_Breakpoints::priv_DoSetBreak(aThreadId = 0x%lx, aAddress = 0x%08x, aMode = %d)",aId,aAddress,aMode);
+
+	// EThumb2EEMode breakpoints are not supported
+	if (EThumb2EEMode == aMode)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoSetBreak() - EThumb2EEMode breakpoints are not supported");
+		return KErrNotSupported;
+		}
+
+	// Check how many breakpoints we have in existence
+	if ((iBreakPointList.Count()+1) >= NUMBER_OF_MAX_BREAKPOINTS)
+		{
+		// Too many breakpoints are set!
+		LOG_MSG("D_RMD_Breakpoints::priv_DoSetBreak() - Too many breakpoints set");
+		return KErrOverflow;
+		}
+
+	// check the alignment of the breakpoint
+	if (!Aligned(aAddress,aMode))
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoSetBreak() - Unaligned address");
+		return KErrArgument;
+		}
+
+	// make sure there is not already a breakpoint at this address
+	for (TInt i = NUMBER_OF_TEMP_BREAKPOINTS; i < iBreakPointList.Count(); i++)
+		{
+		/* We need to check if the breakpoint overlaps the address at all,
+		 * and this depends upon the size of the two breakpoints as well as 
+		 * their address.
+		 */
+
+		// newInstSize = size in bytes of new breakpoint
+		TInt newInstSize = BreakSize(aMode);
+		if (newInstSize == 0)
+			{
+			LOG_MSG("D_RMD_Breakpoints::priv_DoSetBreak() - Unknown architecture type for new breakpoint");
+			return KErrNotSupported;
+			}
+
+		// oldInstSize = size in bytes of the existing breakpoint
+		TInt oldInstSize = BreakSize(iBreakPointList[i].iMode);
+		if (oldInstSize == 0)
+			{
+			LOG_MSG("D_RMD_Breakpoints::priv_DoSetBreak() - : Unknown architecture type of existing breakpoint");
+			return KErrNotSupported;
+			}
+
+		// Overlap checking - temp is used as the new breakpoint description for checking purposes only
+		TBreakEntry temp;
+
+		temp.iAddress = aAddress;
+		temp.iMode = aMode;
+
+		// do they overlap?
+		if ( BreakpointsOverlap(temp,iBreakPointList[i]) )
+			{
+			// Yes
+			if(iBreakPointList[i].iThreadSpecific && aThreadSpecific)
+				{
+				if(aId == iBreakPointList[i].iId)
+					{
+					LOG_MSG("D_RMD_Breakpoints::priv_DoSetBreak() - New thread specific breakpoint overlaps an existing thread specific breakpoint");
+					return KErrAlreadyExists;
+					}
+				}
+			else if(!iBreakPointList[i].iThreadSpecific && aThreadSpecific)
+				{
+				NKern::ThreadEnterCS();
+				DThread* thread = DebugUtils::OpenThreadHandle(aId);
+				TInt err = KErrNone;
+				if (!thread)
+					{
+					err = KErrNotFound;
+					}
+				if (!err && thread->iOwningProcess->iId == iBreakPointList[i].iId)
+					{
+					LOG_MSG("D_RMD_Breakpoints::priv_DoSetBreak() - New thread specific breakpoint overlaps an existing breakpoint");
+					err = KErrAlreadyExists;
+					}
+				thread->Close(NULL);
+				NKern::ThreadLeaveCS();
+				if (err) return err;
+				}
+			else if(iBreakPointList[i].iThreadSpecific && !aThreadSpecific)
+				{
+				NKern::ThreadEnterCS();
+				DThread* thread = DebugUtils::OpenThreadHandle(iBreakPointList[i].iId);
+				TInt err = KErrNone;
+				if (!thread)
+					{
+					err = KErrNotFound;
+					}
+				if (!err && thread->iOwningProcess->iId == aId)
+					{
+					LOG_MSG("D_RMD_Breakpoints::priv_DoSetBreak() - New breakpoint overlaps an existing thread specific breakpoint");
+					err = KErrAlreadyExists;
+					}
+				if (thread) thread->Close(NULL);
+				NKern::ThreadLeaveCS();
+				if (err) return err;
+				}
+			else // !iBreakPointList[i].iThreadSpecific && !aThreadSpecific
+				{
+				if(iBreakPointList[i].iId == aId)
+					{
+					LOG_MSG("D_RMD_Breakpoints::priv_DoSetBreak() - New breakpoint overlaps an existing breakpoint");
+					return KErrAlreadyExists;
+					}
+				}
+			}
+		}
+
+	// increment the break id
+	aBreakId = iNextBreakId++;	
+
+	// create the new breakpoint entry
+	TBreakEntry breakEntry(aBreakId, aId, aThreadSpecific, aAddress, aMode);
+
+	TInt err = priv_DoEnableBreak(breakEntry, ETrue);
+	if (KErrNone != err)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoSetBreak() - Could not enable the breakpoint");
+		
+		return err;
+		}
+
+	err = iBreakPointList.Append(breakEntry);
+	if (err != KErrNone)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoSetBreak() - Failed to append breakpoint");
+		}
+
+	LOG_MSG2("D_RMD_Breakpoints::priv_DoSetBreak(breakId = 0x%08x) done",aBreakId);
+
+	return err;
+	}
+
+/**
+Public member function which enables a previously set breakpoint.
+
+Note 1:
+This function ensures exclusive access to the breakpoint data structures
+by using a semaphore to serialise access.
+
+@see priv_DoEnableBreak
+
+Note 2:
+As implied by Note 1, the caller must have previously called Init() or this
+function will return KErrNotReady;
+
+Note 3
+Historically, this function accepted a reference to a TBreakEntry in the class' own
+iBreakPointList. It now checks whether the reference is to an element of its own list,
+or one invented by the caller.
+
+@param aEntry reference to a TBreakEntry datastructure describing the breakpoint to be re-enabled.
+@param aSaveOldInstruction ETrue preserves the instruction at the breakpoint address, EFalse otherwise.
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt D_RMD_Breakpoints::DoEnableBreak(TBreakEntry &aEntry, TBool aSaveOldInstruction)
+	{
+	// Ensure we have a valid semaphore
+	if (!iInitialised || !iLock)
+		{
+		return KErrNotReady;
+		}
+
+	// Acquire the lock
+	NKern::ThreadEnterCS();
+	Kern::SemaphoreWait(*iLock);
+
+	// Really do the work
+	TInt err = priv_DoEnableBreak(aEntry,aSaveOldInstruction);
+	
+	// Release the lock
+	Kern::SemaphoreSignal(*iLock);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/**
+Private member function which enables a previously set breakpoint, as per DoEnableBreak, but
+does not serialise access.
+
+@see DoEnableBreak
+
+@param aEntry reference to a TBreakEntry datastructure describing the breakpoint to be re-enabled.
+@param aSaveOldInstruction ETrue preserves the instruction at the breakpoint address, EFalse otherwise.
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt D_RMD_Breakpoints::priv_DoEnableBreak(TBreakEntry &aEntry, TBool aSaveOldInstruction)
+	{
+	LOG_MSG("D_RMD_Breakpoints::DoEnableBreak()");
+
+	TUint32 inst = BreakInst(aEntry.iMode);	
+	TInt instSize = BreakSize(aEntry.iMode);
+	if (instSize == 0 || inst == 0)
+		{
+		// not supported
+		LOG_MSG("D_RMD_Breakpoints::priv_DoEnableBreak - unsupported breakpoint architecture");
+		return KErrNotSupported;
+		}
+
+	TInt err = KErrNone;
+
+	// Get thread id
+	TUint64 threadId = aEntry.iId + (aEntry.iThreadSpecific ? 0 : 1);
+	NKern::ThreadEnterCS();
+	DThread* threadObj = DebugUtils::OpenThreadHandle(threadId);
+	if (!threadObj)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoEnableBreak - bad handle. Could not identify a threadObj");
+		NKern::ThreadLeaveCS();
+		return KErrBadHandle;
+		}
+
+	if (aSaveOldInstruction)
+		{
+		TUint32 instruction;
+
+		// read the instruction at the address so we can store it in the break entry for when we clear this breakpoint
+		// trap exceptions in case the address is invalid
+		XTRAPD(r, XT_DEFAULT, err = iChannel->TryToReadMemory(threadObj, (TAny *)aEntry.iAddress, (TAny *)&instruction, instSize));
+
+		//consider the leave as more important than the error code so store the leave if it's not KErrNone
+		if(KErrNone != r)
+			{
+			err = r;
+			}
+
+		if(KErrNone != err)
+			{
+			threadObj->Close(NULL);
+			NKern::ThreadLeaveCS();
+			LOG_MSG("D_RMD_Breakpoints::priv_DoEnableBreak() - failed to read memory");
+			return err;
+			}
+
+		aEntry.iInstruction.Copy((TUint8 *)&instruction, instSize);
+		}
+
+	TBool breakpointAlredySet = EFalse;
+	for (TInt i = NUMBER_OF_TEMP_BREAKPOINTS; i < iBreakPointList.Count(); i++)
+		{
+		if(iBreakPointList[i].iAddress == aEntry.iAddress && !iBreakPointList[i].iDisabledForStep )
+			{
+			breakpointAlredySet = ETrue;
+			break;
+			}
+		}
+	if(!breakpointAlredySet)
+		{
+	
+		LOG_MSG5("D_RMD_Breakpoints::DoEnableBreak() tId=0x%x, addr=0x%x, instSize=%d, inst=0x%x", 
+			threadObj->iId, aEntry.iAddress, instSize, instSize == 4 ? (TUint32)inst : (TUint16)inst );
+		XTRAPD(r, XT_DEFAULT, err = DebugSupport::ModifyCode(threadObj, aEntry.iAddress, instSize, inst, DebugSupport::EBreakpointGlobal));
+		if(r != DebugSupport::EBreakpointGlobal)
+			{
+			err = r;
+			}
+		}
+	else
+		{
+		LOG_MSG5("D_RMD_Breakpoints::DoEnableBreak() ALREADY SET: tId=0x%x, addr=0x%x, instSize=%d, inst=0x%x", 
+				threadObj->iId, aEntry.iAddress, instSize, instSize == 4 ? (TUint32)inst : (TUint16)inst );
+
+		}
+
+	// Close the thread handle which has been opened by OpenThreadHandle
+	threadObj->Close(NULL);
+	NKern::ThreadLeaveCS();
+	return err;
+	}
+
+/**
+Public member function which clears a previously set breakpoint.
+
+Note 1:
+This function ensures exclusive access to the breakpoint data structures
+by using a semaphore to serialise access.
+
+@see priv_DoClearBreak
+
+Note 2:
+As implied by Note 1, the caller must have previously called Init() or this
+function will return KErrNotReady;
+
+@param aBreakId A breakpoint Id as previously returned by DoSetBreak.
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt D_RMD_Breakpoints::DoClearBreak(const TInt32 aBreakId, TBool aIgnoreTerminatedThreads)
+	{
+	// Ensure we have a valid semaphore
+	if (!iInitialised || !iLock)
+		{
+		return KErrNotReady;
+		}
+
+	// Acquire the lock
+	NKern::ThreadEnterCS();
+	Kern::SemaphoreWait(*iLock);
+
+	// Really do the work
+	TInt err = priv_DoClearBreak(aBreakId, aIgnoreTerminatedThreads);
+	
+	// Release the lock
+	Kern::SemaphoreSignal(*iLock);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/**
+Private member function which clears a previously set breakpoint, as per DoClearBreak, but
+does not serialise access.
+
+@see DoClearBreak
+
+@param aBreakId A breakpoint Id as previously returned by DoSetBreak.
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt D_RMD_Breakpoints::priv_DoClearBreak(const TInt32 aBreakId, TBool aIgnoreTerminatedThreads)
+	{
+	LOG_MSG3("D_RMD_Breakpoints::priv_DoClearBreak(0x%08x), aIgnoreTerminatedThreads=%d",
+	        aBreakId, aIgnoreTerminatedThreads);
+
+	// find the break entry matching this id.  note that the breakpoints are already sorted in ascending order by id
+	TBreakEntry entry;
+	entry.iBreakId = aBreakId;
+	TInt index = iBreakPointList.FindInSignedKeyOrder(entry);
+
+	TInt err = KErrNone;
+	if (index >= 0)
+		{	
+ 		// if this breakpoint was set in a library and that library has already been unloaded, don't try to clear it
+		if (!iBreakPointList[index].iObsoleteLibraryBreakpoint)
+			{
+			NKern::ThreadEnterCS();
+			DThread* threadObj = DebugUtils::OpenThreadHandle(iBreakPointList[index].iId + (iBreakPointList[index].iThreadSpecific ? 0 : 1));
+			if (threadObj)
+				{
+				LOG_MSG2("priv_DoClearBreak() OpenThreadHandle ret thread 0x%08x", threadObj->iId );
+				TBool needToCallCodeModifier = ETrue;
+				for (TInt i = NUMBER_OF_TEMP_BREAKPOINTS; i < iBreakPointList.Count(); i++)
+					{
+					if (i != index)
+						{
+						if ( BreakpointsOverlap(iBreakPointList[index],iBreakPointList[i]) )
+							{
+							needToCallCodeModifier = EFalse;
+							break;
+							}
+						}
+					}
+				if(needToCallCodeModifier)
+					{
+					XTRAPD(r, XT_DEFAULT, err = DebugSupport::RestoreCode(threadObj, iBreakPointList[index].iAddress));
+					if (r != KErrNone)
+						{
+						LOG_MSG2("D_RMD_Breakpoints::priv_DoClearBreak() - restore code trap harness returned error %d",r);
+						}
+					if (err == KErrNotFound)
+						{
+						LOG_MSG("restore code reported the breakpoint not found, continuing");
+						err = KErrNone;
+						}
+					else if (err != KErrNone)
+						{
+						LOG_MSG2("D_RMD_Breakpoints::priv_DoClearBreak() - restore code returned error %d",err);
+						}
+					err = (KErrNone == r) ? err : r;
+					}
+
+				// Close the thread handle opened by OpenThreadHandle
+				threadObj->Close(NULL);
+				}
+			else
+				{
+				LOG_MSG("D_RMD_Breakpoints::OpenThreadHandle ret null thread");
+				err = KErrBadHandle;
+				}
+			NKern::ThreadLeaveCS();
+			}
+		
+		LOG_MSG4("D_RMD_Breakpoints::priv_DoClearBreak() - Clearing breakpoint at address: %x, err: %d, ignore terminated: %d", iBreakPointList[index].iAddress, err, aIgnoreTerminatedThreads?1:0);
+		if ((aIgnoreTerminatedThreads && KErrBadHandle == err) || KErrNone == err)
+			{
+			// if this is a temp breakpoint, just clear out the values, otherwise remove it from the list
+			err = KErrNone;
+			if (index < NUMBER_OF_TEMP_BREAKPOINTS)
+				{
+                // if this is a temp breakpoint, just clear out the values, otherwise remove it from the list
+                LOG_MSG2("D_RMD_Breakpoints::priv_DoClearBreak() - Reseting temp breakpoint[%d]",index);
+				iBreakPointList[index].Reset();
+				}
+			else
+				{
+				LOG_MSG2("D_RMD_Breakpoints::priv_DoClearBreak() - Removing breakpoint[%d]",index);
+				iBreakPointList.Remove(index);
+				}			
+			}
+		else
+		    {
+            LOG_MSG3("D_RMD_Breakpoints::priv_DoClearBreak() - *** Not removing breakpoint[%d] due to error=%d",index, err);
+		    }
+				
+		return err;
+		}
+
+	LOG_MSG2("D_RMD_Breakpoints::priv_DoClearBreak() - Break Id %d not found", aBreakId);
+
+	return KErrNotFound;
+	}
+
+/**
+Public member function which modifies a previously set breakpoint.
+
+Note 1:
+This function ensures exclusive access to the breakpoint data structures
+by using a semaphore to serialise access.
+
+@see priv_DoModifyBreak
+
+Note 2:
+As implied by Note 1, the caller must have previously called Init() or this
+function will return KErrNotReady;
+
+@param aBreakInfo A TModifyBreakInfo describing the breakpoint properties that are wanted.
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt D_RMD_Breakpoints::DoModifyBreak(TModifyBreakInfo* aBreakInfo)
+	{
+	// Ensure we have a valid semaphore
+	if (!iInitialised || !iLock)
+		{
+		return KErrNotReady;
+		}
+
+	// Acquire the lock
+	NKern::ThreadEnterCS();
+	Kern::SemaphoreWait(*iLock); 
+
+	// Really do the work
+	TInt err = priv_DoModifyBreak(aBreakInfo);
+	
+	// Release the lock
+	Kern::SemaphoreSignal(*iLock);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/**
+Private member function which modifies a previously set breakpoint, as per DoModifyBreak, but
+does not serialise access.
+
+@see DoModifyBreak
+
+@param aBreakInfo A TModifyBreakInfo describing the breakpoint properties that are wanted.
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt D_RMD_Breakpoints::priv_DoModifyBreak(TModifyBreakInfo* aBreakInfo)
+	{
+	LOG_MSG("D_RMD_Breakpoints::priv_DoModifyBreak()");
+
+	// Check arguments
+	if (!aBreakInfo)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoModifyBreak() was passed a NULL argument");
+		return KErrArgument;
+		}
+
+	//User side memory is not accessible directly
+	TSetBreakInfo info;
+	TInt err = Kern::ThreadRawRead(iChannel->iClientThread, aBreakInfo, (TUint8*)&info, sizeof(TSetBreakInfo));
+	if (err != KErrNone)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoModifyBreak() was passed a bad argument");
+		return err;
+		}
+
+	// EThumb2EEMode breakpoints are not supported
+	if (EThumb2EEMode == info.iMode)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoModifyBreak() - EThumb2EEMode breakpoints are not supported");
+		return KErrNotSupported;
+		}
+
+	// find the break entry matching this id.  note that the breakpoints are already sorted in ascending order by id
+	TBreakEntry entry;
+	entry.iBreakId = (TUint32)info.iBreakId;
+	TInt index = iBreakPointList.FindInSignedKeyOrder(entry);
+	if (index < 0)
+		{
+		// Could not find the breakpoint
+		LOG_MSG2("D_RMD_Breakpoints::priv_DoModifyBreak() - Could not find the breakpoint id 0x%08x",(TUint32)info.iBreakId);
+		return KErrNotFound;
+		}
+
+	// first check its not obsolete
+	if (!iBreakPointList[index].iObsoleteLibraryBreakpoint)
+		{
+		// its still a valid breakpoint
+
+		// remove the old breakpoint
+		NKern::ThreadEnterCS();
+		DThread* threadObj = DebugUtils::OpenThreadHandle(iBreakPointList[index].iId);
+		if (threadObj)
+			{
+			LOG_MSG2("D_RMD_Breakpoints::priv_DoModifyBreak - Unsetting breakpoint at address 0x%08x",iBreakPointList[index].iAddress);
+
+			XTRAPD(r, XT_DEFAULT, err = DebugSupport::RestoreCode(threadObj, iBreakPointList[index].iAddress));
+			if (r != 0)
+				{
+				LOG_MSG("Failed to construct trap handler for DebugSupport::RestoreCode");
+				}
+
+			// Close the thread handle which has been opened by OpenThreadHandle
+			threadObj->Close(NULL);
+			NKern::ThreadLeaveCS();
+			}
+		else
+			{
+			// Bad handle
+			LOG_MSG("D_RMD_Breakpoints::priv_DoModifyBreak - Could not identify the breakpoint thread id");
+			NKern::ThreadLeaveCS();
+			return KErrBadHandle;
+			}
+		}
+
+	// make sure there is not already a breakpoint at the new address
+	for (TInt i = NUMBER_OF_TEMP_BREAKPOINTS; i < iBreakPointList.Count(); i++)
+		{
+		// Ignore data for the breakpoint entry being modified.
+		if (i != index)
+			{
+			/* We need to check if the breakpoint overlaps the address at all,
+			 * and this depends upon the size of the two breakpoints as well as 
+			 * their address.
+			 */
+
+			// newInstSize = size in bytes of new breakpoint
+			TInt newInstSize = BreakSize(info.iMode);
+			if (newInstSize == 0)
+			{
+				LOG_MSG("D_RMD_Breakpoints::priv_DoModifyBreak - Unknown architecture type for new breakpoint");
+				return KErrNotSupported;
+			}
+
+			// oldInstSize = size in bytes of the existing breakpoint
+			TInt oldInstSize = BreakSize(iBreakPointList[i].iMode);
+			if (oldInstSize == 0)
+			{
+				LOG_MSG("D_RMD_Breakpoints::priv_DoModifyBreak - Unknown architecture type of existing breakpoint");
+				return KErrNotSupported;
+			}
+
+			// Overlap checking - temp is used as the new breakpoint description for checking purposes only
+			TBreakEntry temp;
+
+			temp.iAddress = info.iAddress;
+			temp.iMode = info.iMode;
+
+			// do they overlap?
+			if ( BreakpointsOverlap(temp,iBreakPointList[i]) )
+				{
+				// Yes
+				LOG_MSG("D_RMD_Breakpoints::priv_DoModifyBreak() - New breakpoint overlaps an existing breakpoint");
+				return KErrAlreadyExists;
+				}
+			}
+		}
+
+	// Prepare iBreakPointList[index] with the new information, then set the breakpoint
+	iBreakPointList[index].iId = info.iId;
+	iBreakPointList[index].iAddress = info.iAddress;
+	iBreakPointList[index].iMode = info.iMode;
+
+	TBreakEntry& newBreakEntry = iBreakPointList[index];
+
+	// Decide the size of the breakpoint instruction
+	TUint32 inst = BreakInst(newBreakEntry.iMode);
+	TInt instSize = BreakSize(newBreakEntry.iMode);
+
+	if (inst == 0 || instSize == 0)
+		{
+		// Unsupported architecture
+		LOG_MSG("D_RMD_Breakpoints::priv_DoModifyBreak - unsupported breakpoint architecture");
+		return KErrNotSupported;
+		}
+
+
+	//if thread id is 0xFFFFFFFF, then the breakpoint is not thread specific
+	if (newBreakEntry.iId != 0xFFFFFFFF)
+		{
+		newBreakEntry.iThreadSpecific = ETrue;
+		}
+
+	// Get thread id from the process that we are debugging
+	TProcessInfo * proc = NULL;
+	TUint64 threadId = NULL;
+
+	threadId = newBreakEntry.iId;
+
+	NKern::ThreadEnterCS();
+	DThread* threadObj = DebugUtils::OpenThreadHandle(threadId);
+	//if we don't have the right thread id for the address, 
+	//then try with the thread id of the process that we are debugging 	
+	if (!threadObj && iChannel->iDebugProcessList.Count())
+		{
+		proc = &iChannel->iDebugProcessList[0];
+		if (proc)
+			{
+			threadId = proc->iId+1;	
+			}
+		threadObj = DebugUtils::OpenThreadHandle(threadId);
+		}
+
+	if(!threadObj)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoModifyBreak() - bad handle. Could not identify a threadObj");
+		NKern::ThreadLeaveCS();
+		return KErrBadHandle;
+		}
+
+	// save the old instruction
+	TUint32 instruction;
+
+	// read the instruction at the address so we can store it in the break entry for when we clear this breakpoint
+	// trap exceptions in case the address is invalid
+	XTRAPD(r, XT_DEFAULT, err = iChannel->TryToReadMemory(threadObj, (TAny *)newBreakEntry.iAddress, (TAny *)&instruction, instSize));
+
+	//consider the leave as more important than the error code so store the leave if it's not KErrNone
+	if(KErrNone != r)
+		{
+		err = r;
+		}
+	if(KErrNone != err)
+		{
+		threadObj->Close(NULL);
+		NKern::ThreadLeaveCS();
+		return err;
+		}
+
+	newBreakEntry.iInstruction.Copy((TUint8 *)&instruction, instSize);
+
+	newBreakEntry.iId = threadId; //set the thread ID here 
+	LOG_MSG3("ModifyCode2 instSize:%d, inst: 0x%08x", instSize, inst);
+	XTRAPD(s, XT_DEFAULT, err = DebugSupport::ModifyCode(threadObj, newBreakEntry.iAddress, instSize, inst, DebugSupport::EBreakpointGlobal));
+	if(s != DebugSupport::EBreakpointGlobal)
+		{
+		err = s;
+		}
+
+	// Close the thread handle which has been opened by OpenThreadHandle
+	threadObj->Close(NULL);
+	NKern::ThreadLeaveCS();
+	return err;
+	}	
+
+//
+// D_RMD_Breakpoints::DoModifyProcessBreak
+//
+TInt D_RMD_Breakpoints::DoModifyProcessBreak(TModifyProcessBreakInfo* aBreakInfo)
+	{
+	// Ensure we have a valid semaphore
+	if (!iInitialised || !iLock)
+		{
+		return KErrNotReady;
+		}
+
+	// Acquire the lock
+	NKern::ThreadEnterCS();
+	Kern::SemaphoreWait(*iLock); 
+
+	// Really do the work
+	TInt err = priv_DoModifyProcessBreak(aBreakInfo);
+	
+	// Release the lock
+	Kern::SemaphoreSignal(*iLock);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+	
+TInt D_RMD_Breakpoints::priv_DoModifyProcessBreak(TModifyProcessBreakInfo* aBreakInfo)
+	{	
+	LOG_MSG("D_RMD_Breakpoints::priv_DoModifyProcessBreak()");
+
+	// Check arguments
+	if (!aBreakInfo)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoModifyProcessBreak() was passed a NULL argument");
+		return KErrArgument;
+		}
+
+	//User side memory is not accessible directly
+	TSetBreakInfo info;
+	TInt err = Kern::ThreadRawRead(iChannel->iClientThread, aBreakInfo, (TUint8*)&info, sizeof(TModifyProcessBreakInfo));
+	if (err != KErrNone)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoModifyProcessBreak() was passed a bad argument");
+		return err;
+		}
+
+	// EThumb2EEMode breakpoints are not supported
+	if (EThumb2EEMode == info.iMode)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoModifyProcessBreak() - EThumb2EEMode breakpoints are not supported");
+		return KErrNotSupported;
+		}
+
+	// find the break entry matching this id.  note that the breakpoints are already sorted in ascending order by id
+	TBreakEntry entry;
+	entry.iBreakId = (TUint32)info.iBreakId;
+	TInt index = iBreakPointList.FindInSignedKeyOrder(entry);
+	if (index < 0)
+		{
+		// Could not find the breakpoint
+		LOG_MSG2("D_RMD_Breakpoints::priv_DoModifyProcessBreak() - Could not find the breakpoint id 0x%08x",(TUint32)info.iBreakId);
+		return KErrNotFound;
+		}
+
+	// first check its not obsolete
+	if (!iBreakPointList[index].iObsoleteLibraryBreakpoint)
+		{
+		// its still a valid breakpoint
+
+		// remove the old breakpoint
+		NKern::ThreadEnterCS();
+		DProcess *process = DebugUtils::OpenProcessHandle(iBreakPointList[index].iId);
+		DThread* threadObj = NULL;
+		if(process)
+			{
+			threadObj = DebugUtils::OpenFirstThreadForProcess(process);
+			process->Close(NULL);
+			}
+
+		if (threadObj)
+			{
+			LOG_MSG2("D_RMD_Breakpoints::priv_DoModifyProcessBreak() - Unsetting breakpoint at address 0x%08x",iBreakPointList[index].iAddress);
+
+			XTRAPD(r, XT_DEFAULT, /*err =*/ DebugSupport::RestoreCode(threadObj, iBreakPointList[index].iAddress)); // Any error here is not important. The semantics of ModifyBreakpoint are such that if it fails the previous breakpoint location is removed, which means that a further call to ModifyBreakpoint shouldn't fail because the CodeModifier doesn't know about it.
+			if (r != 0)
+				{
+				LOG_MSG("D_RMD_Breakpoints::priv_DoModifyProcessBreak() - Failed to construct trap handler for DebugSupport::RestoreCode");
+				}
+
+			// Close the thread handle which has been opened by OpenThreadHandle
+			threadObj->Close(NULL);
+			}
+		else
+			{
+			// Bad handle
+			LOG_MSG("D_RMD_Breakpoints::priv_DoModifyProcessBreak() - Could not identify the breakpoint process id");
+			err = KErrBadHandle;
+			}
+		NKern::ThreadLeaveCS();
+		if (err) return err;
+		}
+
+	// make sure there is not already a breakpoint at the new address
+	for (TInt i = NUMBER_OF_TEMP_BREAKPOINTS; i < iBreakPointList.Count(); i++)
+		{
+		// Ignore data for the breakpoint entry being modified.
+		if (i != index)
+			{
+			/* We need to check if the breakpoint overlaps the address at all,
+			 * and this depends upon the size of the two breakpoints as well as 
+			 * their address.
+			 */
+
+			// newInstSize = size in bytes of new breakpoint
+			TInt newInstSize = BreakSize(info.iMode);
+			if (newInstSize == 0)
+				{
+				LOG_MSG("D_RMD_Breakpoints::priv_DoModifyProcessBreak() - Unknown architecture type for new breakpoint");
+				return KErrNotSupported;
+				}
+
+			// oldInstSize = size in bytes of the existing breakpoint
+			TInt oldInstSize = BreakSize(iBreakPointList[i].iMode);
+			if (oldInstSize == 0)
+				{
+				LOG_MSG("D_RMD_Breakpoints::priv_DoModifyProcessBreak() - : Unknown architecture type of existing breakpoint");
+				return KErrNotSupported;
+				}
+
+			// Overlap checking - temp is used as the new breakpoint description for checking purposes only
+			TBreakEntry temp;
+
+			temp.iAddress = info.iAddress;
+			temp.iMode = info.iMode;
+
+			// do they overlap?
+			if ( BreakpointsOverlap(temp,iBreakPointList[i]) )
+				{
+				// Yes
+				LOG_MSG("D_RMD_Breakpoints::priv_DoModifyProcessBreak() - New breakpoint overlaps an existing breakpoint");
+				return KErrAlreadyExists;
+				}
+			}
+		}
+
+	// Prepare iBreakPointList[index] with the new information, then set the breakpoint
+	iBreakPointList[index].iId = info.iId;
+	iBreakPointList[index].iAddress = info.iAddress;
+	iBreakPointList[index].iMode = info.iMode;
+
+	TBreakEntry& newBreakEntry = iBreakPointList[index];
+
+	// Decide the size of the breakpoint instruction
+	TUint32 inst = BreakInst(newBreakEntry.iMode);
+	TInt instSize = BreakSize(newBreakEntry.iMode);
+
+	if (inst == 0 || instSize == 0)
+		{
+		// Unsupported architecture
+		LOG_MSG("D_RMD_Breakpoints::priv_DoModifyProcessBreak() - unsupported breakpoint architecture");
+		return KErrNotSupported;
+		}
+
+	newBreakEntry.iThreadSpecific = EFalse;
+
+	DThread* threadObj = NULL;
+	NKern::ThreadEnterCS();
+	DProcess* process = DebugUtils::OpenProcessHandle(newBreakEntry.iId);
+	if (process)
+		{
+		threadObj = DebugUtils::OpenFirstThreadForProcess(process);
+		if (!threadObj) err = KErrNotFound;
+		process->Close(NULL);
+		}
+	else
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoModifyProcessBreak() - bad handle. Could not identify a process");
+		err = KErrBadHandle;
+		}
+
+	if (err)
+		{
+		NKern::ThreadLeaveCS();
+		return err;
+		}
+
+	// save the old instruction
+	TUint32 instruction;
+
+	// read the instruction at the address so we can store it in the break entry for when we clear this breakpoint
+	// trap exceptions in case the address is invalid
+	XTRAPD(r, XT_DEFAULT, err = iChannel->TryToReadMemory(threadObj, (TAny *)newBreakEntry.iAddress, (TAny *)&instruction, instSize));
+
+	//consider the leave as more important than the error code so store the leave if it's not KErrNone
+	if(KErrNone != r)
+		{
+		err = r;
+		}
+	if(KErrNone != err)
+		{
+		threadObj->Close(NULL);
+		NKern::ThreadLeaveCS();
+		return err;
+		}
+
+	newBreakEntry.iInstruction.Copy((TUint8 *)&instruction, instSize);
+
+	XTRAPD(s, XT_DEFAULT, err = DebugSupport::ModifyCode(threadObj, newBreakEntry.iAddress, instSize, inst, DebugSupport::EBreakpointGlobal));
+	if(s != DebugSupport::EBreakpointGlobal)
+		{
+		err = s;
+		}
+
+	// Close the thread handle which has been opened by OpenThreadHandle
+	threadObj->Close(NULL);
+	NKern::ThreadLeaveCS();
+	return err;
+	}
+
+/**
+Public member function which returns information about a previously set breakpoint.
+
+Note 1:
+This function ensures exclusive access to the breakpoint data structures
+by using a semaphore to serialise access.
+
+@see priv_DoBreakInfo
+
+Note 2:
+As implied by Note 1, the caller must have previously called Init() or this
+function will return KErrNotReady;
+
+@param aBreakInfo Address of aBreakInfo structure in user-side memory within the DSS client thread. CAN ONLY BE ACCESSED VIA Kern::ThreadRawRead()
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt D_RMD_Breakpoints::DoBreakInfo(TGetBreakInfo* aBreakInfo)
+	{
+	// Ensure we have a valid semaphore
+	if (!iInitialised || !iLock)
+		{
+		return KErrNotReady;
+		}
+
+	// Acquire the lock
+	NKern::ThreadEnterCS();
+	Kern::SemaphoreWait(*iLock);
+
+	// Really do the work
+	TInt err = priv_DoBreakInfo(aBreakInfo);
+	
+	// Release the lock
+	Kern::SemaphoreSignal(*iLock);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/**
+Private member function function which returns information about a previously set breakpoint..
+
+@see DoBreakInfo
+
+@param aBreakInfo Address of aBreakInfo structure in user-side memory within the DSS client thread. CAN ONLY BE ACCESSED VIA Kern::ThreadRawRead()
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt D_RMD_Breakpoints::priv_DoBreakInfo(TGetBreakInfo* aBreakInfo)
+	{
+	LOG_MSG("D_RMD_Breakpoints::priv_DoBreakInfo()");
+
+	if (!aBreakInfo)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoBreakInfo() was passed a NULL argument");
+
+		return KErrArgument;
+		}
+
+	//User side memory is not accessible directly
+	TGetBreakInfo info;
+	TInt err = Kern::ThreadRawRead(iChannel->iClientThread, aBreakInfo, (TUint8*)&info, sizeof(TGetBreakInfo));
+	if (err != KErrNone)
+		{
+		LOG_MSG("D_RMD_Breakpoints::priv_DoBreakInfo() was passed a bad argument");
+
+		return err;
+		}
+
+	// find the break entry matching this id.  note that the breakpoints are already sorted in ascending order by id
+	TBreakEntry entry;
+	entry.iBreakId = (TUint32)info.iBreakId;
+	TInt index = iBreakPointList.FindInSignedKeyOrder(entry);
+	
+	if (index >=0)
+		{
+		// get the thread id for this breakpoint
+		TUint64 threadId = iBreakPointList[index].iId;
+
+		err = Kern::ThreadRawWrite(iChannel->iClientThread,(TUint8*)info.iId,&threadId,sizeof(TUint64));
+		if (err != KErrNone)
+			{
+			LOG_MSG("D_RMD_Breakpoints::priv_DoBreakInfo() - failed to return breakpoint iThreadId information");
+			return err;
+			}
+
+		// get the threadSpecific-ness
+		TBool threadSpecific = iBreakPointList[index].iThreadSpecific;
+
+		err = Kern::ThreadRawWrite(iChannel->iClientThread,(TUint8*)info.iThreadSpecific,&threadSpecific,sizeof(TBool));
+		if (err != KErrNone)
+			{
+			LOG_MSG("D_RMD_Breakpoints::priv_DoBreakInfo() - failed to return thread specific information");
+			return err;
+			}
+
+
+		// get the address
+		TUint32 address = iBreakPointList[index].iAddress;
+
+		err = Kern::ThreadRawWrite(iChannel->iClientThread,(TUint8*)info.iAddress,&address,sizeof(TUint32));
+		if (err != KErrNone)
+			{
+			LOG_MSG("D_RMD_Breakpoints::priv_DoBreakInfo() - failed to return breakpoint iAddress information");
+			return err;
+			}
+
+
+		// get the architecture
+		TArchitectureMode mode = iBreakPointList[index].iMode;
+
+		err = Kern::ThreadRawWrite(iChannel->iClientThread,(TUint8*)info.iMode,&mode,sizeof(TUint32));
+		if (err != KErrNone)
+			{
+			LOG_MSG("D_RMD_Breakpoints::priv_DoBreakInfo() - failed to return breakpoint iMode information");
+			return err;
+			}
+
+		return err;
+		}
+
+	LOG_MSG2("D_RMD_Breakpoints::priv_DoBreakInfo - Could not find the breakpoint id specified 0x%08x", entry.iBreakId);
+	return KErrNotFound;
+	}
+
+/**
+Public member function which clears all the breakpoints in the system. Generally used for shutting down
+the debug device driver.
+
+Note 1:
+This function ensures exclusive access to the breakpoint data structures
+by using a semaphore to serialise access.
+
+@see priv_ClearAllBreakPoints
+
+Note 2:
+As implied by Note 1, the caller must have previously called Init() or this
+function will return KErrNotReady;
+*/
+void D_RMD_Breakpoints::ClearAllBreakPoints()
+	{
+	// Ensure we have a valid semaphore
+	if (!iInitialised || !iLock)
+		{
+		return;
+		}
+
+	// Acquire the lock
+	NKern::ThreadEnterCS();
+	Kern::SemaphoreWait(*iLock);
+
+	// Really do the work
+	priv_ClearAllBreakPoints();
+	
+	// Release the lock
+	Kern::SemaphoreSignal(*iLock);
+	NKern::ThreadLeaveCS();
+	}
+
+/**
+Private member function which clears all the breakpoints in the system. Generally used for shutting down
+the debug device driver. 
+
+@see DoClearAllBreakPoints
+*/
+void D_RMD_Breakpoints::priv_ClearAllBreakPoints()
+	{
+	LOG_MSG("D_RMD_Breakpoints::priv_ClearAllBreakPoints()");
+
+	TInt err = KErrNone;
+	NKern::ThreadEnterCS();
+	for (TInt i=0; i<iBreakPointList.Count(); i++)
+		{
+		if ((iBreakPointList[i].iAddress != 0) && !iBreakPointList[i].iObsoleteLibraryBreakpoint)
+			{
+			TUint32 id = iBreakPointList[i].iId + (iBreakPointList[i].iThreadSpecific ? 0 : 1);
+	        LOG_MSG5(" Will try to clear breakpoint[%d] at address 0x%x, iId=0x%016lx, thrdSpec=%d", 
+	                i, iBreakPointList[i].iAddress, iBreakPointList[i].iId, iBreakPointList[i].iThreadSpecific);
+
+			DThread *threadObj = DebugUtils::OpenThreadHandle(id);
+			if (threadObj)
+				{
+				XTRAPD(r, XT_DEFAULT, err = DebugSupport::RestoreCode(threadObj, iBreakPointList[i].iAddress));
+				err = (KErrNone == r) ? err : r;
+				threadObj->Close(NULL);
+				}
+			else
+				{
+                LOG_MSG(" OpenThreadHandle returned NULL handle");
+				err = KErrBadHandle;
+				}
+
+			if (KErrNone != err)
+				{
+				LOG_MSG2("D_RMD_Breakpoints::priv_ClearAllBreakPoints() - Error 0x%08x while clearing breakpoint", err);
+				}
+			}
+		else if(iBreakPointList[i].iAddress == 0)
+		    {
+            LOG_MSG3("Breakpoint[%d]: address is 0, iId=0x%016lx", i, iBreakPointList[i].iId );		
+		    }
+		else
+		    {
+            LOG_MSG4("Breakpoint[%d]: Obsoleted, address =0x%x, iId=0x%016lx", i, iBreakPointList[i].iAddress, iBreakPointList[i].iId );     
+		    }
+		}
+	NKern::ThreadLeaveCS();
+
+	iBreakPointList.Reset();
+	}
+
+/**
+Public member function which disables the breakpoint at the specified address.
+
+Note 1:
+This function ensures exclusive access to the breakpoint data structures
+by using a semaphore to serialise access.
+
+@see priv_DisableBreakAtAddress
+
+Note 2:
+As implied by Note 1, the caller must have previously called Init() or this
+function will return KErrNotReady;
+
+@param aAddress Address at which to disable breakpoints (all threads)
+@return KErrNone if successful, one of the other system wide error codes otherwise.
+*/
+TInt D_RMD_Breakpoints::DisableBreakAtAddress(TUint32 aAddress)
+	{
+	// Ensure we have a valid semaphore
+	if (!iInitialised || !iLock)
+		{
+		return KErrNotReady;
+		}
+
+	// Acquire the lock
+	NKern::ThreadEnterCS();
+	Kern::SemaphoreWait(*iLock);
+
+	// Really do the work
+	TInt err = priv_DisableBreakAtAddress(aAddress);
+	
+	// Release the lock
+	Kern::SemaphoreSignal(*iLock);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/**
+Private member function which clears all the breakpoints in the system. Generally used for shutting down
+the debug device driver. 
+
+@see DisableBreakAtAddress
+
+@param aAddress clears the breakpoint at the specified address
+@return KErrNone if successful, one of the other system wide error codes otherwise.
+*/
+TInt D_RMD_Breakpoints::priv_DisableBreakAtAddress(TUint32 aAddress)
+	{
+	LOG_MSG2("D_RMD_Breakpoints::priv_DisableBreakAtAddress(aAddress=0x%x)", aAddress);
+
+	TInt err = KErrNone;
+
+	for (TInt i = NUMBER_OF_TEMP_BREAKPOINTS; i < iBreakPointList.Count(); i++)
+		{
+		if (iBreakPointList[i].iAddress == aAddress)
+			{
+			iBreakPointList[i].iDisabledForStep = ETrue;
+			LOG_MSG2("D_RMD_Breakpoints::priv_DisableBreakAtAddress - Disabling breakpoint at address 0x%x", iBreakPointList[i].iAddress);
+
+			//clear the breakpoint with code modifier
+			//code modifier will restore the org instruction and also frees the shadow page if necessary
+			TUint64 id = iBreakPointList[i].iId + (iBreakPointList[i].iThreadSpecific ? 0 : 1);
+			DThread* threadObj = NULL;
+			NKern::ThreadEnterCS();
+			if(iBreakPointList[i].iThreadSpecific)
+				{
+				threadObj = DebugUtils::OpenThreadHandle(id);
+				}
+			else
+				{
+				DProcess* process = DebugUtils::OpenProcessHandle(iBreakPointList[i].iId);
+				if(process)
+					{
+					threadObj = DebugUtils::OpenFirstThreadForProcess(process);
+					process->Close(NULL);
+					}
+				}
+
+			if (threadObj)
+				{
+				XTRAPD(r, XT_DEFAULT, err = DebugSupport::RestoreCode(threadObj, aAddress));			
+				if(KErrNone != err || KErrNone != r)
+					{
+					LOG_MSG3("Error from DebugSupport::RestoreCode: r: %d, err: %d", r, err);
+					}
+				err = (KErrNone == r) ? err : r;
+				threadObj->Close(NULL);
+				}
+			else
+				{
+				err = KErrBadHandle;
+				LOG_MSG2("Couldn't find thread for breakpoint id %d", iBreakPointList[i].iId);
+				}
+			NKern::ThreadLeaveCS();
+			if (err) break;
+			}
+		}
+		
+	return err;
+	}
+
+/**
+Public member function which enables previously disabled breakpoints within a given thread.
+
+Note 1:
+This function ensures exclusive access to the breakpoint data structures
+by using a semaphore to serialise access. 
+
+@see priv_DoEnableDisabledBreak
+
+Note 2:
+As implied by Note 1, the caller must have previously called Init() or this
+function will return KErrNotReady;
+
+@param aThreadId Thread in which to enable all previously disabled breakpoints
+@return KErrNone if successful, one of the system wide error codes otherwise.
+*/
+TInt D_RMD_Breakpoints::DoEnableDisabledBreak(TUint64 aThreadId)
+	{
+	// Ensure we have a valid semaphore
+	if (!iInitialised || !iLock)
+		{
+		return KErrNotReady;
+		}
+
+	// Acquire the lock
+	NKern::ThreadEnterCS();
+	Kern::SemaphoreWait(*iLock);
+
+	// Really do the work
+	TInt err = priv_DoEnableDisabledBreak(aThreadId);
+	
+	// Release the lock
+	Kern::SemaphoreSignal(*iLock);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/**
+Private member function which enables previously disabled breakpoints within a given thread.
+
+@see DoEnableDisabledBreak
+
+@param aThreadId Thread in which to enable all previously disabled breakpoints
+@return KErrNone if successful, one of the system wide error codes otherwise.
+*/
+TInt D_RMD_Breakpoints::priv_DoEnableDisabledBreak(TUint64 aThreadId)
+	{
+	LOG_MSG("D_RMD_Breakpoints::priv_DoEnableDisabledBreak()");
+	NKern::ThreadEnterCS();
+	DThread* thread = DebugUtils::OpenThreadHandle(aThreadId);
+	if(!thread)
+		{
+		LOG_MSG2("Thread: 0x%08x does not exist", aThreadId);
+		NKern::ThreadLeaveCS();
+		return KErrNotFound;
+		}
+	TUint64 processId = thread->iOwningProcess->iId;
+	thread->Close(NULL);
+	NKern::ThreadLeaveCS();
+
+	for (TInt i = NUMBER_OF_TEMP_BREAKPOINTS; i < iBreakPointList.Count(); i++)
+		{
+		TBool needsEnabling = EFalse;
+		if(iBreakPointList[i].iDisabledForStep)
+			{
+			if(iBreakPointList[i].iThreadSpecific)
+				{
+				needsEnabling = (aThreadId == iBreakPointList[i].iId);
+				}
+			else
+				{
+				needsEnabling = (processId == iBreakPointList[i].iId);
+				}
+			}
+		if (needsEnabling)
+			{
+			LOG_MSG2("Re-enabling breakpoint at address %x", iBreakPointList[i].iAddress);
+			TInt err = priv_DoEnableBreak(iBreakPointList[i], EFalse);
+			if(KErrNone != err)
+				{
+				LOG_MSG2("Error returned from DoEnableBreak: %d", err);
+				iBreakPointList[i].iDisabledForStep = EFalse;
+				return err;
+				}
+			}
+		}
+	
+	return KErrNone;
+	}
+
+/**
+Public member function which removes all the breakpoints within a given thread.
+
+Note 1:
+This function ensures exclusive access to the breakpoint data structures
+by using a semaphore to serialise access.
+
+@see priv_DoRemoveThreadBreaks
+
+Note 2:
+As implied by Note 1, the caller must have previously called Init() or this
+function will return KErrNotReady;
+
+@param aThreadId Thread from which to remove all existing breakpoints
+@return KErrNone if successful, one of the system wide error codes otherwise.
+*/
+void D_RMD_Breakpoints::DoRemoveThreadBreaks(TUint64 aThreadId)
+	{
+	// Ensure we have a valid semaphore
+	if (!iInitialised || !iLock)
+		{
+		return;
+		}
+
+	// Acquire the lock
+	NKern::ThreadEnterCS();
+	Kern::SemaphoreWait(*iLock);
+
+	// Really do the work
+	priv_DoRemoveThreadBreaks(aThreadId);
+
+	// Release the lock
+	Kern::SemaphoreSignal(*iLock);
+	NKern::ThreadLeaveCS();
+	}
+
+/**
+Private member function which removes all the breakpoints particular to a particular thread
+
+@see DoRemoveThreadBreaks
+
+@param aThreadId Thread from which to remove all existing breakpoints
+@return KErrNone if successful, one of the system wide error codes otherwise.
+*/
+void D_RMD_Breakpoints::priv_DoRemoveThreadBreaks(TUint64 aThreadId)
+	{
+	LOG_MSG2("D_RMD_Breakpoints::priv_DoRemoveThreadBreaks(aThreadId = 0x%lx)\n",aThreadId);
+
+	TInt err = KErrNone;
+	TUint64 threadId;
+
+	for (TInt i=iBreakPointList.Count()-1; i >= 0; i--)
+		{
+		if ((iBreakPointList[i].iAddress != 0) && !iBreakPointList[i].iObsoleteLibraryBreakpoint)
+			{
+			threadId = iBreakPointList[i].iId + (iBreakPointList[i].iThreadSpecific ? 0 : 1);
+			if (threadId == aThreadId)
+				{
+				LOG_MSG5("D_RMD_Breakpoints::priv_DoRemoveThreadBreaks() - Clearing breakpoint[%d],idx=%x at address 0x%08x, iId=0x%016lx", 
+				        i, iBreakPointList[i].iBreakId, iBreakPointList[i].iAddress, iBreakPointList[i].iId );
+
+				err = priv_DoClearBreak(iBreakPointList[i].iBreakId, EFalse);
+
+				if (err != KErrNone)
+					{
+					LOG_MSG2("D_RMD_Breakpoints::priv_DoRemoveThreadBreaks()  - failed to remove break id 0x%08x\n",iBreakPointList[i].iBreakId);
+					return;
+					}
+				}
+			}
+        else if(iBreakPointList[i].iAddress == 0)
+            {
+            LOG_MSG3("Breakpoint[%d]: address is 0, iId=0x%016lx", i, iBreakPointList[i].iId );     
+            }
+        else
+            {
+            LOG_MSG4("Breakpoint[%d]: Obsoleted, address =0x%x, iId=0x%016lx", i, iBreakPointList[i].iAddress, iBreakPointList[i].iId );     
+            }		
+		}	
+	}
+
+// Remove the process breakpoints for process with PID aProcessId in the range [aCodeAddress, aCodeAddress + aCodeSize)
+void D_RMD_Breakpoints::RemoveBreaksForProcess(TUint64 aProcessId, TUint32 aCodeAddress, TUint32 aCodeSize)
+	{
+	LOG_MSG4("D_RMD_Breakpoints::RemoveBreaksForProcess(), aProcId=0x%016lx, codeAddr=0x%x, codeSize=0x%x", 
+	        aProcessId,aCodeAddress, aCodeSize);
+	NKern::ThreadEnterCS();
+	for (TInt i=iBreakPointList.Count() - 1; i>=0; i--)
+		{
+        TBool remove = EFalse;
+		TBreakEntry& breakEntry = iBreakPointList[i];
+		
+		if( breakEntry.iId == 0 || breakEntry.iAddress == 0 )
+		    {
+            breakEntry.Reset();
+		    continue;
+		    }
+		
+		LOG_MSG5(" break[%d], iId=0x%016lx, threadSpec=%d, aProcessId=0x%016lx", 
+		        i, breakEntry.iId, breakEntry.iThreadSpecific, aProcessId);
+		
+		if(!breakEntry.iThreadSpecific && breakEntry.iId == aProcessId)
+		    {
+		    remove = ETrue;
+		    }
+		else if(breakEntry.iThreadSpecific)
+		    {
+            //breakEntry.iId is thread id. Get its pid, then check if aProcessId is same, then remove
+            DThread* thread = DebugUtils::OpenThreadHandle(breakEntry.iId);
+            if(!thread)
+                {
+                LOG_MSG2("Could not open handle to thread (aThreadId = 0x%016lx)",breakEntry.iId);
+                continue;
+                }
+            
+            LOG_MSG2(" thread->iOwningProcess->iId=0x%016lx", thread->iOwningProcess->iId );
+            
+            if( thread->iOwningProcess->iId == aProcessId )
+                {
+                LOG_MSG3("Thread spec breakpoint @ index[%d] matches aProcessId= 0x%016lx. Removing",i, aProcessId);
+                remove = ETrue;
+                }
+            
+            thread->Close(NULL);
+		    }
+		    
+        if ( remove && (breakEntry.iAddress >= aCodeAddress) && (breakEntry.iAddress < (aCodeAddress + aCodeSize)))
+            {
+            LOG_MSG2("Removing process breakpoint at address %x", (TUint32)breakEntry.iAddress);
+            TInt err = DoClearBreak(breakEntry.iBreakId, ETrue);
+            if(KErrNone != err)
+                {
+                LOG_MSG2("Error removing breakpoint: %d", err);
+                }
+            }
+        else
+            {
+            LOG_MSG4("Not removing breakpoint at index[%d], id=0x%016lx, address=0x%x", 
+                    i, breakEntry.iId, (TUint32)breakEntry.iAddress);
+            }
+		}
+	NKern::ThreadLeaveCS();
+	}
+
+// mark the breakpoints in the range [aCodeAddress, aCodeAddress + aCodeSize)
+void D_RMD_Breakpoints::InvalidateLibraryBreakPoints(TUint32 aCodeAddress, TUint32 aCodeSize)
+	{
+	LOG_MSG3("D_RMD_Breakpoints::InvalidateLibraryBreakPoints(aCodeAddress=0x%x, aCodeSize=0x%x)",
+	        aCodeAddress, aCodeSize );
+	
+	for (TInt i=0; i<iBreakPointList.Count(); i++)
+		{
+		if ((iBreakPointList[i].iAddress >= aCodeAddress) && (iBreakPointList[i].iAddress < (aCodeAddress + aCodeSize)))
+			{
+			LOG_MSG2("Obsoleting library breakpoint at address %x", iBreakPointList[i].iAddress);
+			iBreakPointList[i].iObsoleteLibraryBreakpoint = ETrue;
+			}
+		}
+	}
+
+TInt D_RMD_Breakpoints::BreakPointCount() const
+	{
+	return iBreakPointList.Count();
+	}
+
+/**
+  Gets next breakpoint in list.
+  @param aBreakEntry The break entry to get the successor of. If NULL then returns the first entry.
+  @return A pointer to the next break entry, or NULL if the end of the list has been reached
+  */
+TBreakEntry* D_RMD_Breakpoints::GetNextBreak(const TBreakEntry* aBreakEntry) const
+	{
+	if(!aBreakEntry)
+		{
+		return (TBreakEntry*)&(iBreakPointList[0]);
+		}
+	TInt index = iBreakPointList.FindInSignedKeyOrder(*aBreakEntry) + 1;
+	return (index < BreakPointCount()) ? (TBreakEntry*)&(iBreakPointList[index]) : NULL;
+	}
+
+TBool D_RMD_Breakpoints::IsTemporaryBreak(const TBreakEntry& aBreakEntry) const
+	{
+	// Ensure we have a valid semaphore
+	if (!iInitialised || !iLock)
+		{
+		return EFalse;
+		}
+
+	// Acquire the lock
+	NKern::ThreadEnterCS();
+	Kern::SemaphoreWait(*iLock);
+
+	// Really do the work
+	TBool tempBreak = priv_IsTemporaryBreak(aBreakEntry);
+	
+	// Release the lock
+	Kern::SemaphoreSignal(*iLock);
+	NKern::ThreadLeaveCS();
+	
+	return tempBreak;
+	}
+
+/**
+Private member function which tells us if a breakpoint is temporary
+
+@see IsTemporaryBreak
+
+@param aBreakEntry
+@return TBool indicating if the break is temporary or not
+*/
+TBool D_RMD_Breakpoints::priv_IsTemporaryBreak(const TBreakEntry& aBreakEntry) const 
+	{
+	return aBreakEntry.iBreakId < NUMBER_OF_TEMP_BREAKPOINTS;
+	}
+
+
+// End of file - d_rmd_breakpoints.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/src/d_rmd_stepping.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,1884 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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 file contains stepping code refactored from rm_debug_kerneldriver.cpp/rm_debug_kerneldriver.h
+//
+
+#include <e32def.h>
+#include <e32def_private.h>
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include <kernel/kernel.h> 
+#include <kernel/kern_priv.h>
+#include <nk_trace.h>
+#include <arm.h>
+#include <rm_debug_api.h>
+
+#include "d_rmd_stepping.h"
+#include "d_rmd_breakpoints.h"
+#include "rm_debug_kerneldriver.h"	// needed to access DRM_DebugChannel
+#include "rm_debug_driver.h"
+#include "debug_logging.h"
+
+using namespace Debug;
+
+//
+// DRMDStepping::DRMDStepping
+//
+DRMDStepping::DRMDStepping(DRM_DebugChannel* aChannel)
+:
+	iChannel(aChannel)
+	{
+	// to do
+	}
+
+//
+// DRMDStepping::~DRM_DebugChannel
+//
+DRMDStepping::~DRMDStepping()
+	{
+	// to do
+	}
+
+//
+// DRMDStepping::IsExecuted
+//
+TBool DRMDStepping::IsExecuted(TUint8 aCondition ,TUint32 aStatusRegister)
+	{
+	LOG_MSG("DRMDStepping::IsExecuted()");
+
+	TBool N = ((aStatusRegister >> 28) & 0x0000000F) & 0x00000008;
+	TBool Z = ((aStatusRegister >> 28) & 0x0000000F) & 0x00000004;
+	TBool C = ((aStatusRegister >> 28) & 0x0000000F) & 0x00000002;
+	TBool V = ((aStatusRegister >> 28) & 0x0000000F) & 0x00000001;
+
+	switch(aCondition)
+		{
+		case 0:
+			return Z;
+		case 1:
+			return !Z;
+		case 2:
+			return C;
+		case 3:
+			return !C;
+		case 4:
+			return N;
+		case 5:
+			return !N;
+		case 6:
+			return V;
+		case 7:
+			return !V;
+		case 8:
+			return (C && !Z);
+		case 9:
+			return (!C || Z);
+		case 10:
+			return (N == V);
+		case 11:
+			return (N != V);
+		case 12:
+			return ((N == V) && !Z);
+		case 13:
+			return (Z || (N != V));
+		case 14:
+		case 15:
+			return ETrue;
+		}
+	
+	return EFalse;
+	}
+
+//
+// DRMDStepping::IsPreviousInstructionMovePCToLR
+//
+TBool DRMDStepping::IsPreviousInstructionMovePCToLR(DThread *aThread)
+	{
+	LOG_MSG("DRMDStepping::IsPreviousInstructionMovePCToLR()");
+
+	TInt err = KErrNone;
+	
+	// there are several types of instructions that modify the PC that aren't
+	// designated as linked or non linked branches.  the way gcc generates the
+	// code can tell us whether or not these instructions are to be treated as
+	// linked branches.  the main cases are bx and any type of mov or load or
+	// arithmatic operation that changes the PC.  if these are really just
+	// function calls that will return, gcc will generate a mov	lr, pc
+	// instruction as the previous instruction.  note that this is just for arm
+	// and armi
+	
+	// get the address of the previous instruction
+	TUint32 address = 0;
+	err = iChannel->ReadKernelRegisterValue(aThread, PC_REGISTER, address);
+	if(err != KErrNone)
+		{
+		LOG_MSG2("Non-zero error code discarded: %d", err);
+		}
+	address -= 4;
+
+	TBuf8<4> previousInstruction;
+	err = iChannel->DoReadMemory(aThread, address, 4, previousInstruction);
+	if (KErrNone != err)
+		{
+		LOG_MSG2("Error %d reading memory at address %x", address);
+		return EFalse;
+		}
+
+	const TUint32 movePCToLRIgnoringCondition = 0x01A0E00F;
+
+	TUint32 inst = *(TUint32 *)previousInstruction.Ptr();
+	
+	if ((inst & 0x0FFFFFFF) == movePCToLRIgnoringCondition)
+		{
+		return ETrue;
+		}
+		
+	return EFalse;
+	}
+
+//
+// DRMDStepping::DecodeDataProcessingInstruction
+//
+void DRMDStepping::DecodeDataProcessingInstruction(TUint8 aOpcode, TUint32 aOp1, TUint32 aOp2, TUint32 aStatusRegister, TUint32 &aBreakAddress)
+	{
+	LOG_MSG("DRMDStepping::DecodeDataProcessingInstruction()");
+
+	switch(aOpcode)
+		{
+		case 0:
+			{
+			// AND
+			aBreakAddress = aOp1 & aOp2;
+			break;
+			}
+		case 1:
+			{
+			// EOR
+			aBreakAddress = aOp1 ^ aOp2;
+			break;
+			}
+		case 2:
+			{
+			// SUB
+			aBreakAddress = aOp1 - aOp2;
+			break;
+			}
+		case 3:
+			{
+			// RSB
+			aBreakAddress = aOp2 - aOp1;
+			break;
+			}
+		case 4:
+			{
+			// ADD
+			aBreakAddress = aOp1 + aOp2;
+			break;
+			}
+		case 5:
+			{
+			// ADC
+			aBreakAddress = aOp1 + aOp2 + (aStatusRegister & arm_carry_bit()) ? 1 : 0;
+			break;
+			}
+		case 6:
+			{
+			// SBC
+			aBreakAddress = aOp1 - aOp2 - (aStatusRegister & arm_carry_bit()) ? 0 : 1;
+			break;
+			}
+		case 7:
+			{
+			// RSC
+			aBreakAddress = aOp2 - aOp1 - (aStatusRegister & arm_carry_bit()) ? 0 : 1;
+			break;
+			}
+		case 12:
+			{
+			// ORR
+			aBreakAddress = aOp1 | aOp2;
+			break;
+			}
+		case 13:
+			{
+			// MOV
+			aBreakAddress = aOp2;
+			break;
+			}
+		case 14:
+			{
+			// BIC
+			aBreakAddress = aOp1 & ~aOp2;
+			break;
+			}
+		case 15:
+			{
+			// MVN
+			aBreakAddress = ~aOp2;
+			break;
+			}
+		}
+	}
+
+//
+// DRMDStepping::CurrentInstruction
+//
+// Returns the current instruction bitpattern (either 32-bits or 16-bits) if possible
+TInt DRMDStepping::CurrentInstruction(DThread* aThread, TUint32& aInstruction)
+	{
+	LOG_MSG("DRMDStepping::CurrentInstruction");
+
+	// What is the current PC?
+	TUint32 pc;	
+	ReturnIfError(CurrentPC(aThread,pc));
+
+	// Read it one byte at a time to ensure alignment doesn't matter
+	TUint32 inst = 0;
+	for(TInt i=3;i>=0;i--)
+		{
+
+		TBuf8<1> instruction;
+		TInt err = iChannel->DoReadMemory(aThread, (pc+i), 1, instruction); 
+		if (KErrNone != err)
+			{
+			LOG_MSG2("DRMDStepping::CurrentInstruction : Failed to read memory at current PC: return 0x%08x",pc);
+			return err;
+			}
+
+		inst = (inst << 8) | (*(TUint8 *)instruction.Ptr());
+		}
+
+	aInstruction = inst;
+
+	LOG_MSG2("DRMDStepping::CurrentInstruction 0x%08x", aInstruction);
+
+	return KErrNone;
+	}
+
+//
+// DRMDStepping::CurrentArchMode
+//
+// Determines architecture mode from the supplied cpsr
+TInt DRMDStepping::CurrentArchMode(const TUint32 aCpsr, Debug::TArchitectureMode& aMode)
+	{
+// Thumb2 work will depend on having a suitable cpu architecture to compile for...
+#ifdef ECpuJf
+	// State table as per ARM ARM DDI0406A, section A.2.5.1
+	if(aCpsr & ECpuJf)
+		{
+		if (aCpsr & ECpuThumb)
+			{
+			// ThumbEE (Thumb2)
+			aMode = Debug::EThumb2EEMode;
+			}
+		else
+			{
+			// Jazelle mode - not supported
+			return KErrNotSupported;
+			}
+		}
+	else
+#endif
+		{
+		if (aCpsr & ECpuThumb)
+			{
+			// Thumb mode
+			aMode = Debug::EThumbMode;
+			}
+		else
+			{
+			// ARM mode
+			aMode = Debug::EArmMode;
+			}
+		}
+
+	return KErrNone;
+	}
+
+//
+// DRMDStepping::PCAfterInstructionExecutes
+//
+// Note, this function pretty much ignores all the arguments except for aThread.
+// The arguments continue to exist so that the function has the same prototype as
+// the original from Nokia. In the long term this function will be re-factored
+// to remove obsolete parameters.
+//
+TUint32 DRMDStepping::PCAfterInstructionExecutes(DThread *aThread, TUint32 aCurrentPC, TUint32 aStatusRegister, TInt aInstSize, /*TBool aStepInto,*/ TUint32 &aNewRangeEnd, TBool &aChangingModes)
+	{
+	LOG_MSG("DRMDStepping::PCAfterInstructionExecutes()");
+
+	// by default we will set the breakpoint at the next instruction
+	TUint32 breakAddress = aCurrentPC + aInstSize;
+
+	TInt err = KErrNone;
+
+	// determine the architecture
+	TUint32 cpuid;
+	asm("mrc p15, 0, cpuid, c0, c0, 0 ");
+	LOG_MSG2("DRMDStepping::PCAfterInstructionExecutes() - cpuid = 0x%08x\n",cpuid);
+
+	cpuid >>= 8;
+	cpuid &= 0xFF;
+
+	// determine the architecture mode for the current instruction
+	TArchitectureMode mode = EArmMode;	// Default assumption is ARM 
+
+	// Now we must examine the CPSR to read the T and J bits. See ARM ARM DDI0406A, section B1.3.3
+	TUint32 cpsr;
+
+	ReturnIfError(CurrentCPSR(aThread,cpsr));
+	LOG_MSG2("DRMDStepping::PCAfterInstructionExecutes() - cpsr = 0x%08x\n",cpsr);
+
+	// Determine the mode
+	ReturnIfError(CurrentArchMode(cpsr,mode));
+
+	// Decode instruction based on current CPU mode
+	switch(mode)
+		{
+		case Debug::EArmMode:
+			{
+			// Obtain the current instruction bit pattern
+			TUint32 inst;
+			ReturnIfError(CurrentInstruction(aThread,inst));
+			
+			LOG_MSG2("Current instruction: %x", inst);
+
+			// check the conditions to see if this will actually get executed
+			if (IsExecuted(((inst>>28) & 0x0000000F), aStatusRegister)) 
+				{
+				switch(arm_opcode(inst)) // bits 27-25
+					{
+					case 0:
+						{
+						switch((inst & 0x00000010) >> 4) // bit 4
+							{
+							case 0:
+								{
+								switch((inst & 0x01800000) >> 23) // bits 24-23
+									{
+									case 2:
+										{
+										// move to/from status register.  pc updates not allowed
+										// or TST, TEQ, CMP, CMN which don't modify the PC
+										break;
+										}
+									default:
+										{
+										// Data processing immediate shift
+										if (arm_rd(inst) == PC_REGISTER)
+											{
+											TUint32 rn = aCurrentPC + 8;
+											if (arm_rn(inst) != PC_REGISTER) // bits 19-16
+												{
+												err = iChannel->ReadKernelRegisterValue(aThread, arm_rn(inst), rn);
+												if(err != KErrNone)
+													{
+													LOG_MSG2("Non-zero error code discarded: %d", err);
+													}
+												}
+
+											TUint32 shifter = ShiftedRegValue(aThread, inst, aCurrentPC, aStatusRegister);
+
+											DecodeDataProcessingInstruction(((inst & 0x01E00000) >> 21), rn, shifter, aStatusRegister, breakAddress);
+											}
+										break;
+										}
+									}
+								break;
+								}
+							case 1:
+								{
+								switch((inst & 0x00000080) >> 7) // bit 7
+									{
+									case 0:
+										{
+										switch((inst & 0x01900000) >> 20) // bits 24-23 and bit 20
+											{
+											case 0x10:
+												{
+												// from figure 3-3
+												switch((inst & 0x000000F0) >> 4) // bits 7-4
+													{
+													case 1:
+														{
+														if (((inst & 0x00400000) >> 22) == 0) // bit 22
+															{
+															// BX
+															// this is a strange case.  normally this is used in the epilogue to branch the the link
+															// register.  sometimes it is used to call a function, and the LR is stored in the previous
+															// instruction.  since what we want to do is different for the two cases when stepping over,
+															// we need to read the previous instruction to see what we should do
+															err = iChannel->ReadKernelRegisterValue(aThread, (inst & 0x0000000F), breakAddress);
+															if(err != KErrNone)
+																{
+																LOG_MSG2("Non-zero error code discarded: %d", err);
+																}
+
+															if ((breakAddress & 0x00000001) == 1)
+																{
+																aChangingModes = ETrue;
+																}
+
+															breakAddress &= 0xFFFFFFFE;
+															}
+														break;
+														}
+													case 3:
+														{
+														// BLX
+															{
+															err = iChannel->ReadKernelRegisterValue(aThread, (inst & 0x0000000F), breakAddress);
+															if(err != KErrNone)
+																{
+																LOG_MSG2("Non-zero error code discarded: %d", err);
+																}
+
+															if ((breakAddress & 0x00000001) == 1)
+																{
+																aChangingModes = ETrue;
+																}
+															
+															breakAddress &= 0xFFFFFFFE;
+															}
+														break;
+														}
+													default:
+														{
+														// either doesn't modify the PC or it is illegal to
+														break;
+														}
+													}
+												break;
+												}
+											default:
+												{
+												// Data processing register shift
+												if (((inst & 0x01800000) >> 23) == 2) // bits 24-23
+													{
+													// TST, TEQ, CMP, CMN don't modify the PC
+													}
+												else if (arm_rd(inst) == PC_REGISTER)
+													{
+													// destination register is the PC
+													TUint32 rn = aCurrentPC + 8;
+													if (arm_rn(inst) != PC_REGISTER) // bits 19-16
+														{
+														err = iChannel->ReadKernelRegisterValue(aThread, arm_rn(inst), rn);
+														if(err != KErrNone)
+															{
+															LOG_MSG2("Non-zero error code discarded: %d", err);
+															}
+														}
+													
+													TUint32 shifter = ShiftedRegValue(aThread, inst, aCurrentPC, aStatusRegister);
+													
+													DecodeDataProcessingInstruction(((inst & 0x01E00000) >> 21), rn, shifter, aStatusRegister, breakAddress);
+													}
+												break;
+												}
+											}
+										break;
+										}
+									default:
+										{
+										// from figure 3-2, updates to the PC illegal
+										break;
+										}
+									}
+								break;
+								}
+							}
+						break;
+						}
+					case 1:
+						{
+						if (((inst & 0x01800000) >> 23) == 2) // bits 24-23
+							{
+							// cannot modify the PC
+							break;
+							}
+						else if (arm_rd(inst) == PC_REGISTER)
+							{
+							// destination register is the PC
+							TUint32 rn;
+							err = iChannel->ReadKernelRegisterValue(aThread, arm_rn(inst), rn); // bits 19-16
+							if(err != KErrNone)
+								{
+								LOG_MSG2("Non-zero error code discarded: %d", err);
+								}
+							TUint32 shifter = ((arm_data_imm(inst) >> arm_data_rot(inst)) | (arm_data_imm(inst) << (32 - arm_data_rot(inst)))) & 0xffffffff;
+
+							DecodeDataProcessingInstruction(((inst & 0x01E00000) >> 21), rn, shifter, aStatusRegister, breakAddress);
+							}
+						break;
+						}
+					case 2:
+						{
+						// load/store immediate offset
+						if (arm_load(inst)) // bit 20
+							{
+							// loading a register from memory
+							if (arm_rd(inst) == PC_REGISTER)
+								{
+								// loading the PC register
+								TUint32 base;
+								err = iChannel->ReadKernelRegisterValue(aThread, arm_rn(inst), base);
+								if(err != KErrNone)
+									{
+									LOG_MSG2("Non-zero error code discarded: %d", err);
+									}
+
+								/* Note: At runtime the PC would be 8 further on
+								 */
+								if (arm_rn(inst) == PC_REGISTER)
+									{
+									base = aCurrentPC + 8;
+									}
+
+								TUint32 offset = 0;
+
+								if (arm_single_pre(inst))
+									{
+									// Pre-indexing
+									offset = arm_single_imm(inst);
+
+									if (arm_single_u(inst))
+										{
+										base += offset;
+										}
+									else
+										{
+										base -= offset;
+										}
+									}
+
+								TBuf8<4> destination;
+								err = iChannel->DoReadMemory(aThread, base, 4, destination);
+								
+								if (KErrNone == err)
+									{
+									breakAddress = *(TUint32 *)destination.Ptr();
+
+									if ((breakAddress & 0x00000001) == 1)
+										{
+										aChangingModes = ETrue;
+										}
+									breakAddress &= 0xFFFFFFFE;
+									}
+								else
+									{
+									LOG_MSG("Error reading memory in decoding step instruction");
+									}
+								}
+							}
+						break;
+						}
+					case 3:
+						{
+						if (((inst & 0xF0000000) != 0xF0000000) && ((inst & 0x00000010) == 0))
+							{
+							// load/store register offset
+							if (arm_load(inst)) // bit 20
+								{
+								// loading a register from memory
+								if (arm_rd(inst) == PC_REGISTER)
+									{
+									// loading the PC register
+									TUint32 base = 0;
+									if(arm_rn(inst) == PC_REGISTER)
+										{
+										base = aCurrentPC + 8;
+										}
+									else
+										{
+										err = iChannel->ReadKernelRegisterValue(aThread, arm_rn(inst), base);
+										if(err != KErrNone)
+											{
+											LOG_MSG2("Non-zero error code discarded: %d", err);
+											}
+										}
+
+									TUint32 offset = 0;
+
+									if (arm_single_pre(inst))
+										{
+										offset = ShiftedRegValue(aThread, inst, aCurrentPC, aStatusRegister);
+
+										if (arm_single_u(inst))
+											{
+											base += offset;
+											}
+										else
+											{
+											base -= offset;
+											}
+										}
+
+									TBuf8<4> destination;
+									err = iChannel->DoReadMemory(aThread, base, 4, destination);
+
+									if (KErrNone == err)
+										{
+										breakAddress = *(TUint32 *)destination.Ptr();
+
+										if ((breakAddress & 0x00000001) == 1)
+											{
+											aChangingModes = ETrue;
+											}
+										breakAddress &= 0xFFFFFFFE;
+										}
+									else
+										{
+										LOG_MSG("Error reading memory in decoding step instruction");
+										}
+									}
+								}
+							}
+						break;
+						}
+					case 4:
+						{
+						if ((inst & 0xF0000000) != 0xF0000000)
+							{
+							// load/store multiple
+							if (arm_load(inst)) // bit 20
+								{
+								// loading a register from memory
+								if (((inst & 0x00008000) >> 15))
+									{
+									// loading the PC register
+									TInt offset = 0;	
+									if (arm_block_u(inst))
+										{
+										TUint32 reglist = arm_block_reglist(inst);
+										offset = iChannel->Bitcount(reglist) * 4 - 4;
+										if (arm_block_pre(inst))
+											offset += 4;
+										}
+									else if (arm_block_pre(inst))
+										{
+										offset = -4;
+										}
+
+									TUint32 temp = 0;
+									err = iChannel->ReadKernelRegisterValue(aThread, arm_rn(inst), temp);
+									if(err != KErrNone)
+										{
+										LOG_MSG2("Non-zero error code discarded: %d", err);
+										}
+
+									temp += offset;
+
+									TBuf8<4> destination;
+									err = iChannel->DoReadMemory(aThread, temp, 4, destination);
+
+									if (KErrNone == err)
+										{
+										breakAddress = *(TUint32 *)destination.Ptr();
+										if ((breakAddress & 0x00000001) == 1)
+											{
+											aChangingModes = ETrue;
+											}
+										breakAddress &= 0xFFFFFFFE;
+										}
+									else
+										{
+										LOG_MSG("Error reading memory in decoding step instruction");
+										}
+									}
+								}
+							}
+						break;
+						}
+					case 5:
+						{
+						if ((inst & 0xF0000000) == 0xF0000000)
+							{
+							// BLX
+							breakAddress = (TUint32)arm_instr_b_dest(inst, aCurrentPC);
+
+							// Unconditionally change into Thumb mode
+							aChangingModes = ETrue;
+							breakAddress &= 0xFFFFFFFE;
+							}
+						else
+							{
+							if ((inst & 0x01000000)) // bit 24
+								{
+								// BL
+									breakAddress = (TUint32)arm_instr_b_dest(inst, aCurrentPC);
+								}
+							else
+								{
+								// B
+								breakAddress = (TUint32)arm_instr_b_dest(inst, aCurrentPC);
+								}
+							}
+						break;
+						} // case 5
+					} //switch(arm_opcode(inst)) // bits 27-25
+				} // if (IsExecuted(((inst>>28) & 0x0000000F), aStatusRegister)) 
+			} // case Debug::EArmMode:
+		break;
+
+		case Debug::EThumbMode:
+			{
+			// Thumb Mode
+			//
+			// Notes: This now includes the extra code
+			// required to decode V6T2 instructions
+			
+			LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: Thumb Instruction");
+
+			TUint16 inst;
+
+			// Obtain the current instruction bit pattern
+			TUint32 inst32;
+			ReturnIfError(CurrentInstruction(aThread,inst32));
+
+			inst = static_cast<TUint16>(inst32 & 0xFFFF);
+
+			LOG_MSG2("Current Thumb instruction: 0x%x", inst);
+
+			// v6T2 instructions
+
+			// Note: v6T2 decoding is only enabled for DEBUG builds or if using an
+			// an ARM_V6T2 supporting build system. At the time of writing, no
+			// ARM_V6T2 supporting build system exists, so the stepping code cannot
+			// be said to be known to work. Hence it is not run for release builds
+
+			TBool use_v6t2_decodings = EFalse;
+
+#if defined(DEBUG) || defined(__ARMV6T2__)
+			use_v6t2_decodings = ETrue;
+#endif
+			// coverity[dead_error_line]
+			if (use_v6t2_decodings)
+				{
+				// 16-bit encodings
+
+				// A6.2.5 Misc 16-bit instructions
+				// DONE Compare and branch on zero (page A8-66)
+				// If then hints
+
+				// ARM ARM DDI0406A - section A8.6.27 CBNZ, CBZ
+				//
+				// Compare and branch on Nonzero and Compare and Branch on Zero.
+				if ((inst & 0xF500) == 0xB100)
+					{
+					LOG_MSG("ARM ARM DDI0406A - section A8.6.27 CBNZ, CBZ");
+
+					// Decoding as per ARM ARM description
+					TUint32 op = (inst & 0x0800) >> 11;
+					TUint32 i = (inst & 0x0200) >> 9;
+					TUint32 imm5 = (inst & 0x00F8) >> 3;
+					TUint32 Rn = inst & 0x0007;
+
+					TUint32 imm32 = (i << 6) | (imm5 << 1);
+
+					// Obtain value for register Rn
+					TUint32 RnVal = 0;
+					ReturnIfError(RegisterValue(aThread,Rn,RnVal));
+
+					if (op)
+						{
+						// nonzero
+						if (RnVal != 0x0)
+							{
+							// Branch
+							breakAddress = aCurrentPC + imm32;
+							}
+						}
+					else
+						{
+						// zero
+						if (RnVal == 0x0)
+							{
+							// Branch
+							breakAddress = aCurrentPC + imm32;
+							}
+						}
+				}
+
+				// ARM ARM DDI0406A - section A8.6.50 IT
+				//
+				// If Then instruction
+				if ((inst & 0xFF00) == 0xBF00)
+					{
+					LOG_MSG("ARM ARM DDI0406A - section A8.6.50 IT");
+
+					// Decoding as per ARM ARM description
+					TUint32 firstcond = inst & 0x00F0 >> 4;
+					TUint32 mask = inst & 0x000F;
+
+					if (firstcond == 0xF)
+						{
+						// unpredictable
+						LOG_MSG("ARM ARM DDI0406A - section A8.6.50 IT - Unpredictable");
+						break;
+						}
+
+					if ((firstcond == 0xE) && (BitCount(mask) != 1))
+						{
+						// unpredictable
+						LOG_MSG("ARM ARM DDI0406A - section A8.6.50 IT - Unpredictable");
+						break;
+						}
+
+					// should check if 'in-it-block'
+					LOG_MSG("Cannot step IT instructions.");
+
+					// all the conds are as per Table A8-1 (i.e. the usual 16 cases)
+					// no idea how to decode the it block 'after-the-fact'
+					// so probably need to treat instructions in the it block
+					// as 'may' be executed. So breakpoints at both possible locations
+					// depending on whether the instruction is executed or not.
+
+					// also, how do we know if we have hit a breakpoint whilst 'in' an it block?
+					// can we check the status registers to find out?
+					//
+					// see arm arm page 390.
+					//
+					// seems to depend on the itstate field. this also says what the condition code
+					// actually is, and how many instructions are left in the itblock.
+					// perhaps we can just totally ignore this state, and always do the two-instruction
+					// breakpoint thing? Not if there is any possibility that the address target
+					// would be invalid for the non-taken branch address...
+					}
+
+
+				// 32-bit encodings.
+				//
+
+				// Load word A6-23
+				// Data processing instructions a6-28
+				// 
+
+				// ARM ARM DDI0406A - section A8.6.26
+				if (inst32 & 0xFFF0FFFF == 0xE3C08F00)
+					{
+					LOG_MSG("ARM ARM DDI0406A - section A8.6.26 - BXJ is not supported");
+
+					// Decoding as per ARM ARM description
+					// TUint32 Rm = inst32 & 0x000F0000;	// not needed yet
+					}
+
+				// return from exception... SUBS PC,LR. page b6-25
+				//
+				// ARM ARM DDi046A - section B6.1.13 - SUBS PC,LR
+				//
+				// Encoding T1
+				if (inst32 & 0xFFFFFF00 == 0xF3DE8F00)
+					{
+					LOG_MSG("ARM ARM DDI0406A - section B6.1.13 - SUBS PC,LR Encoding T1");
+
+					// Decoding as per ARM ARM description
+					TUint32 imm8 = inst32 & 0x000000FF;
+					TUint32 imm32 = imm8;
+
+					// TUint32 register_form = EFalse;	// not needed for this decoding
+					// TUint32 opcode = 0x2;	// SUB	// not needed for this decoding
+					TUint32 n = 14;
+
+					// Obtain LR
+					TUint32 lrVal;
+					ReturnIfError(RegisterValue(aThread,n,lrVal));
+
+					TUint32 operand2 = imm32;	// always for Encoding T1
+					
+					TUint32 result = lrVal - operand2;
+					
+					breakAddress = result;
+					}
+
+				// ARM ARM DDI0406A - section A8.6.16 - B
+				//
+				// Branch Encoding T3
+				if (inst32 & 0xF800D000 == 0xF0008000)
+					{
+					LOG_MSG("ARM ARM DDI0406A - section A8.6.16 - B Encoding T3");
+
+					// Decoding as per ARM ARM description
+					TUint32 S = inst32 & 0x04000000 >> 26;
+					// TUint32 cond = inst32 & 0x03C00000 >> 22;	// not needed for this decoding
+					TUint32 imm6 = inst32 & 0x003F0000 >> 16;
+					TUint32 J1 = inst32 & 0x00002000 >> 13;
+					TUint32 J2 = inst32 & 0x00000800 >> 11;
+					TUint32 imm11 = inst32 & 0x000007FF;
+
+					TUint32 imm32 = S ? 0xFFFFFFFF : 0 ;
+					imm32 = (imm32 << 1) | J2;
+					imm32 = (imm32 << 1) | J1;
+					imm32 = (imm32 << 6) | imm6;
+					imm32 = (imm32 << 11) | imm11;
+					imm32 = (imm32 << 1) | 0;
+
+					breakAddress = aCurrentPC + imm32;
+					}
+
+				// ARM ARM DDI0406A - section A8.6.16 - B
+				//
+				// Branch Encoding T4
+				if (inst32 & 0xF800D000 == 0xF0009000)
+					{
+					LOG_MSG("ARM ARM DDI0406A - section A8.6.16 - B");
+
+					// Decoding as per ARM ARM description
+					TUint32 S = inst32 & 0x04000000 >> 26;
+					TUint32 imm10 = inst32 & 0x03FF0000 >> 16;
+					TUint32 J1 = inst32 & 0x00002000 >> 12;
+					TUint32 J2 = inst32 & 0x00000800 >> 11;
+					TUint32 imm11 = inst32 & 0x000003FF;
+
+					TUint32 I1 = !(J1 ^ S);
+					TUint32 I2 = !(J2 ^ S);
+
+					TUint32 imm32 = S ? 0xFFFFFFFF : 0;
+					imm32 = (imm32 << 1) | S;
+					imm32 = (imm32 << 1) | I1;
+					imm32 = (imm32 << 1) | I2;
+					imm32 = (imm32 << 10) | imm10;
+					imm32 = (imm32 << 11) | imm11;
+					imm32 = (imm32 << 1) | 0;
+
+					breakAddress = aCurrentPC + imm32;
+					}
+
+
+				// ARM ARM DDI0406A - section A8.6.225 - TBB, TBH
+				//
+				// Table Branch Byte, Table Branch Halfword
+				if (inst32 & 0xFFF0FFE0 == 0xE8D0F000)
+						{
+					LOG_MSG("ARM ARM DDI0406A - section A8.6.225 TBB,TBH Encoding T1");
+
+					// Decoding as per ARM ARM description
+					TUint32 Rn = inst32 & 0x000F0000 >> 16;
+					TUint32 H = inst32 & 0x00000010 >> 4;
+					TUint32 Rm = inst32 & 0x0000000F;
+
+					// Unpredictable?
+					if (Rm == 13 || Rm == 15)
+						{
+						LOG_MSG("ARM ARM DDI0406A - section A8.6.225 TBB,TBH Encoding T1 - Unpredictable");
+						break;
+						}
+
+					TUint32 halfwords;
+					TUint32 address;
+					ReturnIfError(RegisterValue(aThread,Rn,address));
+
+					TUint32 offset;
+					ReturnIfError(RegisterValue(aThread,Rm,offset));
+
+					if (H)
+						{
+						address += offset << 1;
+						}
+					else
+						{
+						address += offset;
+						}
+
+					ReturnIfError(ReadMem32(aThread,address,halfwords));
+
+					breakAddress = aCurrentPC + 2*halfwords;
+					break;
+					}
+
+				// ARM ARM DDI0406A - section A8.6.55 - LDMDB, LDMEA
+				//
+				// LDMDB Encoding T1
+				if (inst32 & 0xFFD02000 == 0xE9100000)
+					{
+					LOG_MSG("ARM ARM DDI0406 - section A8.6.55 LDMDB Encoding T1");
+
+					// Decoding as per ARM ARM description
+					// TUint32 W = inst32 & 0x00200000 >> 21;	// Not needed for this encoding
+					TUint32 Rn = inst32 & 0x000F0000 >> 16;
+					TUint32 P = inst32 & 0x00008000 >> 15;
+					TUint32 M = inst32 & 0x00004000 >> 14;
+					TUint32 registers = inst32 & 0x00001FFF;
+
+					//TBool wback = (W == 1);	// not needed for this encoding
+
+					// Unpredictable?
+					if (Rn == 15 || BitCount(registers) < 2 || ((P == 1) && (M==1)))
+						{
+						LOG_MSG("ARM ARM DDI0406 - section A8.6.55 LDMDB Encoding T1 - Unpredictable");
+						break;
+						}
+
+					TUint32 address;
+					ReturnIfError(RegisterValue(aThread,Rn,address));
+
+					address -= 4*BitCount(registers);
+
+					for(TInt i=0; i<15; i++)
+						{
+						if (IsBitSet(registers,i))
+							{
+							address +=4;
+							}
+						}
+
+					if (IsBitSet(registers,15))
+						{
+						TUint32 RnVal = 0;
+						ReturnIfError(ReadMem32(aThread,address,RnVal));
+
+						breakAddress = RnVal;
+						}
+					break;
+					}
+
+				// ARM ARM DDI0406A - section A8.6.121 POP
+				//
+				// POP.W Encoding T2
+				if (inst32 & 0xFFFF2000 == 0xE8BD0000)
+					{
+					LOG_MSG("ARM ARM DDI0406A - section A8.6.121 POP Encoding T2");
+
+					// Decoding as per ARM ARM description
+					TUint32 registers = inst32 & 0x00001FFF;
+					TUint32 P = inst32 & 0x00008000;
+					TUint32 M = inst32 & 0x00004000;
+
+					// Unpredictable?
+					if ( (BitCount(registers)<2) || ((P == 1)&&(M == 1)) )
+						{
+						LOG_MSG("ARM ARM DDI0406A - section A8.6.121 POP Encoding T2 - Unpredictable");
+						break;
+						}
+
+					TUint32 address;
+					ReturnIfError(RegisterValue(aThread,13,address));
+					
+					for(TInt i=0; i< 15; i++)
+						{
+						if (IsBitSet(registers,i))
+							{
+							address += 4;
+							}
+						}
+
+					// Is the PC written?
+					if (IsBitSet(registers,15))
+						{
+						// Yes
+						ReturnIfError(ReadMem32(aThread,address,breakAddress));
+						}
+					}
+
+				// POP Encoding T3
+				if (inst32 & 0xFFFF0FFFF == 0xF85D0B04)
+					{
+					LOG_MSG("ARM ARM DDI0406A - section A8.6.121 POP Encoding T3");
+
+					// Decoding as per ARM ARM description
+					TUint32 Rt = inst32 & 0x0000F000 >> 12;
+					TUint32 registers = 1 << Rt;
+
+					// Unpredictable?
+					if (Rt == 13 || Rt == 15)
+						{
+						LOG_MSG("ARM ARM DDI0406A - section A8.6.121 POP Encoding T3 - Unpredictable");
+						break;
+						}
+					
+					TUint32 address;
+					ReturnIfError(RegisterValue(aThread,13,address));
+					
+					for(TInt i=0; i< 15; i++)
+						{
+						if (IsBitSet(registers,i))
+							{
+							address += 4;
+							}
+						}
+
+					// Is the PC written?
+					if (IsBitSet(registers,15))
+						{
+						// Yes
+						ReturnIfError(ReadMem32(aThread,address,breakAddress));
+						}
+
+					break;
+					}
+
+				// ARM ARM DDI0406A - section A8.6.53 LDM
+				//
+				// Load Multiple Encoding T2 
+				if ((inst32 & 0xFFD02000) == 0xE8900000)
+					{
+					LOG_MSG("ARM ARM DDI0406A - section A8.6.53 LDM Encoding T2");
+
+					// Decoding as per ARM ARM description
+					TUint32 W = inst32 & 0x0020000 >> 21;
+					TUint32 Rn = inst32 & 0x000F0000 >> 16;
+					TUint32 P = inst32 & 0x00008000 >> 15;
+					TUint32 M = inst32 & 0x00004000 >> 14;
+					TUint32 registers = inst32 & 0x0000FFFF;
+					TUint32 register_list = inst32 & 0x00001FFF;
+				
+					// POP?
+					if ( (W == 1) && (Rn == 13) )
+						{
+						// POP instruction
+						LOG_MSG("ARM ARM DDI0406A - section A8.6.53 LDM Encoding T2 - POP");
+						}
+
+					// Unpredictable?
+					if (Rn == 15 || BitCount(register_list) < 2 || ((P == 1) && (M == 1)) )
+						{
+						LOG_MSG("ARM ARM DDI0406A - section A8.6.53 LDM Encoding T2 - Unpredictable");
+						break;
+						}
+					
+					TUint32 RnVal;
+					ReturnIfError(RegisterValue(aThread,Rn,RnVal));
+
+					TUint32 address = RnVal;
+
+					// Calculate offset of address
+					for(TInt i = 0; i < 15; i++)
+						{
+						if (IsBitSet(registers,i))
+						{
+							address += 4;
+						}
+						}
+
+					// Does it load the PC?
+					if (IsBitSet(registers,15))
+						{
+						// Obtain the value loaded into the PC
+						ReturnIfError(ReadMem32(aThread,address,breakAddress));
+						}
+					break;
+
+					}
+
+				// ARM ARM DDI0406A - section B6.1.8 RFE
+				//
+				// Return From Exception Encoding T1 RFEDB
+				if ((inst32 & 0xFFD0FFFF) == 0xE810C000)
+					{
+					LOG_MSG("ARM ARM DDI0406A - section B6.1.8 RFE Encoding T1");
+
+					// Decoding as per ARM ARM description
+					// TUint32 W = (inst32 & 0x00200000) >> 21;	// not needed for this encoding
+					TUint32 Rn = (inst32 & 0x000F0000) >> 16;
+					
+					// TBool wback = (W == 1);	// not needed for this encoding
+					TBool increment = EFalse;
+					TBool wordhigher = EFalse;
+
+					// Do calculation
+					if (Rn == 15)
+						{
+						// Unpredictable 
+						LOG_MSG("ARM ARM DDI0406A - section B6.1.8 RFE Encoding T1 - Unpredictable");
+						break;
+						}
+
+					TUint32 RnVal = 0;
+					ReturnIfError(RegisterValue(aThread,Rn,RnVal));
+
+					TUint32 address = 0;
+					ReturnIfError(ReadMem32(aThread,RnVal,address));
+
+					if (increment)
+						{
+						address -= 8;
+						}
+
+					if (wordhigher)
+						{
+						address += 4;
+						}
+
+					breakAddress = address;
+					break;
+					}
+
+				// Return From Exception Encoding T2 RFEIA
+				if ((inst32 & 0xFFD0FFFF) == 0xE990C000)
+					{
+					LOG_MSG("ARM ARM DDI0406A - section B6.1.8 RFE Encoding T2");
+
+					// Decoding as per ARM ARM description
+					// TUint32 W = (inst32 & 0x00200000) >> 21;	// not needed for this encoding
+					TUint32 Rn = (inst32 & 0x000F0000) >> 16;
+					
+					// TBool wback = (W == 1);	// not needed for this encoding
+					TBool increment = ETrue;
+					TBool wordhigher = EFalse;
+
+					// Do calculation
+					if (Rn == 15)
+						{
+						// Unpredictable 
+						LOG_MSG("ARM ARM DDI0406A - section B6.1.8 RFE Encoding T2 - Unpredictable");
+						break;
+						}
+
+					TUint32 RnVal = 0;
+					ReturnIfError(RegisterValue(aThread,Rn,RnVal));
+
+					TUint32 address = 0;
+					ReturnIfError(ReadMem32(aThread,RnVal,address));
+
+					if (increment)
+						{
+						address -= 8;
+						}
+
+					if (wordhigher)
+						{
+						address += 4;
+						}
+
+					breakAddress = RnVal;
+					break;
+					}
+
+				// Return From Exception Encoding A1 RFE<amode>
+				if ((inst32 & 0xFE50FFFF) == 0xF8100A00)
+					{
+					LOG_MSG("ARM ARM DDI0406A - section B6.1.8 RFE Encoding A1");
+
+					// Decoding as per ARM ARM description
+					TUint32 P = (inst32 & 0x01000000) >> 24;
+					TUint32 U = (inst32 & 0x00800000) >> 23;
+					// TUint32 W = (inst32 & 0x00200000) >> 21; // not needed for this encoding
+					TUint32 Rn = (inst32 & 0x000F0000) >> 16;	
+					
+					// TBool wback = (W == 1);	// not needed for this encoding
+					TBool increment = (U == 1);
+					TBool wordhigher = (P == U);
+
+					// Do calculation
+					if (Rn == 15)
+						{
+						// Unpredictable 
+						LOG_MSG("ARM ARM DDI0406A - section B6.1.8 RFE Encoding A1 - Unpredictable");
+						break;
+						}
+
+					TUint32 RnVal = 0;
+					ReturnIfError(RegisterValue(aThread,Rn,RnVal));
+
+					TUint32 address = 0;
+					ReturnIfError(ReadMem32(aThread,RnVal,address));
+
+					if (increment)
+						{
+						address -= 8;
+						}
+
+					if (wordhigher)
+						{
+						address += 4;
+						}
+
+					breakAddress = address;
+					break;
+					}
+				}
+
+			// v4T/v5T/v6T instructions
+			switch(thumb_opcode(inst))
+				{
+				case 0x08:
+					{
+					// Data-processing. See ARM ARM DDI0406A, section A6-8, A6.2.2.
+
+					if ((thumb_inst_7_15(inst) == 0x08F))
+						{
+						// BLX(2)
+						err = iChannel->ReadKernelRegisterValue(aThread, ((inst & 0x0078) >> 3), breakAddress);
+						if(err != KErrNone)
+							{
+							LOG_MSG2("Non-zero error code discarded: %d", err);
+							}
+
+						if ((breakAddress & 0x00000001) == 0)
+							{
+							aChangingModes = ETrue;
+							}
+
+						breakAddress &= 0xFFFFFFFE;
+
+						// Report how we decoded this instruction
+						LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: Decoded as BLX (2)");
+						}
+					else if (thumb_inst_7_15(inst) == 0x08E)
+						{
+						// BX
+						err = iChannel->ReadKernelRegisterValue(aThread, ((inst & 0x0078) >> 3), breakAddress);
+						if(err != KErrNone)
+							{
+							LOG_MSG2("Non-zero error code discarded: %d", err);
+							}
+
+						if ((breakAddress & 0x00000001) == 0)
+							{
+							aChangingModes = ETrue;
+							}
+						
+						breakAddress &= 0xFFFFFFFE;
+
+						// Report how we decoded this instruction
+						LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: Decoded as BX");
+						}
+					else if ((thumb_inst_8_15(inst) == 0x46) && ((inst & 0x87) == 0x87))
+						{
+						// MOV with PC as the destination
+						err = iChannel->ReadKernelRegisterValue(aThread, ((inst & 0x0078) >> 3), breakAddress);
+						if(err != KErrNone)
+							{
+							LOG_MSG2("Non-zero error code discarded: %d", err);
+							}
+
+						// Report how we decoded this instruction
+						LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: Decoded as MOV with PC as the destination");
+						}
+					else if ((thumb_inst_8_15(inst) == 0x44) && ((inst & 0x87) == 0x87))
+						{
+						// ADD with PC as the destination
+						err = iChannel->ReadKernelRegisterValue(aThread, ((inst & 0x0078) >> 3), breakAddress);
+						if(err != KErrNone)
+							{
+							LOG_MSG2("Non-zero error code discarded: %d", err);
+							}
+						breakAddress += aCurrentPC + 4; // +4 because we need to use the PC+4 according to ARM ARM DDI0406A, section A6.1.2.
+
+						// Report how we decoded this instruction
+						LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: Decoded as ADD with PC as the destination");
+						}
+					break;
+					}
+				case 0x13:
+					{
+					// Load/Store single data item. See ARM ARM DDI0406A, section A6-10
+
+					//This instruction doesn't modify the PC.
+
+					//if (thumb_inst_8_15(inst) == 0x9F)
+					//{
+						// LDR(4) with the PC as the destination
+					//	breakAddress = ReadRegister(aThread, SP_REGISTER) + (4 * (inst & 0x00FF));
+					//}
+
+					// Report how we decoded this instruction
+					LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: Decoded as This instruction doesn't modify the PC.");
+					break;
+					}
+				case 0x17:
+					{
+					// Misc 16-bit instruction. See ARM ARM DDI0406A, section A6-11
+
+					if (thumb_inst_8_15(inst) == 0xBD)
+						{
+						// POP with the PC in the list
+						TUint32 regList = (inst & 0x00FF);
+						TInt offset = 0;
+						err = iChannel->ReadKernelRegisterValue(aThread,  SP_REGISTER, (T4ByteRegisterValue&)offset);
+						if(err != KErrNone)
+							{
+							LOG_MSG2("Non-zero error code discarded: %d", err);
+							}
+						offset += (iChannel->Bitcount(regList) * 4);
+
+						TBuf8<4> destination;
+						err = iChannel->DoReadMemory(aThread, offset, 4, destination);
+						
+						if (KErrNone == err)
+							{
+							breakAddress = *(TUint32 *)destination.Ptr();
+
+							if ((breakAddress & 0x00000001) == 0)
+								{
+								aChangingModes = ETrue;
+								}
+
+							breakAddress &= 0xFFFFFFFE;
+							}
+						else
+							{
+							LOG_MSG("Error reading memory in decoding step instruction");
+							}
+
+						// Report how we decoded this instruction
+						LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: Decoded as POP with the PC in the list");
+						}
+					break;
+					}
+				case 0x1A:
+				case 0x1B:
+					{
+					// Conditional branch, and supervisor call. See ARM ARM DDI0406A, section A6-13
+
+					if (thumb_inst_8_15(inst) < 0xDE)
+						{
+						// B(1) conditional branch
+						if (IsExecuted(((inst & 0x0F00) >> 8), aStatusRegister))
+							{
+							TUint32 offset = ((inst & 0x000000FF) << 1);
+							if (offset & 0x00000100)
+								{
+								offset |= 0xFFFFFF00;
+								}
+							
+							breakAddress = aCurrentPC + 4 + offset;
+
+							// Report how we decoded this instruction
+							LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: Decoded as B(1) conditional branch");
+							}
+						}
+					break;
+					}
+				case 0x1C:
+					{
+					// Unconditional branch, See ARM ARM DDI0406A, section A8-44.
+
+					// B(2) unconditional branch
+					TUint32 offset = (inst & 0x000007FF) << 1;
+					if (offset & 0x00000800)
+						{
+						offset |= 0xFFFFF800;
+						}
+					
+					breakAddress = aCurrentPC + 4 + offset;
+
+					// Report how we decoded this instruction
+					LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: Decoded as B(2) unconditional branch");
+
+					break;
+					}
+				case 0x1D:
+					{
+					if (!(inst & 0x0001))
+						{
+						// BLX(1)
+						err = iChannel->ReadKernelRegisterValue(aThread, LINK_REGISTER, breakAddress);
+						if(err != KErrNone)
+							{
+							LOG_MSG2("Non-zero error code discarded: %d", err);
+							}
+						breakAddress +=  ((inst & 0x07FF) << 1);
+						if ((breakAddress & 0x00000001) == 0)
+							{
+							aChangingModes = ETrue;
+							}
+
+						breakAddress &= 0xFFFFFFFC;
+
+						// Report how we decoded this instruction
+						LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: Decoded as BLX(1)");
+
+						}
+					break;
+					}
+				case 0x1E:
+					{
+					// Check for ARMv7 CPU
+					if(cpuid == 0xC0)
+						{
+						// BL/BLX 32-bit instruction
+						aNewRangeEnd += 4;
+
+						breakAddress = (TUint32)thumb_instr_b_dest(inst32, aCurrentPC);
+
+						if((inst32 >> 27) == 0x1D)
+							{
+							// BLX(1)
+							if ((breakAddress & 0x00000001) == 0)
+								{
+								aChangingModes = ETrue;
+								}
+
+							breakAddress &= 0xFFFFFFFC;
+
+							// Report how we decoded this instruction
+							LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: Decoded as 32-bit BLX(1)");
+							}
+						else
+							{
+							// Report how we decoded this instruction
+							LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: 32-bit BL instruction");
+							}
+						LOG_MSG2(" 32-bit BL/BLX instruction: breakAddress = 0x%X", breakAddress);
+						} // if(cpuid == 0xC0)
+					else
+						{
+						// BL/BLX prefix - destination is encoded in this and the next instruction
+						aNewRangeEnd += 2;
+
+						// Report how we decoded this instruction
+						LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: BL/BLX prefix - destination is encoded in this and the next instruction");
+						}
+
+					break;
+					}
+				case 0x1F:
+					{
+					// BL
+					err = iChannel->ReadKernelRegisterValue(aThread, LINK_REGISTER, breakAddress);
+					if(err != KErrNone)
+						{
+						LOG_MSG2("Non-zero error code discarded: %d", err);
+						}
+					breakAddress += ((inst & 0x07FF) << 1);
+
+					// Report how we decoded this instruction
+					LOG_MSG("DRMDStepping::PCAfterInstructionExecutes: Decoded as BL");
+					break;
+					}
+				default:
+					{
+					// Don't know any better at this point!
+					LOG_MSG("DRMDStepping::PCAfterInstructionExecutes:- default to next instruction");
+					}
+					break;
+				} // switch(thumb_opcode(inst))
+			} // case Debug::EThumbMode:
+		break;
+
+		case Debug::EThumb2EEMode:
+			{
+			// Not yet supported
+			LOG_MSG("DRMDStepping::PCAfterInstructionExecutes - Debug::EThumb2Mode is not supported");
+
+			}
+			break;
+
+		default:
+			LOG_MSG("DRMDStepping::PCAfterInstructionExecutes - Cannot determine CPU mode architecture");
+		} // switch(mode)
+
+	LOG_MSG2("DRMDStepping::PCAfterInstructionExecutes : return 0x%08x",breakAddress);
+	return breakAddress;
+	}
+
+// Obtain a 32-bit memory value with minimum fuss
+TInt DRMDStepping::ReadMem32(DThread* aThread, const TUint32 aAddress, TUint32& aValue)
+	{
+	TBuf8<4> valBuf;
+	TInt err = iChannel->DoReadMemory(aThread, aAddress, 4, valBuf);
+	if (err != KErrNone)
+		{
+		LOG_MSG2("DRMDStepping::ReadMem32 failed to read memory at 0x%08x", aAddress);
+		return err;
+		}
+
+	aValue = *(TUint32 *)valBuf.Ptr();
+
+	return KErrNone;
+	}
+
+// Obtain a 16-bit memory value with minimum fuss
+TInt DRMDStepping::ReadMem16(DThread* aThread, const TUint32 aAddress, TUint16& aValue)
+	{
+	TBuf8<2> valBuf;
+	TInt err = iChannel->DoReadMemory(aThread, aAddress, 2, valBuf);
+	if (err != KErrNone)
+		{
+		LOG_MSG2("DRMDStepping::ReadMem16 failed to read memory at 0x%08x", aAddress);
+		return err;
+		}
+
+	aValue = *(TUint16 *)valBuf.Ptr();
+
+	return KErrNone;
+	}
+
+// Obtain a 16-bit memory value with minimum fuss
+TInt DRMDStepping::ReadMem8(DThread* aThread, const TUint32 aAddress, TUint8& aValue)
+	{
+	TBuf8<1> valBuf;
+	TInt err = iChannel->DoReadMemory(aThread, aAddress, 1, valBuf);
+	if (err != KErrNone)
+		{
+		LOG_MSG2("DRMDStepping::ReadMem8 failed to read memory at 0x%08x", aAddress);
+		return err;
+		}
+
+	aValue = *(TUint8 *)valBuf.Ptr();
+
+	return KErrNone;
+	}
+
+// Obtain a core register value with minimum fuss
+TInt DRMDStepping::RegisterValue(DThread *aThread, const TUint32 aKernelRegisterId, TUint32 &aValue)
+	{
+	TInt err = iChannel->ReadKernelRegisterValue(aThread, aKernelRegisterId, aValue);
+	if(err != KErrNone)
+		{
+		LOG_MSG3("DRMDStepping::RegisterValue failed to read register %d err = %d", aKernelRegisterId, err);
+		}
+		return err;
+	}
+
+
+// Encodings from ARM ARM DDI0406A, section 9.2.1
+enum TThumb2EEOpcode
+	{
+	EThumb2HDP,		// Handler Branch with Parameter
+	EThumb2UNDEF,	// UNDEFINED
+	EThumb2HB,		// Handler Branch, Handler Branch with Link
+	EThumb2HBLP,	// Handle Branch with Link and Parameter
+	EThumb2LDRF,	// Load Register from a frame
+	EThumb2CHKA,	// Check Array
+	EThumb2LDRL,	// Load Register from a literal pool
+	EThumb2LDRA,	// Load Register (array operations)
+	EThumb2STR		// Store Register to a frame
+	};
+
+//
+// DRMDStepping::ShiftedRegValue
+//
+TUint32 DRMDStepping::ShiftedRegValue(DThread *aThread, TUint32 aInstruction, TUint32 aCurrentPC, TUint32 aStatusRegister)
+	{
+	LOG_MSG("DRMDStepping::ShiftedRegValue()");
+
+	TUint32 shift = 0;
+	if (aInstruction & 0x10)	// bit 4
+		{
+		shift = (arm_rs(aInstruction) == PC_REGISTER ? aCurrentPC + 8 : aStatusRegister) & 0xFF;
+		}
+	else
+		{
+		shift = arm_data_c(aInstruction);
+		}
+	
+	TInt rm = arm_rm(aInstruction);
+	
+	TUint32 res = 0;
+	if(rm == PC_REGISTER)
+		{
+		res = aCurrentPC + ((aInstruction & 0x10) ? 12 : 8);
+		}
+	else
+		{
+		TInt err = iChannel->ReadKernelRegisterValue(aThread, rm, res);
+		if(err != KErrNone)
+			{
+			LOG_MSG2("DRMDStepping::ShiftedRegValue - Non-zero error code discarded: %d", err);
+			}
+		}
+
+	switch(arm_data_shift(aInstruction))
+		{
+		case 0:			// LSL
+			{
+			res = shift >= 32 ? 0 : res << shift;
+			break;
+			}
+		case 1:			// LSR
+			{
+			res = shift >= 32 ? 0 : res >> shift;
+			break;
+			}
+		case 2:			// ASR
+			{
+			if (shift >= 32)
+			shift = 31;
+			res = ((res & 0x80000000L) ? ~((~res) >> shift) : res >> shift);
+			break;
+			}
+		case 3:			// ROR/RRX
+			{
+			shift &= 31;
+			if (shift == 0)
+				{
+				res = (res >> 1) | ((aStatusRegister & arm_carry_bit()) ? 0x80000000L : 0);
+				}
+			else
+				{
+				res = (res >> shift) | (res << (32 - shift));
+				}
+			break;
+			}
+		}
+
+	return res & 0xFFFFFFFF;
+}
+
+//
+// DRMDStepping::CurrentPC
+//
+// 
+//
+TInt DRMDStepping::CurrentPC(DThread* aThread, TUint32& aPC)
+	{
+	LOG_MSG("DRMDStepping::CurrentPC");
+
+	TInt err = iChannel->ReadKernelRegisterValue(aThread, PC_REGISTER, aPC);
+	if(err != KErrNone)
+		{
+		// We don't know the current PC for this thread!
+		LOG_MSG("DRMDStepping::CurrentPC - Failed to read the current PC");
+		
+		return KErrGeneral;
+		}
+
+	LOG_MSG2("DRMDStepping::CurrentPC 0x%08x", aPC);
+
+	return KErrNone;
+	}
+
+//
+// DRMDStepping::CurrentCPSR
+//
+// 
+//
+TInt DRMDStepping::CurrentCPSR(DThread* aThread, TUint32& aCPSR)
+	{
+	LOG_MSG("DRMDStepping::CurrentCPSR");
+
+	TInt err = iChannel->ReadKernelRegisterValue(aThread, STATUS_REGISTER, aCPSR);
+	if(err != KErrNone)
+		{
+		// We don't know the current PC for this thread!
+		LOG_MSG("DRMDStepping::CurrentPC - Failed to read the current CPSR");
+		
+		return KErrGeneral;
+		}
+
+	LOG_MSG2("DRMDStepping::CurrentCPSR 0x%08x", aCPSR);
+	
+	return KErrNone;
+	}
+
+//
+// DRMDStepping::ModifyBreaksForStep
+//
+// Set a temporary breakpoint at the next instruction to be executed after the one at the current PC
+// Disable the breakpoint at the current PC if one exists
+//
+TInt DRMDStepping::ModifyBreaksForStep(DThread *aThread, TUint32 aRangeStart, TUint32 aRangeEnd, /*TBool aStepInto,*/ TBool aResumeOnceOutOfRange, TBool aCheckForStubs, const TUint32 aNumSteps)
+	{
+	LOG_MSG2("DRMDStepping::ModifyBreaksForStep() Numsteps 0x%d",aNumSteps);
+
+	// Validate arguments
+	if (!aThread)
+		{
+		LOG_MSG("DRMDStepping::ModifyBreaksForStep() - No aThread specified to step");
+		return KErrArgument;
+		}
+
+	// Current PC
+	TUint32 currentPC;
+
+	ReturnIfError(CurrentPC(aThread,currentPC));
+	LOG_MSG2("Current PC: 0x%x", currentPC);
+
+	// disable breakpoint at the current PC if necessary
+	ReturnIfError(iChannel->iBreakManager->DisableBreakAtAddress(currentPC));
+
+	// Current CPSR
+	TUint32 statusRegister;
+
+	ReturnIfError(CurrentCPSR(aThread,statusRegister));
+	LOG_MSG2("Current CPSR: %x", statusRegister);
+
+	TBool thumbMode = (statusRegister & ECpuThumb);
+	if (thumbMode)
+		LOG_MSG("Thumb Mode");
+
+	TInt instSize = thumbMode ? 2 : 4;
+
+	TBool changingModes = EFalse;
+
+	TUint32 breakAddress = 0;
+
+	TUint32 newRangeEnd = aRangeEnd;
+
+	breakAddress = PCAfterInstructionExecutes(aThread, currentPC, statusRegister, instSize, /* aStepInto, */ newRangeEnd, changingModes);
+
+	/*
+	If there is already a user breakpoint at this address, we do not need to set a temp breakpoint. The program
+	should simply stop at that address.	
+	*/
+	TBreakEntry* breakEntry = NULL;
+	do
+		{
+		breakEntry = iChannel->iBreakManager->GetNextBreak(breakEntry);
+		if(breakEntry && !iChannel->iBreakManager->IsTemporaryBreak(*breakEntry))
+			{
+			if ((breakEntry->iAddress == breakAddress) && ((breakEntry->iThreadSpecific && breakEntry->iId == aThread->iId) || (!breakEntry->iThreadSpecific && breakEntry->iId == aThread->iOwningProcess->iId)))
+				{
+				LOG_MSG("DRMDStepping::ModifyBreaksForStep - Breakpoint already exists at the step target address\n");
+
+				// note also that if this is the case, we will not keep stepping if we hit a real breakpoint, so may as well set
+				// the step count = 0.
+				breakEntry->iNumSteps = 0;
+
+				return KErrNone;
+				}
+			}
+		} while(breakEntry);
+
+	breakEntry = NULL;
+	do
+		{
+		breakEntry = iChannel->iBreakManager->GetNextBreak(breakEntry);
+		if(breakEntry && iChannel->iBreakManager->IsTemporaryBreak(*breakEntry))
+			{
+			if (breakEntry->iAddress == 0)
+				{
+				breakEntry->iId = aThread->iId;
+				breakEntry->iAddress = breakAddress;
+				breakEntry->iThreadSpecific = ETrue;
+
+				TBool realThumbMode = (thumbMode && !changingModes) || (!thumbMode && changingModes);
+
+				// Need to set the correct type of breakpoint for the mode we are in
+				// and the the one we are changing into
+				if(realThumbMode)
+					{
+					// We are remaining in Thumb mode
+					breakEntry->iMode = EThumbMode;
+					}
+				else
+					{
+					// We are switching to ARM mode
+					breakEntry->iMode = EArmMode;
+					}
+
+				breakEntry->iResumeOnceOutOfRange = aResumeOnceOutOfRange;
+				breakEntry->iSteppingInto = ETrue /* aStepInto */;
+				breakEntry->iRangeStart = 0;	// no longer used
+				breakEntry->iRangeEnd = 0;		// no longer used
+
+				LOG_MSG2("Adding temp breakpoint with id: %d", breakEntry->iBreakId);
+				LOG_MSG2("Adding temp breakpoint with thread id: %d", aThread->iId);
+
+				// Record how many more steps to go after we hit this one
+				breakEntry->iNumSteps = aNumSteps;
+
+				LOG_MSG3("Setting temp breakpoint id %d with %d steps to go\n", breakEntry->iBreakId, aNumSteps);
+
+				return iChannel->iBreakManager->DoEnableBreak(*breakEntry, ETrue);			
+				}
+			}
+		} while(breakEntry);
+	LOG_MSG("ModifyBreaksForStep : Failed to set suitable breakpoint for stepping");
+	return KErrNoMemory;	// should never get here
+}
+
+// End of file - d-rmd-stepping.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/src/d_target_process.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Purpose: The DProcessTracker object tracks which processes are being
+// debugged. The DProcessTracker class uses a DTargetProcess object for
+// each process being debugged.
+// Note: Although TheDProcessTracker object is a global, it should be unique
+// as only the Debug Security Server should load and use this driver.
+//
+//
+
+#include <e32def.h>
+#include <e32def_private.h>
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include <kernel/kernel.h>
+#include <kernel/kern_priv.h>
+#include "nk_priv.h"
+#include <rm_debug_api.h>
+
+#include "d_target_process.h"
+#include "debug_logging.h"
+#include "debug_utils.h"
+
+// ctor
+DTargetProcess::DTargetProcess()
+	:iProcessName(NULL)
+	{
+	}
+
+// dtor
+DTargetProcess::~DTargetProcess()
+	{
+	delete iProcessName;
+	iAgentList.ResetAndDestroy();
+	}
+
+// Compare two DTargetProcess items. They are the same if they have the same name.
+TInt DTargetProcess::Compare(const DTargetProcess& aFirst, const DTargetProcess& aSecond)
+	{
+	const TDesC& left = aFirst.iProcessName ? *aFirst.iProcessName : KNullDesC();
+	const TDesC& right = aSecond.iProcessName ? *aSecond.iProcessName : KNullDesC();
+	return left.Compare(right);
+	}
+
+// Set the name of the process we are tracking
+TInt DTargetProcess::SetProcessName(const TDesC8& aProcessName)
+	{
+	// Argument checking
+	if (aProcessName.Length() < 1)
+		{
+		return KErrArgument;
+		}
+
+	if (iProcessName) 
+		return KErrNotReady; // You can only set the processname once
+	iProcessName = HBuf8::New(aProcessName);
+	if (!iProcessName) 
+		return KErrNoMemory;
+	return KErrNone;
+	}
+
+// Obtain the name of the process being tracked
+const TDesC& DTargetProcess::ProcessName() const
+	{
+	return iProcessName ? *iProcessName : KNullDesC();
+	}
+
+// Returns a pointer to the DDebugAgent with aAgentId.
+// If the agent is not in the list, it returns NULL.
+DDebugAgent* DTargetProcess::Agent(TUint64 aAgentId)
+	{
+	for(TInt i = 0; i < iAgentList.Count(); i++)
+		{
+		if (iAgentList[i]->Id() == aAgentId)
+			{
+			return iAgentList[i];
+			}
+		}
+
+	// what do we return if we don't have any agents?
+	return NULL;
+	}
+
+// Adds aAgentId as a tracking agent for this process.
+TInt DTargetProcess::AddAgent(TUint64 aAgentId)
+	{
+	DDebugAgent* agent = DDebugAgent::New(aAgentId);
+	LOG_MSG4("DTargetProcess::AddAgent(), agentId=%d, curr iAgentList.Count=%d, new agent=0x%08x",
+		I64LOW(aAgentId), iAgentList.Count(), agent );
+
+	if(agent == NULL)
+		{
+		LOG_MSG("DTargetProcess::AddAgent() couldn't allocate memory for DDebugAgent");
+		return KErrNoMemory;
+		}
+	return iAgentList.Insert(agent,0);
+	}
+
+// Stops tracking the process with this agent
+TInt DTargetProcess::RemoveAgent(TUint64 aAgentId)
+	{
+	// We need to find and then remove the agent
+	for(TUint i = 0; i < iAgentList.Count(); i++)
+		{
+		if (iAgentList[i]->Id() == aAgentId)
+			{
+			LOG_MSG4("DTargetProcess::RemoveAgent(), deleting agent[%d], id 0x%x, address=0x%x",
+					i, I64LOW(aAgentId), iAgentList[i]); 
+			delete iAgentList[i];
+			iAgentList.Remove(i);
+			return KErrNone;
+			}
+		}
+
+	return KErrNotFound;
+	}
+
+// Index through the agents by position
+DDebugAgent* DTargetProcess::operator[](TInt aIndex)
+	{
+	return iAgentList[aIndex];
+	}
+
+// returns the number of agents tracking this process.
+TInt DTargetProcess::AgentCount() const
+	{
+	return iAgentList.Count();
+	}
+
+void DTargetProcess::NotifyEvent(const TDriverEventInfo& aEventInfo)
+	{
+	// Stuff the event info into all the tracking agents event queues
+	LOG_MSG4("DTargetProcess::NotifyEvent(): num attached agents: %d, iEventType=%d, this=0x%08x", 
+		AgentCount(), aEventInfo.iEventType, this);
+
+	for(TInt i = 0; i < AgentCount(); i++)
+		{
+		// Index through all the relevant debug agents
+		DDebugAgent* debugAgent = iAgentList[i];
+		if(debugAgent != NULL)
+			{
+			debugAgent->NotifyEvent(aEventInfo);
+			}
+		}
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/src/debug_utils.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,134 @@
+// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Purpose: Implementation of static functions for use by debug driver classes
+//
+
+#include "debug_logging.h"
+#include "debug_utils.h"
+
+/**
+ * Given a thread ID, return a handle to the corresponding DThread. If the returned
+ * pointer is non-NULL, it is the responsibility of the caller to close the handle.
+ * 
+ * @pre caller must be in thread critical section
+ * @post if a non-NULL value is returned then a handle to the thread has been
+ * opened on the callers behalf
+ * @param aThreadId ID of the thread to return a handle for
+ * @return a DThread* to the appropriate thread, or NULL if a handle could not be
+ * opened to the specified thread
+ */
+DThread* DebugUtils::OpenThreadHandle(TUint64 aThreadId)
+	{
+	__ASSERT_CRITICAL;
+	LOG_MSG2("DebugUtils::OpenThreadHandle(0x%lx)", aThreadId);
+
+	DObjectCon& threads = *Kern::Containers()[EThread];  // Get containing holding threads
+	threads.Wait();  // Obtain the container mutex so the list does get changed under us
+
+	DThread* thread = Kern::ThreadFromId(aThreadId);
+
+	// Open a handle to the thread so that it doesn't exit while we are processing
+	if (thread)
+		{
+		// if opening a handle fails then set thread to NULL
+		if(KErrNone != thread->Open())
+			{
+			LOG_MSG2("\tCould not open handle to thread %d", (TUint32)aThreadId);
+			thread = NULL;
+			}
+		}
+	else
+		{
+		LOG_MSG2("\tThread with ID %d is NULL", (TUint32)aThreadId);
+		}
+
+	threads.Signal();  // Release the container mutex
+
+	return thread;
+	}
+
+/**
+ * Given a process ID, return a handle to the corresponding DProcess. If the returned
+ * pointer is non-NULL, it is the responsibility of the caller to close the handle.
+ * 
+ * @post if a non-NULL value is returned then a handle to the process has been
+ * opened on the callers behalf
+ * @param aProcessId ID of the process to return a handle for
+ * @return a DProcess* to the appropriate process, or NULL if a handle could not be
+ * opened to the specified process
+ */
+DProcess* DebugUtils::OpenProcessHandle(const TUint64 aProcessId)
+	{
+	// Commenting out this message as it gets printed out every time a RDebug::Printf statement is caught by the driver,
+	// which makes looking at the serial cable output irritating. Replaced it with LOG_MSG statements below to indicate if
+	// something amiss happened. By default then this function prints nothing out.
+	//LOG_MSG("DebugUtils::OpenProcessHandle()");
+
+	NKern::ThreadEnterCS();  // Prevent us from dying or suspending whilst holding a DMutex
+	DObjectCon& processes = *Kern::Containers()[EProcess];  // Get containing holding threads
+	processes.Wait();  // Obtain the container mutex so the list does get changed under us
+
+	DProcess* process = Kern::ProcessFromId(aProcessId);
+
+	// Open a handle to the process so that it doesn't exit while we are processing
+	if (process)
+		{
+		// if opening a handle fails then set process to NULL
+		if(KErrNone != process->Open())
+			{
+			LOG_MSG2("DebugUtils::OpenProcessHandle(): Could not open handle for 0x%lx", aProcessId);
+			process = NULL;
+			}
+		}
+	else
+		{
+		LOG_MSG2("DebugUtils::OpenProcessHandle(): Could not find process for 0x%lx", aProcessId);
+		}
+
+	processes.Signal();  // Release the container mutex
+	NKern::ThreadLeaveCS();  // End of critical section
+
+	return process;
+	}
+
+/**
+ * Opens a reference to the first thread of the given process. Returns NULL if
+ * there are no threads remaining in the process or if the thread couldn't be opened.
+ * 
+ * @pre Caller must be in thread context, in critical section, no fast mutexes held.
+ * @post if result is non-NULL caller is responsible for closing the handle
+ * @param aProcess The process whose first thread is to be opened
+ * @return an Open()ed pointer to the first thread in the process, or NULL.
+ */
+DThread* DebugUtils::OpenFirstThreadForProcess(DProcess* aProcess)
+	{
+	__ASSERT_CRITICAL;
+	// Copied from memspy's DMemSpyDriverOSAdaptionDProcess::OpenFirstThread()
+
+	// It appears that the system lock needs to be held while manipulating the iThreadQ
+	DThread* result = NULL;
+	NKern::LockSystem();
+	// We don't use DProcess::FirstThread() as that doesn't appear to do any checking of whether the list is empty, ie if there are no threads at all
+	SDblQueLink* threadLink = aProcess->iThreadQ.First();
+	if (threadLink != NULL && threadLink != &aProcess->iThreadQ.iA)
+		{
+		result = _LOFF(threadLink,DThread,iProcessLink);
+		if (result->Open() != KErrNone)
+			{
+			result = NULL;
+			}
+		}
+	NKern::UnlockSystem();
+    return result;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/src/rm_debug_eventhandler.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,177 @@
+// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Kernel Event handler for Run Mode Debug.
+//
+
+#include <e32def.h>
+#include <e32def_private.h>
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include <kernel/arm/arm.h>
+#include <kernel/kernel.h>
+#include <kernel/kern_priv.h>
+#include <nk_trace.h>
+
+#include <rm_debug_api.h>
+#include "debug_logging.h"
+#include "d_process_tracker.h"
+#include "d_rmd_stepping.h"
+#include "rm_debug_kerneldriver.h"
+#include "rm_debug_driver.h"
+#include "rm_debug_eventhandler.h"
+
+
+DRM_DebugEventHandler::DRM_DebugEventHandler()
+	:	DKernelEventHandler(EventHandler, this)
+{
+	LOG_MSG("DRM_DebugEventHandler::DRM_DebugEventHandler()");
+
+	for(TInt i=0; i<EEventLimit; i++)
+		{
+		iEventHandlers[i] = &DRM_DebugChannel::HandleUnsupportedEvent;
+		}
+	iEventHandlers[EEventUserTrace] = &DRM_DebugChannel::HandleUserTrace;
+	iEventHandlers[EEventRemoveLibrary] = &DRM_DebugChannel::RemoveLibrary;
+	iEventHandlers[EEventAddLibrary] = &DRM_DebugChannel::AddLibrary;
+	iEventHandlers[EEventStartThread] = &DRM_DebugChannel::StartThread;
+	iEventHandlers[EEventSwExc] = &DRM_DebugChannel::HandleSwException;
+	iEventHandlers[EEventHwExc] = &DRM_DebugChannel::HandleHwException;
+	iEventHandlers[EEventKillThread] = &DRM_DebugChannel::HandleEventKillThread;
+	iEventHandlers[EEventAddProcess] = &DRM_DebugChannel::HandleAddProcessEvent;
+	iEventHandlers[EEventRemoveProcess] = &DRM_DebugChannel::HandleRemoveProcessEvent;
+}
+
+TInt DRM_DebugEventHandler::Create(DLogicalDevice* aDevice, DLogicalChannel* aChannel, DThread* aClient)
+{
+	LOG_MSG3("DRM_DebugEventHandler::Create(), aClientthread=0x%08x id=%d", aClient, aClient->iId);
+
+	TInt err;
+	err = aDevice->Open();
+	if (err != KErrNone)
+		return err;
+	iDevice = aDevice;
+	
+	iChannel = (DRM_DebugChannel*)aChannel; //Don't add ref the channel, since channel closes the event handler before it ever gets destroyed.
+
+	err = aClient->Open();
+	if (err != KErrNone)
+		return err;
+	iClientThread = aClient;
+
+	// Use a semaphore to protect our data structures from concurrent access.
+	err = Kern::SemaphoreCreate(iProtectionLock, _L("RM_DebugEventHandlerLock"), 1 /* Initial count */);
+	if (err != KErrNone)
+		return err;
+
+
+	return Add();
+}
+
+
+DRM_DebugEventHandler::~DRM_DebugEventHandler()
+{
+	LOG_MSG("DRM_DebugEventHandler::~DRM_DebugEventHandler()");
+
+	if (iProtectionLock)
+		iProtectionLock->Close(NULL);
+	
+	if (iDevice)
+		iDevice->Close(NULL);	
+	
+	if (iClientThread)
+		Kern::SafeClose((DObject*&)iClientThread, NULL);
+		
+}
+
+
+TInt DRM_DebugEventHandler::Start()
+{
+	LOG_MSG("DRM_DebugEventHandler::Start()");
+
+	iTracking = ETrue;
+
+	return KErrNone;
+}
+
+
+TInt DRM_DebugEventHandler::Stop()
+{
+	LOG_MSG("DRM_DebugEventHandler::Stop()");
+
+	iTracking = EFalse;
+
+	return KErrNone;
+}
+
+
+TUint DRM_DebugEventHandler::EventHandler(TKernelEvent aType, TAny* a1, TAny* a2, TAny* aThis)
+{
+	return ((DRM_DebugEventHandler*)aThis)->HandleEvent(aType, a1, a2);
+}
+
+
+
+TUint DRM_DebugEventHandler::HandleEvent(TKernelEvent aType, TAny* a1, TAny* a2)
+	{
+	
+	/*
+	 * Check if we are tracking things at all OR 
+	 * this event is beyond the limit of known events OR 
+	 * this event is from the debug thread itself (don't want to debug ourselves) OR
+	 * this event has a handler (there is no point in proceeding without a handler)
+	 */
+	if( (!iTracking) || 
+			(aType > (TUint32)EEventLimit) ||
+			(iClientThread == &Kern::CurrentThread()) ||
+	    (iEventHandlers[aType] == &DRM_DebugChannel::HandleUnsupportedEvent) )
+		{
+		return ERunNext;
+		}
+	
+	return HandleSpecificEvent(aType,a1,a2) && aType == EEventHwExc ? EExcHandled : ERunNext;
+
+
+	}
+
+TBool DRM_DebugEventHandler::HandleSpecificEvent(TKernelEvent aType, TAny* a1, TAny* a2)
+	{
+	TBool ret = EFalse;
+
+	NKern::ThreadEnterCS();
+	LockDataAccess();
+
+
+	if (iChannel)
+		{
+		ret = (iChannel->*(iEventHandlers[aType]))(a1, a2);
+		}
+	ReleaseDataAccess();
+	NKern::ThreadLeaveCS();
+
+	switch(aType)
+		{
+		case EEventHwExc:
+		case EEventKillThread:
+			{
+			LOG_MSG2("DRM_DebugEventHandler::HandleEvent() -> FSWait(), kernel event type: %d", (TUint32)aType);
+			TheDProcessTracker.FSWait();
+			LOG_MSG("DRM_DebugEventHandler::HandleEvent() <- FSWait()");
+			break;
+			}
+		default:
+			break;
+		}
+	return ret;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/rmdriver/src/rm_debug_kerneldriver.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3530 @@
+// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Device driver for kernel side debug assist
+//
+
+#ifdef __WINS__
+#error - this driver cannot be built for emulation
+#endif
+
+#include <e32def.h>
+#include <e32def_private.h>
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include <e32ldr.h>
+#include <u32std.h>
+#include <kernel/kernel.h>
+#include <kernel/kern_priv.h>
+#include <nk_trace.h>
+#include <arm.h>
+#include <kernel/cache.h>
+#include <platform.h>
+#include <nkern.h>
+#include <u32hal.h>
+#include <rm_debug_api.h>
+
+#include "debug_logging.h"
+#include "d_rmd_breakpoints.h"	// moved breakpoints code lives here
+#include "d_rmd_stepping.h"		// moved stepping code lives here
+#include "rm_debug_kerneldriver.h"
+#include "d_list_manager.h"
+#include "rm_debug_driver.h"
+#include "rm_debug_eventhandler.h"
+#include "d_debug_functionality.h"
+#include "d_process_tracker.h"
+#include "debug_utils.h"
+
+using namespace Debug;
+
+/////////////////////////////////////////////////////////////////////////
+//
+// DRM_DebugDriverFactory implementation
+//
+/////////////////////////////////////////////////////////////////////////
+
+//
+// DRM_DebugDriverFactory constructor
+//
+DRM_DebugDriverFactory::DRM_DebugDriverFactory()
+	{
+	iVersion = TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber);
+	}
+
+//
+// DRM_DebugDriverFactory::Create
+//
+TInt DRM_DebugDriverFactory::Create(DLogicalChannelBase*& aChannel)
+	{
+	if (iOpenChannels != 0)
+		return KErrInUse; // a channel is already open
+
+	aChannel = new DRM_DebugChannel(this);
+
+	return aChannel ? KErrNone : KErrNoMemory;
+	}
+
+//
+// DRM_DebugDriverFactory::Install
+//
+TInt DRM_DebugDriverFactory::Install()
+	{
+	return(SetName(&KRM_DebugDriverName));
+	}
+
+//
+// DRM_DebugDriverFactory::Install
+//
+void DRM_DebugDriverFactory::GetCaps(TDes8& aDes) const
+	{
+	TCapsRM_DebugDriver b;
+	b.iVersion = TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber);
+
+	Kern::InfoCopy(aDes,(TUint8*)&b,sizeof(b));
+	}
+
+/////////////////////////////////////////////////////////////////////////
+//
+// DRM_DebugChannel implementation
+//
+/////////////////////////////////////////////////////////////////////////
+
+//
+// DRM_DebugChannel constructor
+//
+DRM_DebugChannel::DRM_DebugChannel(DLogicalDevice* aLogicalDevice)
+	: iExcludedROMAddressStart(ROM_LINEAR_BASE),
+	iExcludedROMAddressEnd(0),
+	iPageSize(0x1000),
+	iBreakManager(0),
+	iStepper(0),
+	iStepLock(0),
+	iDfcQ(NULL),
+	iInitialisedCodeModifier(0),
+	iAsyncGetValueRequest(NULL)
+	{
+	LOG_MSG("DRM_DebugChannel::DRM_DebugChannel()");
+
+	iDevice = aLogicalDevice;
+
+	iClientThread = &Kern::CurrentThread();	
+	
+	// Opening handle to current thread, so no need to check for return-value
+	(void)iClientThread->Open();
+
+	LOG_MSG3("DRM_DebugChannel::DRM_DebugChannel() clientThread = 0x%08x, id=%d", 
+	            iClientThread, iClientThread->iId );
+
+
+	iPageSize = Kern::RoundToPageSize(1);
+	}
+
+//
+// DRM_DebugChannel destructor
+//
+DRM_DebugChannel::~DRM_DebugChannel()
+	{
+	LOG_MSG("DRM_DebugChannel::~DRM_DebugChannel()");
+
+	if (iAsyncGetValueRequest)
+		{
+		Kern::QueueRequestComplete(iClientThread, iAsyncGetValueRequest, KErrCancel); // does nothing if request not pending
+		Kern::DestroyClientRequest(iAsyncGetValueRequest);
+		}
+
+	NKern::ThreadEnterCS();
+	Kern::SafeClose((DObject*&)iClientThread, NULL);
+	NKern::ThreadLeaveCS();
+
+	// Close breakpoint manager
+	if (iBreakManager)
+		{
+		NKern::ThreadEnterCS();
+		delete iBreakManager;
+		NKern::ThreadLeaveCS();
+		}
+
+	// Close stepping manager
+	if (iStepper)
+		{
+		NKern::ThreadEnterCS();
+		delete iStepper;
+		NKern::ThreadLeaveCS();
+		}
+
+	//close the debug process list
+	iDebugProcessList.Close();
+
+	DestroyDfcQ();
+
+	//close the code modifier
+	if (iInitialisedCodeModifier)
+		{
+		DebugSupport::CloseCodeModifier();
+		}
+	}
+
+void DRM_DebugChannel::DestroyDfcQ()
+	{
+	LOG_MSG("DRM_DebugChannel::DestroyDfcQ()");
+	if (iDfcQ)
+		{
+		NKern::ThreadEnterCS();
+		iDfcQ->Destroy();
+		NKern::ThreadLeaveCS();
+		}
+	}
+
+//
+// DRM_DebugChannel::DoCreate
+//
+TInt DRM_DebugChannel::DoCreate(TInt /*aUnit*/, const TDesC* anInfo, const TVersion& aVer)
+	{
+	LOG_MSG("DRM_DebugChannel::DoCreate()");
+	TInt err = Kern::CreateClientDataRequest(iAsyncGetValueRequest);
+	if(err != KErrNone)
+		return err;
+
+	if (!Kern::QueryVersionSupported(TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber), aVer))
+		return KErrNotSupported;
+
+	// Do the security check here so that any arbitrary application doesn't make
+	// use of Trk kernel driver.
+	if (!DoSecurityCheck())
+		{
+		LOG_MSG("DRM_DebugChannel::DoCreate() - permission denied!");
+			return KErrPermissionDenied;
+		}
+
+	if (anInfo)
+		{
+		// this is the end address of the user library.
+		// this doesn't seem to be valid for EKA2.
+		// right now we dont need this for EKA2 since we are not worried
+		// about kernel being stopped as kernel is multithreaded.
+		// just retaining this for future use.
+		TBuf8<32> buf;
+		TInt err = Kern::ThreadRawRead(iClientThread, anInfo, &buf, 32);
+		if(err != KErrNone)
+			return err;
+		}
+
+	// Allocate a D_RMD_Breakpoints class as a breakpoint manager
+	NKern::ThreadEnterCS();
+	iBreakManager = new D_RMD_Breakpoints(this);
+	NKern::ThreadLeaveCS();
+	if (iBreakManager == NULL)
+		{
+		LOG_MSG("DRM_DebugChannel::DRM_DebugChannel - could not construct breakpoint manager");
+		return KErrNoMemory;
+		}
+
+	// Initialise the new breakpoint manager object
+	iBreakManager->Init();
+
+	// Allocate a DRMDStepping class as the stepping manager
+	NKern::ThreadEnterCS();
+	iStepper = new DRMDStepping(this);
+	NKern::ThreadLeaveCS();
+	if (iStepper == NULL)
+		{
+		LOG_MSG("DRM_DebugChannel::DRM_DebugChannel - could not construct stepper manager");
+		return KErrNoMemory;
+		}
+
+	// Initialize the code modifier for managing breakpoints.
+	TUint caps; //ignored for now
+	err = DebugSupport::InitialiseCodeModifier(caps, NUMBER_OF_MAX_BREAKPOINTS);
+	//if code modifier initializer failed,
+	//return here, since we can't set an breakpoints
+	if(err != KErrNone)
+		{
+		return err;
+		}
+	else
+		{
+		iInitialisedCodeModifier = ETrue;
+		}
+
+	//create and set the driver's Dfc queue
+	err = CreateDfcQ();
+	if(err != KErrNone)
+		{
+		LOG_MSG("DRM_DebugChannel::DoCreate() Creating Dfc queue failed.");
+		}
+	SetDfcQ(iDfcQ);
+
+	iMsgQ.Receive();
+
+	iEventHandler = new DRM_DebugEventHandler;
+	if (!iEventHandler)
+		return KErrNoMemory;
+	err = iEventHandler->Create(iDevice, this, iClientThread);
+	if (err != KErrNone)
+		return err;
+
+	//return KErrNone;
+	return iEventHandler->Start();
+	}
+
+/**
+Forward call to either synch or asynch methods while serialising all calls via lock.
+ 
+Protect access via a the event handler lock to 
+serialise all calls and protect concurrent access to data structures
+
+@param aMsg pointer to a TMessageBase object 
+
+@return error returned by called methods
+
+@see DRM_DebugEventHandler::HandleSpecificEvent where lock is also used
+@see DRM_DebugEventHandler::iProtectionLock
+
+*/
+TInt DRM_DebugChannel::SendMsg(TMessageBase* aMsg)
+	{
+	DThread * currThread = &Kern::CurrentThread();
+
+	iEventHandler->LockDataAccess();
+	LOG_MSG3("DRM_DebugChannel::SendMsg() currThread = 0x%08x, iClientThread=0x%08x", currThread, iClientThread );
+	
+	TThreadMessage& m = *(TThreadMessage*)aMsg;
+	TInt id = m.iValue;
+	TInt err = KErrNone;
+
+	if (id != (TInt)ECloseMsg && id != KMaxTInt && id < 0)
+		{
+		// DoRequest
+		TRequestStatus* pStatus = (TRequestStatus*)m.Ptr0();
+		err = SendRequest(aMsg);
+		if (err != KErrNone)
+			Kern::RequestComplete(pStatus,err);
+		}
+	else
+		{
+		err = DLogicalChannel::SendMsg(aMsg);
+		}
+	
+	iEventHandler->ReleaseDataAccess();
+	return err;
+	}
+
+//
+// DRM_DebugChannel::SendRequest
+//
+TInt DRM_DebugChannel::SendRequest(TMessageBase* aMsg)
+	{
+	LOG_MSG("DRM_DebugChannel::SendRequest()");
+
+	TThreadMessage& m = *(TThreadMessage*)aMsg;
+	TInt function = ~m.iValue;
+	TRequestStatus* pStatus = (TRequestStatus*)m.Ptr0();
+	TAny* a1 = m.Ptr1();
+
+	TInt err = KErrNotSupported;
+	switch(function)
+		{
+		case RRM_DebugDriver::ERequestGetEvent:
+			err = PreAsyncGetValue((TEventInfo*)a1,pStatus);
+			break;
+		}
+	if (err == KErrNone)
+		err = DLogicalChannel::SendMsg(aMsg);
+	return err;
+	}
+
+//
+// DRM_DebugChannel::PreAsyncGetValue
+//
+TInt DRM_DebugChannel::PreAsyncGetValue(TEventInfo* aValue, TRequestStatus* aStatus)
+	{
+	LOG_MSG3("DRM_DebugChannel::PreAsyncGetValue() TEventInfo=0x%08x, TRequestStatus=0x%08x",
+		aValue, aStatus );
+	
+	iAsyncGetValueRequest->Reset();
+	
+	TInt err = iAsyncGetValueRequest->SetStatus(aStatus);
+	if (err != KErrNone)
+		return err;
+	
+	iAsyncGetValueRequest->SetDestPtr(aValue);
+	return KErrNone;
+	}
+
+/**
+  Create the Dfc queue for receiving messages
+  */
+TInt DRM_DebugChannel::CreateDfcQ()
+	{
+	LOG_MSG("DRM_DebugChannel::CreateDfcQ()");
+	TInt r = Kern::DynamicDfcQCreate(iDfcQ, KRmDebugDriverThreadPriority, KRM_DebugDriverName);
+
+	if (r == KErrNone)
+		iDfcQ->SetRealtimeState(ERealtimeStateOff);
+	return r;
+	}
+
+//
+// DRM_DebugChannel::DoCancel
+//
+// New: The cancel call does not take an enum parameter describing
+// the request to be cancelled. Rather it supplies a pointer
+// to a user-side struct defining the cancellation
+//
+void DRM_DebugChannel::DoCancel(TInt aReqNo)
+	{
+	LOG_MSG("DRM_DebugChannel::DoCancel()");
+
+	TRMD_DebugCancelInfo info;
+
+	TInt err = Kern::ThreadRawRead(iClientThread,(TAny*)aReqNo,(TAny*)&info,sizeof(info));
+	if (err != KErrNone)
+		{
+		// How do we cancel something we know nothing about???
+		LOG_MSG("DRM_DebugChannel::DoCancel - bad arguments");
+		return;
+		}
+
+	DDebugAgent* debugAgent = TheDProcessTracker.FindAgentForProcessAndId(info.iProcessName, info.iAgentId);
+	if (debugAgent == NULL)
+		{
+		// Bad agent means there is no tracking agent
+		LOG_MSG2("Cannot locate debug agent with pid 0x%x", info.iAgentId);
+		return;
+		}
+
+	// Agent completes/pends the request as appropriate.
+	debugAgent->CancelGetEvent();
+
+	}
+
+//
+// DRM_DebugChannel::DoRequest
+//
+void DRM_DebugChannel::DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2)
+	{
+	LOG_MSG4("DRM_DebugChannel::DoRequest(), iClientThread=0x%08x, tid=0x%08x, TRequestStatus=0x%08x", 
+		iClientThread, I64LOW(iClientThread->iId), aStatus);
+
+	switch(aReqNo)
+		{
+		case RRM_DebugDriver::ERequestGetEvent:
+			{
+			TEventMetaData eventMetaData;
+			TInt err = Kern::ThreadRawRead(iClientThread, a2, (TUint8 *)&eventMetaData, sizeof(TEventMetaData) );
+			if (err != KErrNone)
+				{
+				LOG_MSG("Error: could not read argument data from the DSS (TEventMetaData)");
+
+				// We could not read information from the user, so the a2 argument is probably wrong
+				Kern::RequestComplete(iClientThread, aStatus, KErrArgument);
+				return;
+				}
+
+			DDebugAgent* debugAgent = TheDProcessTracker.FindAgentForProcessAndId(eventMetaData.iTargetProcessName, eventMetaData.iDebugAgentProcessId);
+			if (debugAgent == NULL)
+				{
+				// Bad agent means there is no tracking agent
+				LOG_MSG2("Cannot locate debug agent with pid 0x%x", eventMetaData.iDebugAgentProcessId);
+				Kern::RequestComplete(iClientThread, aStatus, KErrNotFound);
+				return;
+				}
+			// Agent completes/pends the request as appropriate.
+			debugAgent->GetEvent(iAsyncGetValueRequest, iClientThread);
+
+			break;
+			}
+		default:
+			{
+			// Should not get here!
+			LOG_MSG2("DRM_DebugChannel::DoRequest was passed unsupported request aReqNo=%d", aReqNo );
+			Kern::RequestComplete(iClientThread, aStatus, KErrNotSupported);
+			}
+		}
+	}
+
+//
+// DRM_DebugChannel::DoControl
+//
+TInt DRM_DebugChannel::DoControl(TInt aFunction, TAny* a1, TAny* a2)
+	{
+	LOG_MSG("DRM_DebugChannel::DoControl()");
+
+	LOG_MSG2("DoControl Function %d", aFunction);
+
+	TInt err = KErrNone;
+	DThread* threadObj = NULL;
+	// Open a thread handle for the operations that need one
+	switch (aFunction)
+		{
+		case RRM_DebugDriver::EControlSuspendThread:
+		case RRM_DebugDriver::EControlResumeThread:
+		case RRM_DebugDriver::EControlStepRange:
+		case RRM_DebugDriver::EControlReadMemory:
+		case RRM_DebugDriver::EControlWriteMemory:
+		case RRM_DebugDriver::EControlReadRegistersLegacy:
+		case RRM_DebugDriver::EControlWriteRegistersLegacy:
+		case RRM_DebugDriver::EControlReadRegisters:
+		case RRM_DebugDriver::EControlWriteRegisters:
+			{
+			NKern::ThreadEnterCS();
+			threadObj = DebugUtils::OpenThreadHandle((TUint32)a1);
+			if (!threadObj)
+				{
+				NKern::ThreadLeaveCS();
+				return KErrBadHandle;
+				}
+			break;
+			}
+		default:
+			break;
+		}
+
+	switch(aFunction)
+		{
+		/* Security first */
+		case RRM_DebugDriver::EControlIsDebuggable:
+			{
+			err = IsDebuggable((TUint32)a1);
+			break;
+			}
+		case RRM_DebugDriver::EControlSetBreak:
+			{
+			err = SetBreak((TSetBreakInfo*)a1);
+			break;
+			}
+		case RRM_DebugDriver::EControlClearBreak:
+			{
+			err = iBreakManager->DoClearBreak((TInt32)a1);
+			break;
+			}
+		case RRM_DebugDriver::EControlModifyBreak:
+			{
+			err = iBreakManager->DoModifyBreak((TModifyBreakInfo*)a1);
+			break;
+			}
+		case RRM_DebugDriver::EControlModifyProcessBreak:
+			{
+			err = iBreakManager->DoModifyProcessBreak((TModifyProcessBreakInfo*)a1);
+			break;
+			}
+		case RRM_DebugDriver::EControlBreakInfo:
+			{
+			err = iBreakManager->DoBreakInfo((TGetBreakInfo*)a1);
+			break;
+			}
+		case RRM_DebugDriver::EControlSuspendThread:
+			{
+			err = DoSuspendThread(threadObj);
+			break;
+			}
+		case RRM_DebugDriver::EControlResumeThread:
+			{
+			err = DoResumeThread(threadObj);
+			break;
+			}
+		case RRM_DebugDriver::EControlStepRange:
+			{
+			err = StepRange(threadObj, (TRM_DebugStepInfo*)a2);
+			break;
+			}
+		case RRM_DebugDriver::EControlReadMemory:
+			{
+			err = ReadMemory(threadObj, (TRM_DebugMemoryInfo*)a2);
+			break;
+			}
+		case RRM_DebugDriver::EControlWriteMemory:
+			{
+			err = WriteMemory(threadObj, (TRM_DebugMemoryInfo*)a2);
+			break;
+			}
+		case RRM_DebugDriver::EControlReadRegistersLegacy:
+			{
+			err = ReadRegistersLegacy(threadObj, (TRM_DebugRegisterInfo*)a2);
+			break;
+			}
+		case RRM_DebugDriver::EControlWriteRegistersLegacy:
+			{
+			err = WriteRegistersLegacy(threadObj, (TRM_DebugRegisterInfo*)a2);
+			break;
+			}
+		case RRM_DebugDriver::EControlReadRegisters:
+			{
+			err = ReadRegisters(threadObj, (TRM_DebugRegisterInformation*)a2);
+			break;
+			}
+		case RRM_DebugDriver::EControlWriteRegisters:
+			{
+			err = WriteRegisters(threadObj, (TRM_DebugRegisterInformation*)a2);
+			break;
+			}
+		case RRM_DebugDriver::EControlGetDebugFunctionalityBufSize:
+			{
+			LOG_MSG("RRM_DebugDriver::EControlGetDebugFunctionalityBufSize\n");
+
+			TDebugFunctionality df;
+
+			TUint size = df.GetDebugFunctionalityBufSize();
+
+			// Return size to user-side in a safe manner
+			err = Kern::ThreadRawWrite(iClientThread, a1, (TUint8*)&size, sizeof(TUint), iClientThread);
+			break;
+			}
+		case RRM_DebugDriver::EControlGetDebugFunctionality:
+			{
+			LOG_MSG("RRM_DebugDriver::EControlGetDebugFunctionality\n");
+
+			TDebugFunctionality df;
+
+			TUint32 dfsize = df.GetDebugFunctionalityBufSize();
+
+			// Alloc tmp buffer for Debug Functionality data
+			NKern::ThreadEnterCS();
+			TUint8* dfbuffer = (TUint8*)Kern::AllocZ(dfsize);
+			if (dfbuffer==NULL)
+				{
+				LOG_MSG2("Could not allocate memory for %d bytes\n",dfsize);
+				NKern::ThreadLeaveCS();
+				// could not allocate memory
+				return KErrNoMemory;
+				}
+
+			// Temporary descriptor to hold DF data
+			TPtr8 tmpPtr(dfbuffer,0,dfsize);
+
+			// Obtain the DF data
+			if (df.GetDebugFunctionality(tmpPtr) )
+				{
+				// Return the DF data to the user-side
+				err = Kern::ThreadDesWrite(iClientThread, a1, tmpPtr, 0, KChunkShiftBy0, iClientThread);
+				}
+			else
+				{
+				// Failed.
+				err = KErrGeneral;
+				}
+
+			// Free tmp buffer
+			Kern::Free(dfbuffer);
+			NKern::ThreadLeaveCS();
+			break;
+			}
+		case RRM_DebugDriver::EControlAttachProcess:
+			{
+			LOG_MSG("RRM_DebugDriver::EControlAttachProcess");
+
+			err = AttachProcess(a1,a2);
+			break;
+			}
+		case RRM_DebugDriver::EControlDetachProcess:
+			{
+			LOG_MSG("RRM_DebugDriver::EControlDetachProcess");
+
+			err = DetachProcess(a1,a2);
+			break;
+			}
+		case RRM_DebugDriver::EControlDetachAgent:
+			{
+			LOG_MSG("RRM_DebugDriver::EControlDetachAgent");
+
+			err = DetachAgent(a1,a2);
+			break;
+			}
+		case RRM_DebugDriver::EControlSetEventAction:
+			{
+			LOG_MSG("RRM_DebugDriver::EControlSetEventAction");
+
+			err = SetEventAction(a1,a2);
+			break;
+			}
+		case RRM_DebugDriver::EControlGetMemoryOperationMaxBlockSize:
+			{
+			LOG_MSG("RRM_DebugDriver::EControlGetMemoryOperationMaxBlockSize\n");
+
+			TUint32 maxSize = TDebugFunctionality::GetMemoryOperationMaxBlockSize();
+
+			// Return size to user-side in a safe manner
+			err = Kern::ThreadRawWrite(iClientThread, a1, (TUint8*)&maxSize, sizeof(TUint32), iClientThread);
+			break;
+			}
+		case RRM_DebugDriver::EControlGetList:
+			{
+			LOG_MSG("RRM_DebugDriver::EControlGetList\n");
+			err = GetList((TListInformation*)a1);
+			break;
+			}
+		case RRM_DebugDriver::EControlStep:
+			{
+			LOG_MSG("RRM_DebugDriver::EControlStep\n");
+
+			err = Step((TUint32)a1,(TUint32)a2);
+			break;
+			}
+		case RRM_DebugDriver::EControlKillProcess:
+			{
+			LOG_MSG("RRM_DebugDriver::EControlKillProcess\n");
+
+			err = KillProcess((TUint32)a1,(TUint32)a2);
+			break;
+			}
+		default:
+			{
+			err = KErrGeneral;
+			}
+		}
+
+	if (KErrNone != err)
+		{
+		LOG_MSG2("Error %d from control function", err);
+		}
+
+	if (threadObj)
+		{
+		// Close the thread handle which has been opened by DebugUtils::OpenThreadHandle
+		threadObj->Close(NULL);
+		NKern::ThreadLeaveCS();
+		}
+
+	return err;
+	}
+
+void DRM_DebugChannel::HandleMsg(TMessageBase* aMsg)
+	{
+	LOG_MSG("DRM_DebugChannel::HandleMsg()");
+
+	TThreadMessage& m = *(TThreadMessage*)aMsg;
+	TInt id = m.iValue;
+
+	if (id == (TInt)ECloseMsg)
+		{
+		if (iEventHandler)
+			{
+			iEventHandler->Stop();
+			iEventHandler->Close();
+			iEventHandler = NULL;
+			}
+		m.Complete(KErrNone, EFalse);
+		return;
+		}
+
+	if (id == KMaxTInt)
+		{
+		// DoCancel
+		DoCancel(m.Int0());
+		m.Complete(KErrNone, ETrue);
+		return;
+		}
+
+	if (id < 0)
+		{
+		// DoRequest
+		TRequestStatus* pStatus = (TRequestStatus*)m.Ptr0();
+		DoRequest(~id, pStatus, m.Ptr1(), m.Ptr2());
+		m.Complete(KErrNone, ETrue);
+		}
+	else
+		{
+		// DoControl
+		TInt err = DoControl(id, m.Ptr0(), m.Ptr1());
+		m.Complete(err, ETrue);
+		}
+	}
+
+//
+// DRM_DebugChannel::RemoveProcess
+//
+TBool DRM_DebugChannel::RemoveProcess(TAny* a1, TAny* a2)
+	{
+	LOG_MSG("DRM_DebugChannel::RemoveProcess()");
+
+	DProcess *aProcess = (DProcess*)a1;
+
+	// Sanity check
+	if (!aProcess)
+		{
+		// No process was specified!
+		LOG_MSG("DRM_DebugChannel::RemoveProcess was called with an invalid process ID");
+		return EFalse;
+		}
+
+	// this is called when a process dies.  we want to mark any breakpoints in this
+	// process space as obsolete.  the main reason for this is so we don't return
+	// an error when the host debugger tries to clear breakpoints for the process
+
+	TUint32 codeAddress = 0;
+	TUint32 codeSize = 0;
+
+	LOG_EVENT_MSG2("Process being removed, Name %S", aProcess->iName);
+
+	DCodeSeg* codeSeg = aProcess->iCodeSeg;
+
+	if (codeSeg)
+		{
+		TModuleMemoryInfo processMemoryInfo;
+		TInt err = codeSeg->GetMemoryInfo(processMemoryInfo, aProcess);
+		if (err != KErrNone)
+			{
+			codeAddress = processMemoryInfo.iCodeBase;
+			codeSize = processMemoryInfo.iCodeSize;
+			}
+		else
+			{
+			LOG_MSG2("Error in getting memory info: %d", err);
+			}
+		}
+
+	if (!codeAddress || !codeSize)
+		{
+		LOG_EVENT_MSG2("Code segment not available for process %d", aProcess->iId);
+		// make sure there is not already a breakpoint at this address
+		for (TInt i = 0; i < iDebugProcessList.Count(); i++)
+			{
+			if (iDebugProcessList[i].iId == aProcess->iId)
+				{
+				codeAddress = iDebugProcessList[i].iCodeAddress;
+				codeSize = iDebugProcessList[i].iCodeSize;
+
+				//now remove from the list
+				iDebugProcessList.Remove(i);
+				break;
+				}
+			}
+		}
+
+	if (!codeAddress || !codeSize)
+		{
+		return EFalse;
+		}
+
+	iBreakManager->RemoveBreaksForProcess(aProcess->iId, codeAddress, codeSize);
+	return EFalse;
+	}
+
+//
+// DRM_DebugChannel::StartThread
+//
+TBool DRM_DebugChannel::StartThread(TAny* a1, TAny* a2)
+	{
+	LOG_EVENT_MSG("DRM_DebugChannel::StartThread()");
+
+	DThread *aThread = (DThread*)a1;
+	if(!aThread)
+		{
+		LOG_MSG("Error getting DThread object");
+		__NK_ASSERT_DEBUG(aThread);
+		return EFalse;
+		}
+
+	//a2 points to the thread creating the new thread.
+	//We have no use for it at the moment so just ignore it for now
+
+	TDriverEventInfo info;
+	info.iEventType = EEventsStartThread;
+	info.iThreadId = aThread->iId;
+	info.iThreadIdValid = ETrue;
+	DProcess* owningProcess = aThread->iOwningProcess;
+	if(owningProcess)
+		{
+		info.iProcessId = owningProcess->iId;
+		info.iProcessIdValid = ETrue;
+		DCodeSeg* p = owningProcess->iCodeSeg;
+		if(p && p->iFileName)
+			{
+			info.iFileName.Copy(*(p->iFileName));
+			TheDProcessTracker.NotifyAgentsForProcessEvent(*p->iFileName, info);
+			}
+		else
+			{
+			if(p)
+				{
+				LOG_EVENT_MSG("\tCode segment name missing");
+				}
+			else
+				{
+				LOG_EVENT_MSG("\tCode segment is NULL");
+				}
+			}
+		}
+	return EFalse;
+	}
+
+//
+// DRM_DebugChannel::HandleAddProcessEvent
+//
+TBool DRM_DebugChannel::HandleAddProcessEvent(TAny* a1, TAny* a2)
+	{
+	LOG_EVENT_MSG("DRM_DebugChannel::AddProcess()");
+
+	DProcess *aProcess = (DProcess*)a1;
+	// a2 points to the thread creating the new process.
+	DThread *aThread = (DThread*)a2;
+
+	if(!aProcess)
+		{
+		LOG_MSG("Error getting DProcess object");
+		__NK_ASSERT_DEBUG(aProcess);
+		return EFalse;
+		}
+
+	TDriverEventInfo info;
+	info.iEventType = EEventsAddProcess;
+	info.iProcessId = aProcess->iId;
+
+	info.iCreatorThreadId  = aThread ? aThread->iId : 0;
+	info.iProcessIdValid = ETrue;
+
+	// Copy TUids
+	info.iUids = aProcess->iUids;
+
+	info.iUidsValid = ETrue;
+
+	// copy name of the process
+	if (aProcess->iName)
+		{
+		// copy the name of the process
+		info.iFileName.Copy(*aProcess->iName);
+		// AddProcess event does not have fully-qualified path, it has "filename.exe"
+		// So we allow a less-precise match by passing in ETrue
+		TheDProcessTracker.NotifyAgentsForProcessEvent(*aProcess->iName, info, ETrue);
+		}
+	else
+		{
+		LOG_EVENT_MSG("DRM_DebugChannel::AddProcess - No iName for this process");
+		}
+
+	return EFalse;
+	}
+
+//
+// DRM_DebugChannel::HandleRemoveProcessEvent
+//
+TBool DRM_DebugChannel::HandleRemoveProcessEvent(TAny* a1, TAny* a2)
+	{
+	LOG_MSG("DRM_DebugChannel::HandleRemoveProcessEvent()");
+
+	DProcess *aProcess = (DProcess*)a1;
+	if(!aProcess)
+		{
+		LOG_MSG("Error getting DProcess object");
+		__NK_ASSERT_DEBUG(aProcess);
+		return EFalse;
+		}
+
+	// a2 points to the thread creating the new process.
+	// We have no use for it at the moment so just ignore it for now
+	// Also, it may not be known and therefore NULL
+
+	TDriverEventInfo info;
+	info.iEventType = EEventsRemoveProcess;
+	info.iProcessId = aProcess->iId;
+	info.iProcessIdValid = ETrue;
+
+	// copy name of the process
+	if (aProcess->iName)
+		{
+		info.iFileName.Copy(*aProcess->iName);
+
+		// RemoveProcess event does not have fully-qualified path, it has "filename.exe"
+		// So we allow a less-precise match by passing in ETrue
+		TheDProcessTracker.NotifyAgentsForProcessEvent(*aProcess->iName, info, ETrue);
+		}
+	else
+		{
+		LOG_EVENT_MSG("DRM_DebugChannel::AddProcess - No iName for this process");
+		}
+
+	return EFalse;
+	}
+
+//
+// DRM_DebugChannel::AddLibrary
+//
+TBool DRM_DebugChannel::AddLibrary(TAny* a1, TAny* a2)
+	{
+	LOG_EVENT_MSG("DRM_DebugChannel::AddLibrary()");
+
+	DLibrary *aLibrary = (DLibrary*)a1;
+	DThread *aThread = (DThread*)a2;
+
+	// sanity check
+	if (!aLibrary)
+		{
+		LOG_EVENT_MSG("DRM_DebugChannel::AddLibrary called with no library specified");
+		return EFalse;
+		}
+
+	if (!aThread)
+		{
+		LOG_EVENT_MSG("DRM_DebugChannel::AddLibrary called with no thread specified");
+		return EFalse;
+		}
+
+#ifdef __LOG_EVENTS__
+	TFullName threadName;
+	aThread->FullName(threadName);
+	LOG_EVENT_MSG3(("Lib %S loaded by %S"), aLibrary->iName, &threadName);
+#endif
+
+	if (aThread)
+		{
+		// make sure this is not the debugger thread
+		if ((aThread != iClientThread) && (aThread->iOwningProcess->iId != iClientThread->iOwningProcess->iId))
+			{
+			TDriverEventInfo info;
+
+			info.iEventType = EEventsAddLibrary;
+			info.iProcessId = aThread->iOwningProcess->iId;
+			info.iProcessIdValid = ETrue;
+			info.iThreadId = aThread->iId;
+			info.iThreadIdValid = ETrue;
+
+			//get the code address
+			DCodeSeg* codeSeg = aLibrary->iCodeSeg;
+			if (!codeSeg)
+				{
+				LOG_EVENT_MSG2("Code segment not available for library %S", aLibrary->iName);
+				return EFalse;
+				}
+
+			// Uid3
+			info.iUids = codeSeg->iUids;
+			info.iUidsValid = ETrue;
+
+			TModuleMemoryInfo memoryInfo;
+			TInt err = codeSeg->GetMemoryInfo(memoryInfo, NULL); //NULL for DProcess should be ok;
+			if (err != KErrNone)
+				{
+				LOG_EVENT_MSG2("Error in getting memory info: %d", err);
+				return EFalse;
+				}
+
+			info.iCodeAddress = memoryInfo.iCodeBase;
+			info.iDataAddress = memoryInfo.iInitialisedDataBase;
+
+			info.iFileName.Copy(*(aLibrary->iName)); //just the name, without uid info.
+
+			//queue up or complete the event
+			info.iArg1 = a1;
+			info.iArg2 = a2;
+			NotifyAgentsFromEventPid(info);
+			}
+
+		}
+	return EFalse;
+	}
+
+//
+// DRM_DebugChannel::RemoveLibrary
+//
+TBool DRM_DebugChannel::RemoveLibrary(TAny* a1, TAny* a2)
+	{
+	LOG_EVENT_MSG("DRM_DebugChannel::RemoveLibrary()");
+	DLibrary *aLibrary = (DLibrary*)a1;
+
+	// sanity check
+	if (!aLibrary)
+		{
+		LOG_EVENT_MSG("DRM_DebugChannel::RemoveLibrary called with no library specified");
+		return EFalse;
+		}
+
+	LOG_EVENT_MSG2(("Lib unloaded: %S"), aLibrary->iName);
+
+	// this is called when all handles to this library have been closed.  this can happen when a process dies, or when a dll is
+	// unloaded while the process lives on.  in former case, we don't need to notify the host debugger because that process is
+	// dying anyway.  for the latter case, we do need to notify the host so it can unload the symbolics, etc.
+
+	DThread* aThread = &Kern::CurrentThread();
+
+	if ((aThread) &&
+			(aThread != iClientThread) &&
+			(aThread->iOwningProcess->iId != iClientThread->iOwningProcess->iId))
+		{
+		//the library gets unloaded only when the mapcount is 0.
+		if (aLibrary->iMapCount != 0)
+			return EFalse;
+
+		DCodeSeg* codeSeg = aLibrary->iCodeSeg;
+		if (!codeSeg)
+			{
+			LOG_EVENT_MSG2("Code segment not available for library %S", aLibrary->iName);
+			return EFalse;
+			}
+
+		TModuleMemoryInfo processMemoryInfo;
+		TInt err = codeSeg->GetMemoryInfo(processMemoryInfo, NULL); //passing NULL for the DProcess argument should be ok;
+		if (err != KErrNone)
+			{
+			LOG_EVENT_MSG2("Error in getting memory info: %d", err);
+			return EFalse;
+			}
+
+		TUint32 codeAddress = processMemoryInfo.iCodeBase;
+		TUint32 codeSize = processMemoryInfo.iCodeSize;
+
+		// first invalidate all breakpoints that were set in the library code
+		iBreakManager->InvalidateLibraryBreakPoints(codeAddress, codeSize);
+		DProcess *process = &Kern::CurrentProcess();
+		RArray<SCodeSegEntry>* dynamicCode = &(process->iDynamicCode);
+
+		for (TInt j=0; j<dynamicCode->Count(); j++)
+			{
+			if ((*dynamicCode)[j].iLib == aLibrary)
+				{
+				TDriverEventInfo info;
+
+				info.iEventType = EEventsRemoveLibrary;
+				info.iFileName.Copy(*(aLibrary->iName)); //lib name without uid info
+				//info.iFileName.ZeroTerminate();
+				info.iProcessId = process->iId;
+				info.iProcessIdValid = ETrue;
+				info.iThreadId = 0xFFFFFFFF; // don't care!
+				info.iThreadIdValid = EFalse;
+				// Uid3
+				info.iUids = codeSeg->iUids;
+				info.iUidsValid = ETrue;
+
+				//queue up or complete the event
+				info.iArg1 = a1;
+				info.iArg2 = a2;
+				NotifyAgentsFromEventPid(info);
+				}
+			}
+		}
+	return EFalse;
+	}
+
+//
+// DRM_DebugChannel::HandleEventKillThread
+//
+TBool DRM_DebugChannel::HandleEventKillThread(TAny* a1, TAny* a2)
+	{
+	DThread* currentThread = &Kern::CurrentThread();
+
+	// a1 should point to the current thread, check this to make sure it does
+	__NK_ASSERT_DEBUG((DThread*)a1 == currentThread);
+
+	TDriverEventInfo info;
+
+	LOG_MSG5(" HandleEventKillThread for thread 0x%x, CritScount=%d, suspCnt=%d, waitObj=0x%x", 
+			currentThread->iId, 
+			currentThread->iNThread.iCsCount, 
+			currentThread->iNThread.iSuspendCount,
+			currentThread->iWaitObj);
+
+	info.iProcessId = currentThread->iOwningProcess->iId;
+	info.iProcessIdValid = ETrue;
+	info.iThreadId = currentThread->iId;
+	info.iThreadIdValid = ETrue;
+	
+	TInt err = ReadKernelRegisterValue(currentThread, 14, info.iCurrentPC);
+	if(err != KErrNone)
+		{
+		LOG_EVENT_MSG2("DRM_DebugChannel::HandleEventKillThread - Non-zero error code discarded: %d", err);
+		}
+
+	LOG_MSG5(" HandleEventKillThread for thread exit category=%S reason=%d, exitType=0x%x, PC=0x%x",
+			&currentThread->iExitCategory,
+	 	 	 currentThread->iExitReason, 
+	 		 currentThread->iExitType,
+			 info.iCurrentPC);
+			
+	if (currentThread->iExitType == EExitPanic)
+		{
+		info.iPanicCategory.Copy(currentThread->iExitCategory);
+		}
+	info.iExceptionNumber = currentThread->iExitReason;
+	info.iExitType = currentThread->iExitType;
+	info.iEventType = EEventsKillThread;
+	info.iThreadFlags = currentThread->iFlags;
+
+	// remove all the breakpoints in this thread, whether we are debugging it or not.
+	iBreakManager->DoRemoveThreadBreaks(info.iThreadId);
+
+	info.iArg1 = a1;
+	info.iArg2 = a2;
+	NotifyAgentsFromEventPid(info);
+
+	return ETrue;
+	}
+
+//
+// DRM_DebugChannel::HandleSwException
+//
+TBool DRM_DebugChannel::HandleSwException(TAny* a1, TAny* a2)
+	{
+	LOG_EVENT_MSG("DRM_DebugChannel::HandleSwException");
+	TExcType aExcType = (TExcType)(TInt)a1;
+
+	TDriverEventInfo info;
+
+	DThread* currentThread = &Kern::CurrentThread();
+	if (!currentThread)
+		{
+		LOG_MSG("Error getting current thread");
+		__NK_ASSERT_DEBUG(currentThread);
+		return EFalse;
+		}
+
+	info.iProcessId = currentThread->iOwningProcess->iId;
+	info.iProcessIdValid = ETrue;
+	info.iThreadId = currentThread->iId;
+	info.iThreadIdValid = ETrue;
+	TInt err = ReadKernelRegisterValue(currentThread, PC_REGISTER, info.iCurrentPC);
+	if(err != KErrNone)
+		{
+		LOG_EVENT_MSG2("DRM_DebugChannel::HandleSwException - Non-zero error code discarded: %d", err);
+		}
+	info.iExceptionNumber = aExcType;
+	info.iEventType = EEventsSwExc;
+	info.iThreadFlags = currentThread->iFlags;
+	info.iArg1 = a1;
+	info.iArg2 = a2;
+
+	NotifyAgentsFromEventPid(info);
+
+	return EFalse;
+	}
+
+//
+// DRM_DebugChannel::HandleHwException
+//
+TBool DRM_DebugChannel::HandleHwException(TAny* a1, TAny* a2)
+	{
+	TArmExcInfo* aExcInfo = (TArmExcInfo*)a1;
+
+	// sanity check
+	if (!aExcInfo)
+		{
+		LOG_MSG("DRM_DebugChannel::HandleHwException called with no aExcInfo");
+		__NK_ASSERT_DEBUG(aExcInfo);
+		return EFalse;
+		}
+
+	TDriverEventInfo info;
+
+	DThread* currentThread = &Kern::CurrentThread();
+
+	if (!currentThread)
+		{
+		LOG_MSG("Error getting current thread");
+		__NK_ASSERT_DEBUG(currentThread);
+		return EFalse;
+		}
+
+	info.iProcessId = currentThread->iOwningProcess->iId;
+	info.iProcessIdValid = ETrue;
+	info.iThreadId = currentThread->iId;
+	info.iThreadIdValid = ETrue;
+	info.iRmdArmExcInfo.iFaultAddress= aExcInfo->iFaultAddress;
+	info.iRmdArmExcInfo.iFaultStatus= aExcInfo->iFaultStatus;
+
+	LOG_MSG5("DRM_DebugChannel::HandleHwException current thread = 0x%08x, CritSect count=%d,\n"
+		" iFaultAddress=0x%08x, iFaultStatus=0x%08x",
+		currentThread, currentThread->iNThread.iCsCount, aExcInfo->iFaultAddress, aExcInfo->iFaultStatus);
+
+
+	LOG_MSG3(" HandleHwException CsFunc=%d, suspCount=%d",
+			currentThread->iNThread.iCsFunction, currentThread->iNThread.iSuspendCount );  
+		
+	info.iRmdArmExcInfo.iR0= aExcInfo->iR0;
+	info.iRmdArmExcInfo.iR1= aExcInfo->iR1;
+	info.iRmdArmExcInfo.iR2= aExcInfo->iR2;
+	info.iRmdArmExcInfo.iR3= aExcInfo->iR3;
+
+	info.iRmdArmExcInfo.iR4= aExcInfo->iR4;
+	info.iRmdArmExcInfo.iR5= aExcInfo->iR5;
+	info.iRmdArmExcInfo.iR6= aExcInfo->iR6;
+	info.iRmdArmExcInfo.iR7= aExcInfo->iR7;
+	info.iRmdArmExcInfo.iR8= aExcInfo->iR8;
+	info.iRmdArmExcInfo.iR9= aExcInfo->iR9;
+	info.iRmdArmExcInfo.iR10= aExcInfo->iR10;
+	info.iRmdArmExcInfo.iR11= aExcInfo->iR11;
+	info.iRmdArmExcInfo.iR12= aExcInfo->iR12;
+
+	info.iRmdArmExcInfo.iR13= aExcInfo->iR13;
+	info.iRmdArmExcInfo.iR14= aExcInfo->iR14;
+	info.iRmdArmExcInfo.iR15= aExcInfo->iR15;
+
+	info.iRmdArmExcInfo.iCpsr= aExcInfo->iCpsr;
+	info.iRmdArmExcInfo.iR13Svc= aExcInfo->iR13Svc;
+	info.iRmdArmExcInfo.iR14Svc= aExcInfo->iR14Svc;
+	info.iRmdArmExcInfo.iSpsrSvc= aExcInfo->iSpsrSvc;
+	LOG_MSG5(" iCpsr=0x%x, iExcCode=0x%x, R14=0x%x, R15=0x%x",
+			aExcInfo->iCpsr, aExcInfo->iExcCode, aExcInfo->iR14, aExcInfo->iR15);
+
+	switch (aExcInfo->iExcCode)
+		{
+		case 0:
+			info.iExceptionNumber = EExcCodeAbort;
+			LOG_MSG(" iExcCode == 0 => EExcCodeAbort");
+			break;
+		case 1:
+			info.iExceptionNumber = EExcDataAbort;
+			LOG_MSG(" iExcCode == 1 => EExcDataAbort");
+			break;
+		case 2:
+			info.iExceptionNumber = EExcInvalidOpCode;
+			LOG_MSG(" iExcCode == 2 => EExcInvalidOpCode");
+			break;
+		default:
+			// new event? Something gone wrong?
+			__NK_ASSERT_DEBUG(EFalse);
+			return EFalse;
+		}
+
+	info.iEventType = EEventsHwExc;
+	info.iThreadFlags = currentThread->iFlags;
+
+	info.iArg1 = a1;
+	info.iArg2 = a2;
+
+	if(EExcInvalidOpCode == info.iExceptionNumber)
+		{
+		return HandleInvalidOpCodeException(info, currentThread);
+		}
+
+	NotifyAgentsFromEventPid(info);
+	return EFalse;
+	}
+
+//
+// DRM_DebugChannel::HandUserTrace
+//
+TBool DRM_DebugChannel::HandleUserTrace(TAny* a1, TAny* a2)
+	{
+	LOG_EVENT_MSG("DRM_DebugChannel::HandleUserTrace()");
+
+	DThread* currentThread = &Kern::CurrentThread();
+	if (!currentThread)
+		{
+		LOG_EVENT_MSG("Error getting current thread");
+		__NK_ASSERT_DEBUG(currentThread);
+		return EFalse;
+		}
+
+	TDriverEventInfo info;
+	info.iProcessId = currentThread->iOwningProcess->iId;
+	info.iProcessIdValid = ETrue;
+	info.iThreadId = currentThread->iId;
+	info.iThreadIdValid = ETrue;
+	info.iEventType = EEventsUserTrace;
+	info.iArg1 = a1;
+	info.iArg2 = a2;
+
+	TInt err = KErrNone;
+
+	//User Trace info
+	XTRAP(err, XT_DEFAULT, kumemget(info.iUserTraceText, info.iArg1, (TInt)a2));
+	if(KErrNone != err)
+		{
+		return EFalse;
+		}
+
+	info.iMessageStatus = ESingleMessage;
+
+	NotifyAgentsFromEventPid(info);
+
+	return EFalse;
+	}
+
+//
+// DRM_DebugChannel::HandleException
+//
+TBool DRM_DebugChannel::HandleInvalidOpCodeException(TDriverEventInfo& aEventInfo, DThread* aCurrentThread)
+	{
+	LOG_MSG("DRM_DebugChannel::HandleInvalidOpCodeException()");
+
+	TInt err = KErrNone;
+
+	TUint32 inst = KArmBreakPoint;
+	TInt instSize = 4;
+
+	// change these for thumb mode
+	TUint32 regValue;
+	err = ReadKernelRegisterValue(aCurrentThread, STATUS_REGISTER, regValue);
+	if(err != KErrNone)
+		{
+		LOG_MSG2("DRM_DebugChannel::HandleInvalidOpCodeException - Non-zero error code discarded: %d", err);
+		}
+
+	if (regValue & ECpuThumb)
+		{
+		inst = KThumbBreakPoint;
+		instSize = 2;
+		}
+
+	TUint32 instruction = 0;
+	err = Kern::ThreadRawRead(aCurrentThread, (TUint32 *)aEventInfo.iRmdArmExcInfo.iR15, (TUint8 *)&instruction, instSize);
+
+	if (KErrNone != err)
+		LOG_MSG2("Error reading instruction at currentpc: %d", err);
+
+	if (!memcompare((TUint8 *)&inst, instSize, (TUint8 *)&instruction, instSize))
+		{
+		TInt err = DoSuspendThread(aCurrentThread);
+		if(! ((KErrNone == err) || (KErrAlreadyExists == err)) )
+			{
+			LOG_MSG2("DRM_DebugChannel::HandleInvalidOpCodeException() Thread with id 0x%08x could not be suspended.", aCurrentThread->iId);
+			return EFalse;
+			}
+
+		// the exception was a breakpoint instruction.  see if we have a breakpoint at that address
+		TBreakEntry* breakEntry = NULL;
+		do
+			{
+			breakEntry = iBreakManager->GetNextBreak(breakEntry);
+			if (breakEntry && ((breakEntry->iThreadSpecific && breakEntry->iId == aEventInfo.iThreadId) || (!breakEntry->iThreadSpecific && breakEntry->iId == aEventInfo.iProcessId)) && breakEntry->iAddress == aEventInfo.iRmdArmExcInfo.iR15)
+				{
+				LOG_MSG2("Breakpoint with Id %d has been hit", breakEntry->iBreakId);
+
+				TBreakEntry tempBreakEntry = *breakEntry;
+
+				//change the event type to breakpoint type
+				aEventInfo.iEventType = breakEntry->iThreadSpecific ? EEventsBreakPoint : EEventsProcessBreakPoint;
+
+				// enable any breakpoints we had to disable for this thread
+				err = iBreakManager->DoEnableDisabledBreak(aEventInfo.iThreadId);
+				if (KErrNone != err)
+					LOG_MSG2("Error %d enabling disabled breakpoints", err);
+
+				// see if this is a temp breakpoint
+				if (iBreakManager->IsTemporaryBreak(*breakEntry))
+					{
+					// this was a temp breakpoint, so we need to clear it now
+					err = iBreakManager->DoClearBreak(breakEntry->iBreakId);
+					if (KErrNone != err)
+						LOG_MSG2("Error %d clearing temp breakpoint", err);
+
+					// Find out how many steps remain to be done
+
+					// reduce the number of steps to complete by 1
+					tempBreakEntry.iNumSteps--;
+
+					LOG_MSG2("There are %d steps remaining\n", tempBreakEntry.iNumSteps);
+
+					// New. If we have not finished do all the steps, continue stepping and don't notify event
+					if (tempBreakEntry.iNumSteps)
+						{
+						LOG_MSG("Continuing stepping...not telling the agent yet\n");
+						err = DoStepRange(aCurrentThread, aEventInfo.iRmdArmExcInfo.iR15, aEventInfo.iRmdArmExcInfo.iR15, ETrue, tempBreakEntry.iResumeOnceOutOfRange /*EFalse*/, tempBreakEntry.iNumSteps, ETrue);
+						if (err != KErrNone)
+							{
+							LOG_EVENT_MSG("Failed to continue stepping\n");
+
+							// what do we do? might as well stop here and tell the user
+							NotifyAgentsFromEventPid(aEventInfo);
+
+							return ETrue;
+							}
+
+						// continue as though no event occured. No need to suspend/resume anything...
+						LOG_MSG("Continuing to step\n");
+						return ETrue;
+						}
+
+					// Is this a case where we just want to continue?
+					if (tempBreakEntry.iResumeOnceOutOfRange)
+						{
+						LOG_MSG("PC is out of range, continuing thread");
+						DoResumeThread(aCurrentThread);
+
+						return ETrue;
+						}
+					}
+
+				// if the breakpoint is thread specific, make sure it's the right thread
+				// if not, just continue the thread.  take special care if it's the debugger
+				// thread.  if it hits a regular breakpoint, we NEVER want to stop at it.  if
+				// it hits a temp breakpoint, we're probably just stepping past a real breakpoint
+				// and we do need to handle it.
+				TBool needToResume = (tempBreakEntry.iThreadSpecific && tempBreakEntry.iId != aEventInfo.iThreadId) ||
+					(!tempBreakEntry.iThreadSpecific && tempBreakEntry.iId != aEventInfo.iProcessId);
+
+				if (needToResume)
+					{
+					LOG_MSG("breakpoint does not match threadId, calling DoResumeThread");
+					err = DoResumeThread(aCurrentThread);
+					if (KErrNone != err)
+						LOG_MSG2("Error in DoResumeThread: %d", err);
+
+					return EFalse;
+					}
+
+				//normal user break point, just notify the event
+				break;
+				}
+			} while(breakEntry);
+		}
+
+	NotifyAgentsFromEventPid(aEventInfo);
+
+	return (aEventInfo.iEventType == EEventsBreakPoint) || (aEventInfo.iEventType == EEventsProcessBreakPoint);
+	}
+
+//
+// DRM_DebugChannel::SetBreak
+//
+TInt DRM_DebugChannel::SetBreak(TSetBreakInfo* aBreakInfo)
+	{
+	LOG_MSG("DRM_DebugChannel::SetBreak()");
+
+	TInt err = KErrNone;
+
+	if (!aBreakInfo)
+		{
+		LOG_MSG("DRM_DebugChannel::SetBreak() was passed a NULL argument");
+		return KErrArgument;
+		}
+
+	//User side memory is not accessible directly
+	TSetBreakInfo info;
+	err = Kern::ThreadRawRead(iClientThread, aBreakInfo, (TUint8*)&info, sizeof(TSetBreakInfo));
+	if (err != KErrNone)
+		{
+		LOG_MSG("DRM_DebugChannel::SetBreak() was passed a bad argument");
+		return err;
+		}
+
+	DProcess* process = NULL;
+	NKern::ThreadEnterCS();
+	if(info.iThreadSpecific)
+		{
+		DThread* thread = DebugUtils::OpenThreadHandle(info.iId);
+		if(!thread)
+			{
+			LOG_MSG2("DRM_DebugChannel::SetBreak() Thread with id 0x%08x not found", info.iId);
+			}
+		else
+			{
+			process = DebugUtils::OpenProcessHandle(thread->iOwningProcess->iId);
+			thread->Close(NULL);
+			}
+		}
+	else
+		{
+		process = DebugUtils::OpenProcessHandle(info.iId);
+		if(!process)
+			{
+			LOG_MSG2("DRM_DebugChannel::SetBreak() Process with id 0x%08x not found", info.iId);
+			}
+		}
+
+	if (process == NULL)
+		{
+		NKern::ThreadLeaveCS();
+		return KErrNotFound;
+		}
+
+	TBool found = EFalse;
+	for(TInt i=0; i<iDebugProcessList.Count(); i++)
+		{
+		if(process->iId == iDebugProcessList[i].iId)
+			{
+			found = ETrue;
+			}
+		}
+
+	if(!found)
+		{
+		DCodeSeg* codeSeg = process->iCodeSeg;
+		if (!codeSeg)
+			{
+			LOG_MSG2("DRM_DebugChannel::SetBreak() Code seg for process with id 0x%08x not found", process->iId);
+			err = KErrNotFound;
+			}
+
+		TModuleMemoryInfo memoryInfo;
+		if (!err)
+			{
+			err = codeSeg->GetMemoryInfo(memoryInfo, process);
+			if (err != KErrNone)
+				{
+				LOG_MSG2("DRM_DebugChannel::SetBreak() Error getting memory info for process with id 0x%08x", process->iId);
+				}
+			}
+
+		if (!err)
+			{
+			//add this process to the list of processes that we are debugging
+			TProcessInfo processInfo(process->iId, memoryInfo.iCodeBase, memoryInfo.iCodeSize, memoryInfo.iInitialisedDataBase);
+			iDebugProcessList.Append(processInfo);
+			}
+		}
+
+	process->Close(NULL);
+	NKern::ThreadLeaveCS();
+
+	if (!info.iBreakId) //first check if the iId address is valid
+		return KErrArgument;
+
+	if (err == KErrNone)
+		{
+		TInt32 iBreakId;
+
+		err = iBreakManager->DoSetBreak(iBreakId, info.iId, info.iThreadSpecific, info.iAddress, info.iMode );
+
+		if (err == KErrNone)
+			{
+			err = Kern::ThreadRawWrite(iClientThread, (TUint8 *)info.iBreakId, &iBreakId, sizeof(TInt32), iClientThread);
+			}
+		}
+
+	return err;
+	}
+
+//
+// DRM_DebugChannel::StepRange
+//
+TInt DRM_DebugChannel::StepRange(DThread* aThread, TRM_DebugStepInfo* aStepInfo)
+	{
+	LOG_MSG("DRM_DebugChannel::StepRange()");
+
+	TInt err = KErrNone;
+
+	if (!aStepInfo)
+		return KErrArgument;
+
+	TRM_DebugStepInfo info(0, 0, 0);
+	err = Kern::ThreadRawRead(iClientThread, aStepInfo, (TUint8*)&info, sizeof(TRM_DebugStepInfo));
+
+	if (err != KErrNone)
+		return err;
+
+	err = DoStepRange(aThread, info.iStartAddress, info.iStopAddress, info.iStepInto, EFalse, ETrue);
+
+	return err;
+	}
+
+/**
+Read memory from a target thread and return the data to the client. If the
+memory block has breakpoints in it then the correct values are placed in the
+returned data
+
+@param aThread pointer to thread whose memory space the memory is to be read from
+@param aMemoryInfo information about what memory to read
+
+@return KErrNone if memory read successfully,
+        KErrArgument if aMemoryInfo is not initialised correctly,
+        KErrNoMemory if a temporary buffer could not be allocated,
+        KErrBadHandle if aThread is invalid,
+        or another of the system wide error codes
+*/
+TInt DRM_DebugChannel::ReadMemory(DThread* aThread, TRM_DebugMemoryInfo* aMemoryInfo)
+	{
+	LOG_MSG("DRM_DebugChannel::ReadMemory()");
+
+	TInt err = KErrNone;
+
+	if (!aMemoryInfo)
+		return KErrArgument;
+
+	TRM_DebugMemoryInfo info(0, 0, 0);
+	err = Kern::ThreadRawRead(iClientThread, aMemoryInfo, (TUint8*)&info, sizeof(TRM_DebugMemoryInfo));
+	if (err != KErrNone)
+		{
+		LOG_MSG2("DRM_DebugChannel::ReadMemory returning error %d after Kern::ThreadRawRead()", err);
+		return err;
+		}
+
+	if (!info.iData)
+		return KErrArgument;
+
+	NKern::ThreadEnterCS();
+	TUint8 *data = (TUint8*)Kern::Alloc(info.iLength);
+	NKern::ThreadLeaveCS();
+	if (!data)
+		{
+		return KErrNoMemory;
+		}
+
+	TPtr8 dataDes(data, info.iLength);
+
+	err = DoReadMemory(aThread, info.iAddress, info.iLength, dataDes);
+	if (err == KErrNone)
+		{
+		err = Kern::ThreadDesWrite(iClientThread, info.iData, dataDes, 0, KChunkShiftBy0, iClientThread);
+		if (err)
+			{
+			LOG_MSG2("DRM_DebugChannel::ReadMemory - Kern::ThreadDesWrite() returned error %d", err);
+			}
+		}
+
+	NKern::ThreadEnterCS();
+	Kern::Free(data);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/**
+Attempt to write memory to aThread's address space
+
+@param aThread thread to whose address space memory is to be written
+@param aMemoryInfo memory info object representing the data to write
+
+@return KErrNone if memory written successfully,
+        KErrNoMemory if memory could not be allocated
+        KErrArgument if aMemoryInfo is NULL, if aMemoryInfo.iData is NULL,
+        if aMemoryInfo.iLength is greater than than the length of the passed
+        in descrptor
+        KErrBadHandle if aThread is invalid,
+	or another of the system wide error codes
+*/
+TInt DRM_DebugChannel::WriteMemory(DThread* aThread, TRM_DebugMemoryInfo* aMemoryInfo)
+	{
+	LOG_MSG("DRM_DebugChannel::WriteMemory()");
+
+	TInt err = KErrNone;
+
+	if (!aMemoryInfo)
+		return KErrArgument;
+
+	TRM_DebugMemoryInfo info(0, 0, 0);
+	err = Kern::ThreadRawRead(iClientThread, aMemoryInfo, (TUint8*)&info, sizeof(TRM_DebugMemoryInfo));
+	if (err != KErrNone)
+		return err;
+
+	if (!info.iData)
+		return KErrArgument;
+
+	NKern::ThreadEnterCS();
+	TUint8 *data = (TUint8*)Kern::Alloc(info.iLength);
+	NKern::ThreadLeaveCS();
+	if (!data)
+		{
+		return KErrNoMemory;
+		}
+
+	TPtr8 dataDes(data, info.iLength);
+
+	err = Kern::ThreadDesRead(iClientThread, info.iData, dataDes, 0);
+	if (err == KErrNone)
+		{
+		err = DoWriteMemory(aThread, info.iAddress, info.iLength, dataDes);
+		}
+
+	NKern::ThreadEnterCS();
+	Kern::Free(data);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+//
+// DRM_DebugChannel::ReadRegisters
+//
+TInt DRM_DebugChannel::ReadRegistersLegacy(DThread* aThread, TRM_DebugRegisterInfo* aRegisterInfo)
+	{
+	LOG_MSG("DRM_DebugChannel::ReadRegistersLegacy()");
+
+	TInt err = KErrNone;
+
+	if (!aRegisterInfo)
+		return KErrArgument;
+
+	TRM_DebugRegisterInfo info(0, 0, 0);
+	err = Kern::ThreadRawRead(iClientThread, aRegisterInfo, (TUint8*)&info, sizeof(TRM_DebugRegisterInfo));
+	if (err != KErrNone)
+		return err;
+
+	if (!info.iValues)
+		return KErrArgument;
+
+	TUint length = (info.iLastRegister - info.iFirstRegister + 1) * 4;
+
+	NKern::ThreadEnterCS();
+	TUint8 *values = (TUint8*)Kern::Alloc(length);
+	NKern::ThreadLeaveCS();
+	if (!values)
+		{
+		return KErrNoMemory;
+		}
+
+	TPtr8 valuesDes(values, length);
+
+	err = DoReadRegisters(aThread, info.iFirstRegister, info.iLastRegister, valuesDes);
+	if (err == KErrNone)
+		{
+		err = Kern::ThreadDesWrite(iClientThread, info.iValues, valuesDes, 0, KChunkShiftBy0, iClientThread);
+		}
+
+	NKern::ThreadEnterCS();
+	Kern::Free(values);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/**
+Get listing information.
+
+@param aListInformation pointer to a TListInformation object containing the
+       user specified listings information
+
+@return KErrNone on success,
+        KErrTooBig if the kernel's data is too big to fit in the passed buffer,
+        KErrArgument if aListInformation is NULL,
+	or one of the other system-wide error codes
+*/
+TInt DRM_DebugChannel::GetList(TListInformation* aListInformation) const
+	{
+	LOG_MSG("DRM_DebugChannel::GetList()");
+
+	TInt err = KErrNone;
+
+	if(aListInformation == NULL)
+		{
+		return KErrArgument;
+		}
+
+	//read DSS' data into local structure
+	TListInformation info;
+	err = Kern::ThreadRawRead(iClientThread, aListInformation, (TUint8*)&info, sizeof(TListInformation));
+	if(err != KErrNone)
+		{
+		return err;
+		}
+
+	//check arguments
+	TPtr8 buffer(NULL, 0);
+	err = AllocAndReadDes(iClientThread, *info.iBuffer, buffer);
+	if(err != KErrNone)
+		{
+		//need to free the buffer if it was allocated
+		if(err != KErrNoMemory)
+			{
+			NKern::ThreadEnterCS();
+			Kern::Free((TAny*)buffer.Ptr());
+			NKern::ThreadLeaveCS();
+			}
+		return err;
+		}
+
+	//get the list
+	TUint32 dataSize = 0;
+	TListManager manager;
+	err = KErrArgument;
+	switch(info.iType)
+		{
+		case EXipLibraries:
+			if(Debug::EScopeGlobal == info.iListScope)
+				{
+				err = manager.GetXipLibrariesList(buffer, dataSize);
+				}
+			break;
+
+		case EThreads:
+			if(Debug::EScopeGlobal == info.iListScope)
+				{
+				err = manager.GetGlobalThreadList(buffer, dataSize);
+				}
+			else if(Debug::EScopeProcessSpecific == info.iListScope)
+				{
+				err = manager.GetThreadListForProcess(buffer, dataSize, info.iTargetId);
+				}
+			else if(Debug::EScopeThreadSpecific == info.iListScope)
+				{
+				err = manager.GetThreadListForThread(buffer, dataSize, info.iTargetId);
+				}
+			break;
+
+		case EProcesses:
+			if(Debug::EScopeGlobal == info.iListScope)
+				{
+				err = manager.GetProcessList(buffer, dataSize);
+				}
+			break;
+
+		case ECodeSegs:
+			if(Debug::EScopeGlobal == info.iListScope)
+				{
+				err = manager.GetGlobalCodeSegList(buffer, dataSize);
+				}
+			else if(Debug::EScopeProcessSpecific == info.iListScope)
+				{
+				err = manager.GetCodeSegListForProcess(buffer, dataSize, info.iTargetId);
+				}
+			else if(Debug::EScopeThreadSpecific == info.iListScope)
+				{
+				err = manager.GetCodeSegListForThread(buffer, dataSize, info.iTargetId);
+				}
+			break;
+
+		default:
+			err = KErrNotSupported;
+		}
+
+	if(err == KErrNone)
+		{
+		//if no error then write the buffer back
+		err = Kern::ThreadDesWrite(iClientThread, info.iBuffer, buffer, 0, KChunkShiftBy0, iClientThread);
+		}
+
+	//write back the size of the data regardless of any error
+	TInt writeErr = Kern::ThreadRawWrite(iClientThread, info.iDataSize, (TUint8*)&dataSize, sizeof(TUint32), iClientThread);
+	if(writeErr != KErrNone)
+		{
+		//if there was an error writing the size return that error instead
+		err = writeErr;
+		}
+
+	//free the buffer
+	NKern::ThreadEnterCS();
+	Kern::Free((TAny*)buffer.Ptr());
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/**
+Read registers and store register data in aRegisterInfo
+
+@param aThread thread to read registers from
+@param aRegisterInfo structure specifying which registers to read and providing
+       descriptors to write the register data into
+
+@return KErrNone if registers were read successfully. Note that this does not
+        mean that all the registers could be read, the
+        aRegisterInfo.iRegisterFlags array should be checked as to whether each
+        individual register could be read,
+        KErrArgument if aRegisterInfo is NULL, or if any of the pointers that
+        are members of aRegisterInfo are NULL, if an unknown register is
+        specified or if the passed in register values buffer is too small
+        KErrNoMemory if there is insufficient memory,
+        KErrDied, if the thread with thread ID aThreadId is dead
+*/
+TInt DRM_DebugChannel::ReadRegisters(DThread* aThread, TRM_DebugRegisterInformation* aRegisterInfo) const
+	{
+	LOG_MSG("DRM_DebugChannel::ReadRegisters()");
+
+	TInt err = KErrNone;
+
+	if (!aRegisterInfo)
+		return KErrArgument;
+
+	TRM_DebugRegisterInformation info;
+	err = Kern::ThreadRawRead(iClientThread, aRegisterInfo, (TUint8*)&info, sizeof(TRM_DebugRegisterInformation));
+	if (err != KErrNone)
+		return err;
+
+	if ((!info.iRegisterIds) || (!info.iRegisterValues) || (!info.iRegisterFlags))
+		return KErrArgument;
+
+	//read ids from client thread
+	TPtr8 ids(NULL, 0);
+	err = AllocAndReadDes(iClientThread, *info.iRegisterIds, ids);
+	if(err != KErrNone)
+		{
+		if(err == KErrNoMemory)
+			{
+			NKern::ThreadEnterCS();
+			Kern::Free((TAny*)ids.Ptr());
+			NKern::ThreadLeaveCS();
+			}
+		return err;
+		}
+
+	//read values from client thread
+	TPtr8 values(NULL, 0);
+	err = AllocAndReadDes(iClientThread, *info.iRegisterValues, values, EFalse);
+	if(err != KErrNone)
+		{
+		if(err == KErrNoMemory)
+			{
+			NKern::ThreadEnterCS();
+			Kern::Free((TAny*)values.Ptr());
+			NKern::ThreadLeaveCS();
+			}
+
+		NKern::ThreadEnterCS();
+		Kern::Free((TAny*)ids.Ptr());
+		NKern::ThreadLeaveCS();
+		return err;
+		}
+
+	//read flags from client thread
+	TPtr8 flags(NULL, 0);
+	err = AllocAndReadDes(iClientThread, *info.iRegisterFlags, flags, EFalse);
+	if(err != KErrNone)
+		{
+		if(err == KErrNoMemory)
+			{
+			NKern::ThreadEnterCS();
+			Kern::Free((TAny*)flags.Ptr());
+			NKern::ThreadLeaveCS();
+			}
+		NKern::ThreadEnterCS();
+		Kern::Free((TAny*)ids.Ptr());
+		Kern::Free((TAny*)values.Ptr());
+		NKern::ThreadLeaveCS();
+		return err;
+		}
+
+	err = DoReadRegisters(aThread, ids, values, flags);
+	if (err == KErrNone)
+		{
+		err = Kern::ThreadDesWrite(iClientThread, info.iRegisterValues, values, 0, KChunkShiftBy0, iClientThread);
+		if(err == KErrNone)
+			{
+			err = Kern::ThreadDesWrite(iClientThread, info.iRegisterFlags, flags, 0, KChunkShiftBy0, iClientThread);
+			}
+		}
+
+	NKern::ThreadEnterCS();
+	Kern::Free((TAny*)ids.Ptr());
+	Kern::Free((TAny*)values.Ptr());
+	Kern::Free((TAny*)flags.Ptr());
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/**
+@deprecated use DRM_DebugChannel::WriteRegisters(DThread* aThread, TRM_DebugRegisterInformation* aRegisterInfo) instead
+*/
+TInt DRM_DebugChannel::WriteRegistersLegacy(DThread* aThread, const TRM_DebugRegisterInfo* aRegisterInfo)
+	{
+	LOG_MSG("DRM_DebugChannel::WriteRegistersLegacy()");
+
+	TInt err = KErrNone;
+
+	if (!aRegisterInfo)
+		return KErrArgument;
+
+	TRM_DebugRegisterInfo info(0, 0, 0);
+	err = Kern::ThreadRawRead(iClientThread, aRegisterInfo, (TUint8*)&info, sizeof(TRM_DebugRegisterInfo));
+	if (err != KErrNone)
+		return err;
+
+	if (!info.iValues)
+		return KErrArgument;
+
+	TUint length = (info.iLastRegister - info.iFirstRegister + 1) * 4;
+
+	NKern::ThreadEnterCS();
+	TUint8 *values = (TUint8*)Kern::Alloc(length);
+	NKern::ThreadLeaveCS();
+	if (!values)
+		{
+		return KErrNoMemory;
+		}
+
+	TPtr8 valuesDes(values, length);
+
+	err = Kern::ThreadDesRead(iClientThread, info.iValues, valuesDes, 0);
+	if (err == KErrNone)
+		{
+		err = DoWriteRegisters(aThread, info.iFirstRegister, info.iLastRegister, valuesDes);
+		}
+
+	NKern::ThreadEnterCS();
+	Kern::Free(values);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/**
+Write registers and store flags data in aRegisterInfo
+
+@param aThread thread to write registers to
+@param aRegisterInfo structure specifying which registers to write and providing
+       descriptors to write the register flags data into
+
+@return KErrNone if registers were written successfully. Note that this does not
+        mean that all the registers could be written, the flags array
+        should be checked as to whether each individual register could be read,
+        KErrArgument if aRegisterInfo is NULL, or if any of the pointers that
+        are members of aRegisterInfo are NULL, if an unknown register is
+        specified or if the passed in register values buffer is too small, or
+        if aThread is NULL,
+        KErrGeneral if there was a problem initialising the register set,
+        KErrNoMemory if there is insufficient memory,
+        KErrDied, if the thread with thread ID aThreadId is dead
+*/
+TInt DRM_DebugChannel::WriteRegisters(DThread* aThread, TRM_DebugRegisterInformation* aRegisterInfo) const
+	{
+	LOG_MSG("DRM_DebugChannel::WriteRegisters()");
+
+	TInt err = KErrNone;
+
+	if (!aRegisterInfo)
+		return KErrArgument;
+
+	TRM_DebugRegisterInformation info;
+	err = Kern::ThreadRawRead(iClientThread, aRegisterInfo, (TUint8*)&info, sizeof(TRM_DebugRegisterInformation));
+	if (err != KErrNone)
+		return err;
+
+	if ((!info.iRegisterIds) || (!info.iRegisterValues) ||(!info.iRegisterFlags))
+		return KErrArgument;
+
+	//read ids from client thread
+	TPtr8 ids(NULL, 0);
+	err = AllocAndReadDes(iClientThread, *info.iRegisterIds, ids);
+	if(err != KErrNone)
+		{
+		if(err == KErrNoMemory)
+			{
+			NKern::ThreadEnterCS();
+			Kern::Free((TAny*)ids.Ptr());
+			NKern::ThreadLeaveCS();
+			}
+		return err;
+		}
+
+	//read values from client thread
+	TPtr8 values(NULL, 0);
+	err = AllocAndReadDes(iClientThread, *info.iRegisterValues, values);
+	if(err != KErrNone)
+		{
+		if(err == KErrNoMemory)
+			{
+			NKern::ThreadEnterCS();
+			Kern::Free((TAny*)values.Ptr());
+			NKern::ThreadLeaveCS();
+			}
+		NKern::ThreadEnterCS();
+		Kern::Free((TAny*)ids.Ptr());
+		NKern::ThreadLeaveCS();
+		return err;
+		}
+
+	//read flags from client thread
+	TPtr8 flags(NULL, 0);
+	err = AllocAndReadDes(iClientThread, *info.iRegisterFlags, flags, EFalse);
+	if(err != KErrNone)
+		{
+		if(err == KErrNoMemory)
+			{
+			NKern::ThreadEnterCS();
+			Kern::Free((TAny*)flags.Ptr());
+			NKern::ThreadLeaveCS();
+			}
+		NKern::ThreadEnterCS();
+		Kern::Free((TAny*)ids.Ptr());
+		Kern::Free((TAny*)values.Ptr());
+		NKern::ThreadLeaveCS();
+		return err;
+		}
+
+	err = DoWriteRegisters(aThread, ids, values, flags);
+	if(err == KErrNone)
+		{
+		err = Kern::ThreadDesWrite(iClientThread, info.iRegisterFlags, flags, 0, KChunkShiftBy0, iClientThread);
+		}
+
+	NKern::ThreadEnterCS();
+	Kern::Free((TAny*)ids.Ptr());
+	Kern::Free((TAny*)values.Ptr());
+	Kern::Free((TAny*)flags.Ptr());
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/**
+Suspends execution of the specified thread.
+
+@param aThread thread to resume
+
+@return KErrNone if there were no problems or KErrArgument if aThread is NULL
+*/
+TInt DRM_DebugChannel::DoSuspendThread(DThread *aThread)
+	{
+	LOG_MSG("DRM_DebugChannel::DoSuspendThread()");
+
+	if (!aThread)
+		{
+		LOG_MSG("Invalid dthread object");
+		return KErrArgument;
+		}
+
+	return TheDProcessTracker.SuspendThread(aThread);
+	}
+
+/**
+Resumes execution of the specified thread.
+
+@param aThread thread to resume
+
+@return KErrNone if there were no problems, KErrArgument if aThread is NULL
+        or an error value returned from DoStepRange()
+*/
+TInt DRM_DebugChannel::DoResumeThread(DThread *aThread)
+	{
+	if (!aThread)
+		return KErrArgument;
+
+	// get the current PC
+	TUint32 currentPC;
+	TInt err = ReadKernelRegisterValue(aThread, PC_REGISTER, currentPC);
+	if(err != KErrNone)
+		{
+		LOG_MSG2("DRM_DebugChannel::DoResumeThread : Read PC reg error %d.", err);
+		// Set to this value because 0 is dangerous since structures are usually 0-initialised,
+		// and could thus lead to a false positive in tmp break loop below
+		currentPC = 0xFFFFFFFF;
+		}
+	else
+		{
+		LOG_MSG2("DRM_DebugChannel::DoResumeThread(), pc=0x%x", currentPC);
+		}
+
+	// if there is a breakpoint at the current PC, we need to single step past it
+	TBreakEntry* breakEntry = NULL;
+	do
+		{
+		breakEntry = iBreakManager->GetNextBreak(breakEntry);
+		if(breakEntry && !iBreakManager->IsTemporaryBreak(*breakEntry))
+			{
+			if (breakEntry->iAddress == currentPC)
+				{
+                LOG_MSG2("DRM_DebugChannel::DoResumeThread : > DoStepRange(pc+1)=0x%x, resume once out of range", currentPC+1 );
+				return DoStepRange(aThread, currentPC, currentPC+1, ETrue, 1, ETrue);
+				}
+			}
+		} while(breakEntry);
+
+	return TheDProcessTracker.ResumeThread(aThread);
+	}
+
+//
+// DRM_DebugChannel::DoStepRange
+//
+TInt DRM_DebugChannel::DoStepRange(DThread *aThread, const TUint32 aStartAddress, const TUint32 aStopAddress, TBool aStepInto, TBool aResumeOnceOutOfRange, const TUint32 aNumSteps, TBool aUserRequest)
+	{
+	LOG_MSG("DRM_DebugChannel::DoStepRange()");
+
+	if (!aThread)
+		return KErrArgument;
+
+
+	TUint32 startAddress = (aStartAddress & 0x1) ? aStartAddress + 1 : aStartAddress;
+	TUint32 stopAddress = (aStopAddress & 0x1) ? aStopAddress + 1 : aStopAddress;;
+
+	// don't allow the user to step in the excluded ROM region.  this could be called
+	// internally however.  for example, the the special breakpoints we set to handle
+	// panics, exceptions, and library loaded events are in the user library, and we
+	// will need to step past the breakpoint before continuing the thread.
+	//if (aUserRequest && (startAddress >= iExcludedROMAddressStart) && (startAddress < iExcludedROMAddressEnd))
+	//{
+	//	return KErrNotSupported;
+	//}
+
+	// set the temp breakpoint, and disable the breakpoint at the current PC if necessary
+	// if its not a user request, and we are just trying to resume from a breakpoint,
+	// then we don't need to check for stubs. The last parameter aUserRequest tells
+	// ModifyBreaksForStep to check for stubs or not. In some cases, the check for stubs
+	// is true even if its not a user request.For example, this is true in cases where
+	// we are doing a step range and the instruction in the range modified PC.
+	// in this case, DoStepRange will be called from the exception handler where
+	// we need to check for the stubs for the valid behavior. So truly, we don't need to check
+	// for stubs only when resuming from  a breakpoint.
+	ReturnIfError(iStepper->ModifyBreaksForStep(aThread, startAddress, stopAddress, aResumeOnceOutOfRange, aUserRequest, aNumSteps));
+
+	LOG_MSG("DRM_DebugChannel::DoStepRange() - resuming thread\n");
+
+	return TheDProcessTracker.ResumeThread(aThread);
+	}
+
+/**
+Read memory from the specified addres into the aData descriptor. If there is a
+breakpoint set in the region of memory returned then the correct data value is
+inserted into the descriptor
+
+@param aThread pointer to thread whose address space memory is to be read from
+@param aAddress address to start reading memory from
+@param aLength length of memory block to read
+@param aData descriptor to read memory into
+
+@return KErrNone if memory read successfully,
+        KErrNotSupported if reading from the rom section is not supported,
+        KErrBadHandle if aThread is invalid,
+        or one of the other system wide error codes
+*/
+TInt DRM_DebugChannel::DoReadMemory(const DThread *aThread, const TUint32 aAddress, const TUint32 aLength, TDes8 &aData) const
+	{
+	LOG_MSG("DRM_DebugChannel::DoReadMemory()");
+
+	// make sure the parameters are valid
+	if (aLength > aData.MaxSize())
+		return KErrArgument;
+
+	TInt err = KErrNone;
+
+	// trap exceptions in case the address is invalid
+	XTRAPD(r, XT_DEFAULT, err = TryToReadMemory(aThread, (TAny *)aAddress, (TAny *)aData.Ptr(), aLength));
+
+	err = (KErrNone == r) ? err : r;
+
+	if (KErrNone == err)
+		{
+		aData.SetLength(aLength);
+
+		TPtr8 data((TUint8 *)aData.Ptr(), aLength, aLength);
+
+		// if we have any breakpoints in this range, put the actual instruction in the buffer
+		TBreakEntry* breakEntry = NULL;
+		do
+			{
+			breakEntry = iBreakManager->GetNextBreak(breakEntry);
+			if(breakEntry && !iBreakManager->IsTemporaryBreak(*breakEntry))
+				{
+				if ((breakEntry->iAddress >= aAddress) && (breakEntry->iAddress < (aAddress + aLength)))
+					{
+					TInt instSize;
+
+					switch(breakEntry->iMode)
+						{
+						case EArmMode:
+							instSize = 4;
+							break;
+
+						case EThumbMode:
+							instSize = 2;
+							break;
+
+						case EThumb2EEMode:
+						default:
+							LOG_MSG("DRM_DebugChannel::DoReadMemory() cannot fixup breakpoints with unsupported architecture");
+							return KErrNotSupported;
+						}
+					memcpy((TAny*)&data[breakEntry->iAddress - aAddress], (TAny *)breakEntry->iInstruction.Ptr(), instSize);
+					}
+				}
+			} while(breakEntry);
+		}
+
+	return err;
+	}
+
+/**
+Attempt to write memory to aThread's address space
+
+@param aThread thread to whose address space memory is to be written
+@param aAddress memory location to write memory to
+@param aLength number of bytes of data to write
+@param aData descriptor containing memory to write
+
+@return KErrNone if memory written successfully,
+        KErrArgument if aLength is greater than than the length of the aData
+        KErrBadHandle if aThread is invalid,
+	or another of the system wide error codes
+*/
+TInt DRM_DebugChannel::DoWriteMemory(DThread *aThread, const TUint32 aAddress, const TUint32 aLength, TDes8 &aData)
+	{
+	LOG_MSG("DRM_DebugChannel::DoWriteMemory()");
+
+	// make sure the parameters are valid
+	if (aLength > aData.Length())
+		return KErrArgument;
+
+	TInt err = KErrNone;
+
+	// trap exceptions in case the address is invalid
+	XTRAPD(r, XT_DEFAULT, err = TryToWriteMemory(aThread, (TAny *)aAddress, (TAny *)aData.Ptr(), aLength));
+
+	err = (KErrNone == r) ? err : r;
+
+	// reset any breakpoints we may have just overwritten
+	if (KErrNone == err)
+		{
+		TPtr8 data((TUint8 *)aData.Ptr(), aLength, aLength);
+
+		TBreakEntry* breakEntry = NULL;
+		do
+			{
+			breakEntry = iBreakManager->GetNextBreak(breakEntry);
+			if(breakEntry && !iBreakManager->IsTemporaryBreak(*breakEntry))
+				{
+				if ((breakEntry->iAddress >= aAddress) && (breakEntry->iAddress < (aAddress + aLength)))
+					{
+					// default to arm mode
+					TUint32 inst;
+					TInt instSize;
+
+					switch (breakEntry->iMode)
+						{
+						case EArmMode:
+							inst = KArmBreakPoint;
+							instSize = 4;
+							break;
+
+						case EThumbMode:
+							inst = KThumbBreakPoint;
+							instSize = 2;
+							break;
+
+						case EThumb2EEMode:
+						default:
+							LOG_MSG("DRM_DebugChannel::DoWriteMemory() cannot fixup breakpoints of unsupported architecture type");
+
+							return KErrNotSupported;
+						}
+
+					breakEntry->iInstruction.Copy(&data[breakEntry->iAddress - aAddress], instSize);
+					memcpy((TAny*)breakEntry->iAddress, (TAny *)&inst, instSize);
+					}
+				}
+
+			} while(breakEntry);
+		}
+	return err;
+	}
+
+//
+// DRM_DebugChannel::DoReadRegisters
+//
+TInt DRM_DebugChannel::DoReadRegisters(DThread *aThread, const TInt16 aFirstRegister, const TInt16 aLastRegister, TDes8 &aValues)
+	{
+	LOG_EVENT_MSG("DRM_DebugChannel::DoReadRegisters()");
+
+	// make sure the parameters are valid
+	if (!aThread || (aFirstRegister < 0) || (aLastRegister >= (TInt16)(sizeof(TArmRegSet)/sizeof(TArmReg))))
+		return KErrArgument;
+
+	// make sure the descriptor is big enough to hold the requested data
+	if ((TInt)((aLastRegister - aFirstRegister + 1) * sizeof(TArmReg)) > (aValues.MaxSize()))
+		return KErrArgument;
+
+	TArmRegSet regSet;
+	TUint32 unused;
+
+	NKern::ThreadGetUserContext(&aThread->iNThread, &regSet, unused);
+
+	LOG_MSG2( "DRM_DebugChannel::DoReadRegistersLegacy() : unused = 0x%X\n", unused );
+
+	TArmReg *reg = &regSet.iR0;
+
+	if (!reg)
+		return KErrGeneral;
+
+	for (TInt16 i = aFirstRegister; i <= aLastRegister; i++)
+		aValues.Append((TUint8 *)&reg[i], sizeof(TArmReg));
+
+	return KErrNone;
+}
+
+/**
+  @prototype
+
+  Experimental function for determining whether a thread is suspended.
+
+  @param aThread thread to check if suspended
+
+  @return ETrue if the thread is suspended, EFalse if it isn't or does not exist
+  */
+TBool DRM_DebugChannel::CheckSuspended(const DThread *aThread) const
+	{
+	if(!aThread)
+		{
+		return EFalse;
+		}
+
+	if( (aThread->iNThread.iCsCount>0) && (aThread->iNThread.iCsFunction>0) )
+		{
+		return ETrue;
+		}
+
+	if(aThread->iNThread.iSuspendCount > 0)
+		{
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+/**
+Read registers and store register values in aRegisterValues and the flags
+indicating which registers could be read in aRegisterFlags
+
+@param aThread thread to read registers from
+@param aRegisterIds array containing register IDs to read
+@param aRegisterValues array to store register values in
+@param aRegisterFlags array to store flags in
+
+@return KErrNone if registers were read successfully. Note that this does not
+        mean that all the registers could be read, the aRegisterFlags array
+        should be checked as to whether each individual register could be read,
+        KErrArgument if aThread is NULL, if an unknown register is specified in
+        aRegisterValues or if aRegisterValues is too small
+        KErrGeneral if there was a problem initialising the register set
+*/
+TInt DRM_DebugChannel::DoReadRegisters(DThread *aThread, const TDesC8 &aRegisterIds, TDes8 &aRegisterValues, TDes8& aRegisterFlags) const
+	{
+	LOG_MSG("DRM_DebugChannel::DoReadRegisters()");
+
+	// make sure the parameters are valid
+	if (!aThread)
+		return KErrArgument;
+
+	//Need to revisit this to determine whether there is a way to validate this
+#if 0
+	if ( !CheckSuspended(aThread) )
+		{
+		LOG_MSG2("DRM_DebugChannel::DoReadRegisters() thread with id 0x%08x is not suspended", aThread->iId);
+		return KErrInUse;
+		}
+#endif
+
+	//set lengths of output descriptors to 0 prior to filling
+	aRegisterValues.SetLength(0);
+	aRegisterFlags.SetLength(0);
+
+	TArmRegSet regSet;
+	TUint32 flags;
+
+	NKern::ThreadGetUserContext(&aThread->iNThread, &regSet, flags);
+
+	LOG_MSG2( "DRM_DebugChannel::DoReadRegisters() : flags = 0x%X\n", flags );
+
+	TArmReg *regPtr = &regSet.iR0;
+
+	if (!regPtr)
+		return KErrGeneral;
+
+	TUint numberOfRegisters = aRegisterIds.Length() / sizeof(TRegisterInfo);
+
+	//iterate through registers setting the relevant aFlags value
+	for(TUint i=0; i<numberOfRegisters; i++)
+		{
+		//get current register id
+		TRegisterInfo reg;
+		TInt err = GetTRegisterInfo(aRegisterIds, i, reg);
+		//exit with the error value if there was an error
+		if(err != KErrNone)
+			return err;
+
+		//if unknown register then exit as can't know how many bytes this entry will
+		//represent in aRegisterValues
+		TTag registerTag;
+		TDebugFunctionality::GetRegister(reg, registerTag);
+		if(registerTag.iValue == EAccessUnknown)
+			{
+			return KErrArgument;
+			}
+
+		//get the current register id as a kernel register
+		TArmReg armReg;
+		err = GetKernelRegisterId(reg, armReg);
+		if((err == KErrNotSupported) || (registerTag.iValue == EAccessNone) || (registerTag.iValue == EAccessWriteOnly))
+			{
+			//reading this register is not supported
+			aRegisterFlags.Append(ENotSupported);
+			//just skip over this entry in the values buffer
+			if(aRegisterValues.Length() + registerTag.iSize > aRegisterValues.MaxLength())
+				{
+				//writing this value would cause overflow so exit
+				return KErrArgument;
+				}
+			aRegisterValues.SetLength(aRegisterValues.Length() + registerTag.iSize);
+			}
+		else
+			{
+			if(registerTag.iSize == sizeof(TArmReg))
+				{
+				if(GetFlagAtOffset(flags, armReg))
+					{
+					//set flag as valid
+					aRegisterFlags.Append(EValid);
+					}
+				else
+					{
+					// Even though the flag is invalid, we can return the value of the register
+					// and let the user decide what to do
+					aRegisterFlags.Append(EInValid);
+					}
+
+				if(aRegisterValues.Length() + sizeof(TArmReg) > aRegisterValues.MaxLength())
+					{
+					//writing this value would cause overflow so exit
+					return KErrArgument;
+					}
+				//write value into register into regSet
+				aRegisterValues.Append((TUint8 *)&regPtr[armReg], registerTag.iSize);
+				}
+			else
+				{
+				//currently all kernel supported registers are 4 bytes so
+				//return EBadSize. Would need updating if/when other register
+				//value sizes are supported
+				aRegisterFlags.Append(EBadSize);
+				aRegisterValues.SetLength(aRegisterValues.Length() + registerTag.iSize);
+				}
+			}
+		}
+	return KErrNone;
+	}
+
+//
+// DRM_DebugChannel::DoWriteRegisters
+//
+TInt DRM_DebugChannel::DoWriteRegisters(DThread *aThread, const TInt16 aFirstRegister, const TInt16 aLastRegister, TDesC8 &aValues)
+	{
+	LOG_MSG("DRM_DebugChannel::DoWriteRegisters()");
+
+	// make sure the parameters are valid
+	if (!aThread || (aFirstRegister < 0) || (aLastRegister >= (TInt16)(sizeof(TArmRegSet)/sizeof(TArmReg))))
+		return KErrArgument;
+
+	// make sure the descriptor is big enough to hold the data to write
+	if ((TInt)((aLastRegister - aFirstRegister + 1) * sizeof(TArmReg)) > (aValues.Length()))
+		return KErrArgument;
+
+	TArmRegSet regSet;
+	TUint32 unused;
+
+	NKern::ThreadGetUserContext(&aThread->iNThread, &regSet, unused);
+
+	TArmReg *reg = &regSet.iR0;
+
+	for (TInt16 i = aFirstRegister; i <= aLastRegister; i++)
+		reg[i] = *(TUint32 *)&aValues[(i-aFirstRegister)*sizeof(TArmReg)];
+
+	NKern::ThreadSetUserContext(&aThread->iNThread, &regSet);
+
+	return KErrNone;
+	}
+
+/**
+Write registers and store flags indicating which registers could be read in
+aRegisterFlags
+
+@param aThread thread to write registers to
+@param aRegisterIds array containing register IDs to write
+@param aRegisterValues array containing register values to write
+@param aRegisterFlags array to store flags in
+
+@return KErrNone if registers were written successfully. Note that this does not
+        mean that all the registers could be written, the aRegisterFlags array
+        should be checked as to whether each individual register could be read,
+        KErrArgument if aThread is NULL, if the buffer passed in as
+        aRegisterValue is too small, or if an unknown register is requested,
+        KErrGeneral if there was a problem initialising the register set
+*/
+TInt DRM_DebugChannel::DoWriteRegisters(DThread *aThread, const TDesC8 &aRegisterIds, TDesC8 &aRegisterValues, TDes8 &aRegisterFlags) const
+	{
+	LOG_MSG("DRM_DebugChannel::DoWriteRegisters()");
+
+	// make sure the parameters are valid
+	if (!aThread)
+		return KErrArgument;
+
+
+	//get register values from kernel
+	TArmRegSet regSet;
+	TUint32 flags;
+	NKern::ThreadGetUserContext(&aThread->iNThread, &regSet, flags);
+
+	//set lengths of output descriptors to 0 prior to filling
+	aRegisterFlags.SetLength(0);
+
+	//pointer to first kernel register
+	TArmReg *regPtr = &regSet.iR0;
+
+	if (!regPtr)
+		return KErrGeneral;
+
+	//calculate number of registers
+	TUint numberOfRegisters = aRegisterIds.Length() / sizeof(TRegisterInfo);
+
+	//iterate through registers setting the relevant aRegisterFlags value and
+	//setting the necessary value in regSet ready to write to kernel
+	for(TUint i=0, offset = 0; i<numberOfRegisters; i++)
+		{
+		//get current register id
+		TRegisterInfo reg;
+		TInt err = GetTRegisterInfo(aRegisterIds, i, reg);
+		//exit with the error value if there was an error
+		if(err != KErrNone)
+			{
+			return err;
+			}
+
+		//if unknown register then exit as can't know how many bytes this entry will
+		//represent in aRegisterValues
+		TTag registerTag;
+		TDebugFunctionality::GetRegister(reg, registerTag);
+		if(registerTag.iValue == EAccessUnknown)
+			{
+			return KErrArgument;
+			}
+
+		//get the current register id as a kernel register
+		TArmReg armReg;
+		err = GetKernelRegisterId(reg, armReg);
+		if((err == KErrNotSupported) || (registerTag.iValue == EAccessNone) || (registerTag.iValue == EAccessReadOnly))
+			{
+			//writing to this register is not supported
+			aRegisterFlags.Append(ENotSupported);
+			}
+		else if(GetFlagAtOffset(flags, armReg))
+			{
+			if(registerTag.iSize == sizeof(TArmReg))
+				{
+				//set flag as valid
+				aRegisterFlags.Append(EValid);
+				if(offset + sizeof(TArmReg) > aRegisterValues.Length())
+					{
+					//getting this value would cause overflow so exit
+					return KErrArgument;
+					}
+				//write value into register into regSet
+				regPtr[armReg] = *(TUint32 *)&aRegisterValues[offset];
+				}
+			else
+				{
+				//currently all kernel supported registers are 4 bytes so
+				//return EBadSize. Would need updating if/when other register
+				//value sizes are supported
+				aRegisterFlags.Append(EBadSize);
+				}
+
+			}
+		else
+			{
+			//set flag as invalid as register value couldn't be read
+			aRegisterFlags.Append(EInValid);
+			}
+		offset+=registerTag.iSize;
+		}
+
+	//write the input data into the registers
+	NKern::ThreadSetUserContext(&aThread->iNThread, &regSet);
+
+	//return normally
+	return KErrNone;
+	}
+
+//
+// DRM_DebugChannel::DoSecurityCheck
+//
+TBool DRM_DebugChannel::DoSecurityCheck()
+	{
+	LOG_MSG("DRM_DebugChannel::DoSecurityCheck");
+	DProcess* clientProcess = iClientThread->iOwningProcess;
+	if (clientProcess)
+		{
+		SSecurityInfo secureInfo = clientProcess->iS;
+
+		LOG_MSG2("DoSecurityCheck - client secure id is 0x%08x",secureInfo.iSecureId);
+
+		// Ensure we really are communicating with the Debug Security Server
+		if (secureInfo.iSecureId == KUidDebugSecurityServer.iUid )
+			{
+			return ETrue;
+			}
+		}
+	return EFalse;
+	}
+
+/**
+Attempt to read memory from aThread's address space
+
+@param aThread thread from whose address space memory is to be read
+@param aSrc pointer to memory location to read memory from
+@param aDest pointer to memory location to write memory to
+@param aLength number of bytes of data to read
+
+@return KErrNone if memory read successfully,
+	or another of the system wide error codes
+*/
+TInt DRM_DebugChannel::TryToReadMemory(const DThread *aThread, const TAny *aSrc, TAny *aDest, const TUint32 aLength) const
+	{
+	LOG_MSG("DRM_DebugChannel::TryToReadMemory()");
+
+	// make sure the parameters are valid
+	if (!aThread)
+		return KErrArgument;
+
+	//Need to revisit this to determine whether there is a way to validate this
+#if 0
+	//check that the thread is suspended before reading the memory
+	if ( !CheckSuspended(aThread) )
+		{
+		LOG_MSG2("DRM_DebugChannel::TryToReadMemory() thread with id 0x%08x is not suspended", aThread->iId);
+		return KErrInUse;
+		}
+#endif
+
+	LOG_MSG2("Using Kern::ThreadRawRead to read memory at address %x", aSrc);
+	return Kern::ThreadRawRead((DThread *)aThread, aSrc, aDest, aLength);
+	}
+
+/**
+Attempt to write memory to aThread's address space
+
+@param aThread thread to whose address space memory is to be written
+@param aDest pointer to memory location to write memory to
+@param aSrc pointer to memory location to read memory from
+@param aLength number of bytes of data to write
+
+@return KErrNone if memory written successfully, or another of the system wide
+        error codes
+*/
+TInt DRM_DebugChannel::TryToWriteMemory(const DThread *aThread, TAny *aDest, const TAny *aSrc, const TUint32 aLength)
+	{
+	LOG_MSG("DRM_DebugChannel::TryToWriteMemory()");
+
+
+	LOG_MSG2("Using Kern::ThreadRawWrite to write memory at address %x", (TUint32)aDest);
+	return Kern::ThreadRawWrite((DThread *)aThread, aDest, aSrc, aLength, iClientThread);
+	}
+
+/**
+@deprecated use DRM_DebugChannel::ReadKernelRegisterValue(DThread *aThread, const TArmReg aKernelRegisterId, T4ByteRegisterValue &aValue) instead
+*/
+TInt32 DRM_DebugChannel::ReadRegister(DThread *aThread, TInt aNum)
+	{
+	LOG_MSG("DRM_DebugChannel::ReadRegister()");
+
+	if (!aThread || (aNum < 0) || (aNum >= (TInt16)(sizeof(TArmRegSet)/sizeof(TArmReg))))
+		{
+		LOG_MSG2("Invalid register number (%d) passed to ReadRegister", aNum);
+		return 0;
+		}
+
+	TArmRegSet regSet;
+	TUint32 unused;
+
+	NKern::ThreadGetUserContext(&aThread->iNThread, &regSet, unused);
+
+	TArmReg *reg = &regSet.iR0;
+
+	return ((TUint32 *)reg)[aNum];
+	}
+
+/**
+Given a TArmReg register ID, read the value of the register. The register value
+will be stored in aValue if the register could be read.
+
+@param aThread thread to read register from
+@param aKernelRegisterId ID of register to read from
+@param aValue value read from register
+
+@return KErrNone if value was successfully stored in aValue,
+        KErrNotSupported if aKernelRegister is not supported by the debug
+	security server,
+        or a return value from DRM_DebugChannel::ReadDebugRegisterValue()
+*/
+TInt32 DRM_DebugChannel::ReadKernelRegisterValue(DThread *aThread, const TArmReg aKernelRegisterId, T4ByteRegisterValue &aValue) const
+	{
+	//get register ID as a TRegisterInfo ID
+	TRegisterInfo regId;
+	TInt err = GetDebugRegisterId(aKernelRegisterId, regId);
+	if(err != KErrNone)
+		return err;
+
+	//get the value for the register
+	err = ReadDebugRegisterValue(aThread, regId, aValue);
+	return err;
+	}
+
+/**
+Given a TRegisterInfo register ID, read the value of this register. The
+register value will be stored in aValue if the register could be read.
+
+@param aThread thread to read register from
+@param aDebugRegisterId ID of register to read from
+@param aValue value read from register
+
+@return KErrNone if value was successfully stored in aValue,
+        TRegisterFlag::EInValid if value could not be read from the register,
+        TRegisterFlag::ENotSupported if the register is not supported,
+        KErrNoMemory if temporary memory could not be allocated,
+        or a return value from DRM_DebugChannel::DoReadRegisters
+*/
+TInt32 DRM_DebugChannel::ReadDebugRegisterValue(DThread *aThread, const TRegisterInfo aDebugRegisterId, T4ByteRegisterValue &aValue) const
+	{
+	//allocate temporary buffers to store data
+	NKern::ThreadEnterCS();
+	TUint8* id = (TUint8*)Kern::Alloc(sizeof(TRegisterInfo));
+	NKern::ThreadLeaveCS();
+	if(id == NULL)
+		{
+		return KErrNoMemory;
+		}
+
+	TPtr8 idPtr(id, sizeof(TRegisterInfo));
+
+	NKern::ThreadEnterCS();
+	TUint8* value = (TUint8*)Kern::Alloc(sizeof(T4ByteRegisterValue));
+	NKern::ThreadLeaveCS();
+	if(value == NULL)
+		{
+		return KErrNoMemory;
+		}
+	TPtr8 valuePtr(value, sizeof(T4ByteRegisterValue));
+
+	NKern::ThreadEnterCS();
+	TUint8* flag = (TUint8*)Kern::Alloc(sizeof(TUint8));
+	NKern::ThreadLeaveCS();
+	if(flag == NULL)
+		{
+		return KErrNoMemory;
+		}
+	TPtr8 flagPtr(flag, sizeof(TUint8));
+
+	//store register id in buffer
+	idPtr.Append((TUint8*)&aDebugRegisterId, sizeof(TRegisterInfo));
+
+	//read registers
+	TInt err = DoReadRegisters(aThread, idPtr, valuePtr, flagPtr);
+	if(err == KErrNone)
+		{
+		if(*flag == EValid)
+			{
+			//register could be read so store value
+			aValue = *(T4ByteRegisterValue*)value;
+			}
+		else
+			{
+			//register couldn't be read for some reason
+			err = *flag;
+			}
+		}
+
+	//free memory
+	NKern::ThreadEnterCS();
+	Kern::Free(id);
+	Kern::Free(value);
+	Kern::Free(flag);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+//
+// DRM_DebugChannel::NotifyAgentsFromEventPid
+//
+TBool DRM_DebugChannel::NotifyAgentsFromEventPid(const TDriverEventInfo& aEventInfo)
+	{
+
+	// Look for the relevant DTargetProcess
+	// We can find out the relevant process id from aEventInfo
+	TUint32 pid = aEventInfo.iProcessId;
+
+#ifdef	_DEBUG
+	if (aEventInfo.iEventType != EEventsUserTrace)
+		{
+		LOG_MSG3(" NotifyAgentsFromEventPid - pid = 0x%x, evType=%d", pid, aEventInfo.iEventType);
+		}
+#endif
+
+	//opening handle to process
+	DProcess* targetProcess = DebugUtils::OpenProcessHandle(pid);
+
+	if(!targetProcess)
+		{
+		LOG_EVENT_MSG("process does not exist!");
+		return EFalse;
+		}
+
+	// Are we debugging this process - decide based on iFileName
+	DCodeSeg* p = targetProcess->iCodeSeg;
+	DTargetProcess* foundProcess;
+	if (p)
+		{
+		foundProcess = TheDProcessTracker.FindProcess(*(p->iFileName));
+		}
+	else
+		{
+		// special case: may not have a code seg in some cases. in which case we tell everyone!
+		if (targetProcess->iName)
+			{
+			// copy the name of the process
+			foundProcess = TheDProcessTracker.FindProcess(*(targetProcess->iName));
+			}
+		else
+			{
+			foundProcess = NULL;
+			}
+		}
+
+    //close the handle
+    targetProcess->Close(NULL);
+
+	if (foundProcess)
+		{
+		foundProcess->NotifyEvent(aEventInfo);
+		return ETrue;
+		}
+	else
+		{
+		// Check if there's an attach-to-all handler
+		DDebugAgent* agent = TheDProcessTracker.GetCurrentAgentAttachedToAll();
+		if (agent)
+			{
+			LOG_EVENT_MSG2(" NotifyAgentsFromEventPid - found attach all agent 0x%lx", agent->Id());
+			agent->NotifyEvent(aEventInfo);
+			return ETrue;
+			}
+		}
+
+	// we are not debugging this process
+	return EFalse;
+	}
+
+DECLARE_STANDARD_LDD()
+	{
+	return new DRM_DebugDriverFactory;
+	}
+
+/**
+Helper function
+
+Allocates memory in current thread with a max length the same as aSrcDes. If
+aReadFromClient is true (as it is by default) then the data from aSrdDes is
+copied into the allocated aDestDes buffer.
+
+Use of this function should be followed at a later time by a call such as
+Kern::Free(aDestDes.Ptr())
+
+@param aThread pointer to thread to read data from
+@param aSrcDes descriptor in aThread to read data from
+@param aDestDes location to read data to. Memory is allocated at this location,
+       if memory is already allocated at this location then the function will
+       return KErrArgument
+@param aReadFromClient if false then data is not actually read from the
+       client, the memory is simply allocated
+@param aOffest offset into aSrcDes to start reading from. Default is 0.
+
+@return KErrNone if there were no problems,
+        KErrArgument if aDestDes.Ptr() != NULL or aSrcDes has max length 0,
+        KErrNoMemory if could not allocate memory,
+        or one of the other system wide error codes
+*/
+TInt DRM_DebugChannel::AllocAndReadDes(DThread *aThread, const TDesC8& aSrcDes, TPtr8& aDestDes, const TBool aReadFromClient, const TUint aOffset) const
+	{
+
+	//check thread is not null
+	if(!aThread)
+		{
+		return KErrArgument;
+		}
+
+	//check aDestDes is empty
+	if(aDestDes.Ptr() != NULL)
+		{
+		return KErrArgument;
+		}
+
+	//get the source descriptor's max length and exit if 0
+	TUint srcMaxLength = Kern::ThreadGetDesMaxLength(aThread, &aSrcDes);
+	if(srcMaxLength == 0)
+		{
+		return KErrNone;
+		}
+
+	//allocate memory and return if none available
+	NKern::ThreadEnterCS();
+	TUint8 *destPtr = (TUint8*)Kern::Alloc(srcMaxLength);
+	NKern::ThreadLeaveCS();
+	if (!destPtr)
+		{
+		return KErrNoMemory;
+		}
+
+	//point the TPtr8 at the target memory
+	aDestDes.Set(destPtr, srcMaxLength, srcMaxLength);
+
+	if(aReadFromClient)
+		{
+		//read data from the client thread and return status code
+		return Kern::ThreadDesRead(aThread, &aSrcDes, aDestDes, aOffset);
+		}
+	else
+		{
+		return KErrNone;
+		}
+	}
+
+/**
+Helper function to extract a TRegisterInfo value from a descriptor containing
+binary data.
+
+@param aRegisterIds descriptor containing register IDs
+@param aOffset offset in bytes into the descriptor to start reading data from.
+       If this value is not a multiple of sizeof(TRegisterInfo) then a
+       KErrArgument error is returned.
+@param aValue will contain the returned value
+
+@return KErrNone if aValue was set correctly, KErrArgument if bad arguments
+        were passed in
+*/
+TInt DRM_DebugChannel::GetTRegisterInfo(const TDesC8 &aRegisterIds, const TUint aIndex, TRegisterInfo &aValue) const
+	{
+	TUint length = aRegisterIds.Length();
+
+	TUint size = sizeof(TRegisterInfo);
+
+	//check that not trying to read past end of descriptor
+	if((aIndex + 1) * size > length)
+		return KErrArgument;
+
+	//get pointer to descriptor's data
+	const TUint8 *dataPtr = aRegisterIds.Ptr();
+	const TRegisterInfo *registerId = reinterpret_cast<const TRegisterInfo*>(dataPtr + (aIndex * size));
+
+	aValue = *registerId;
+
+	return KErrNone;
+	}
+
+/**
+Helper function to get the kernel register ID of the TRegisterInfo defined register.
+
+@param aDebugRegister the debug register ID to return the kernel ID for
+@param aKernelRegister corresponding value of register aDebugRegister
+
+@return KErrNone if translation occurred without problems
+        KErrNotSupported if aDebugRegister is not supported by the kernel
+*/
+TInt DRM_DebugChannel::GetKernelRegisterId(const TRegisterInfo aDebugRegister, TArmReg& aKernelRegister) const
+	{
+	if(Register::IsCoreReg(aDebugRegister))
+		{
+		TUint id = Register::GetCoreRegId(aDebugRegister);
+		//first 17 registers match the first 17 kernel registers
+		if(id < 17)
+			{
+			aKernelRegister = id;
+			}
+		else
+			{
+			return KErrNotSupported;
+			}
+		}
+	else if(Register::IsCoproReg(aDebugRegister))
+		{
+		TUint32 crn = Register::GetCRn(aDebugRegister);
+		TUint32 crm = Register::GetCRm(aDebugRegister);
+		TUint32 opcode1 = Register::GetOpcode1(aDebugRegister);
+		TUint32 opcode2 = Register::GetOpcode2(aDebugRegister);
+		TUint32 coproNum = Register::GetCoproNum(aDebugRegister);
+
+		//each coprocessor register has potentially different characteristics
+		//so need to identify each individually
+
+		//this is the DACR, the ARM ARM specifies that the CRn and the
+		//Opcodes are not relevant, section B3-24, point 3.7.3
+		if((coproNum == 15) && (crm == 3))
+			{
+			aKernelRegister = EArmDacr;
+			}
+		else
+			{
+			return KErrNotSupported;
+			}
+		}
+	else // might be supported at a later date
+		{
+		return KErrNotSupported;
+		}
+
+	return KErrNone;
+	}
+
+/**
+Helper function to get the debug register ID of the kernel defined register.
+
+@param aKernelRegister the kernel register ID to return the debug ID for
+@param aDebugRegister corresponding value of register aKernelRegister
+
+@return KErrNone if translation occured without problems
+        KErrNotSupported if aKernelRegister is not supported by the debug
+	security server
+*/
+TInt DRM_DebugChannel::GetDebugRegisterId(const TArmReg aKernelRegister, TRegisterInfo &aDebugRegister) const
+	{
+
+	// registers 0 - 15 and the CPSR share the same values as with the debug enums
+	if(aKernelRegister < 17)
+		{
+		TUint32 id = aKernelRegister;
+		aDebugRegister = id << 8;
+		}
+	//the DACR value is special and corresponds to EDF_Register_DACR
+	else if(aKernelRegister == EArmDacr)
+		{
+		aDebugRegister = 0x00300f01;
+		}
+	// must be an unsupported register, return an error as such
+	else
+		{
+		return KErrNotSupported;
+		}
+
+	//found a supported register so return KErrNone
+	return KErrNone;
+	}
+
+/**
+Helper function to find out whether the aIndex flag is set. This is equivalent
+to the aIndex bit of aFlags being non-zero.
+
+@param aFlags set of flags
+@param aIndex offset into aFlags to get flag from
+
+@return ETrue if bit is set, EFalse if not
+*/
+TBool DRM_DebugChannel::GetFlagAtOffset(const TUint32 aFlags, const TArmReg aIndex) const
+	{
+	return aFlags & (1<<aIndex);
+	}
+
+/* Register the attachment of a debug agent to a process to be debugged
+ *
+ * @param a1 - TDes8 target process name
+ * @param a2 - &TUint64 - Debug Agent Id
+ *
+ * @return - KErrNone if successful. KErrArgument if the filepath is not a valid size.
+ * KErrOutOfMemory if there is insufficient memory. Or one of the other system wide error codes
+ * if appropriate.
+ */
+TInt DRM_DebugChannel::AttachProcess(TAny* a1, TAny* a2)
+	{
+	LOG_MSG("DRM_DebugChannel::AttachProcess()");
+
+	// Validate the supplied TDes8 target process name in a1
+	TInt length = Kern::ThreadGetDesLength(iClientThread, a1);
+	if (length < 0) return length;
+
+	// Check the processname is a valid size for a filepath
+	if (length < 1 || length >= KMaxPath)
+		{
+		return KErrArgument;
+		}
+
+	// Allocate space to store the target process name in a kernel-side TPtr8
+	NKern::ThreadEnterCS();
+	TUint8* buffer = (TUint8*)Kern::AllocZ(length);
+	NKern::ThreadLeaveCS();
+	if (buffer==NULL)
+		{
+		// Out of memory
+		return KErrNoMemory;
+		}
+
+	// A temporary descriptor to store the target process name
+	TPtr8 targetProcessName(buffer,length,length);
+
+	// Read the user-side data into targetProcessName
+	TInt err = Kern::ThreadDesRead(iClientThread,a1,targetProcessName,0,KChunkShiftBy0);
+	if (err != KErrNone)
+		{
+		// Could not read the user-side descriptor containing the target process name
+		NKern::ThreadEnterCS();
+		Kern::Free(buffer);
+		NKern::ThreadLeaveCS();
+
+		return err;
+		}
+
+	// Obtain the Debug Agent Id
+	TUint64 debugAgentId = 0;
+
+	err = Kern::ThreadRawRead(iClientThread,a2,&debugAgentId,sizeof(debugAgentId));
+	if (err != KErrNone)
+		{
+		// Something bad happened so free the memory and return
+		NKern::ThreadEnterCS();
+		Kern::Free(buffer);
+		NKern::ThreadLeaveCS();
+		return err;
+		}
+
+	// Add the target process to our list of tracked processes
+	err = TheDProcessTracker.AttachProcess(targetProcessName, debugAgentId);
+
+	// Free the kernel-side memory containing targetProcessName data
+	NKern::ThreadEnterCS();
+	Kern::Free(buffer);
+	NKern::ThreadLeaveCS();
+
+	return err;
+	}
+
+/* Register the detachment of a debug agent to a process to be debugged.
+ *
+ * @param - a1 TDes8 target process name in a1
+ * @param a2 - &TUint64 - Debug Agent Id
+ *
+ * @return - KErrNone if successful. KErrArgument if the filepath is not a valid size.
+ * KErrOutOfMemory if there is insufficient memory. Or one of the other system wide error codes
+ * if appropriate.
+ */
+TInt DRM_DebugChannel::DetachProcess(TAny* a1, TAny* a2)
+	{
+	TInt length = Kern::ThreadGetDesLength(iClientThread, a1);
+	if (length < 0)
+		{
+		return length;
+		}
+
+	if (length < 1 || length >= KMaxPath)
+		{
+		return KErrArgument;
+		}
+
+	HBuf* targetProcessName = HBuf::New(length);
+	if (targetProcessName == NULL)
+		{
+		// Out of memory
+		return KErrNoMemory;
+		}
+
+	// Read the user-side data into buf
+	TInt err = Kern::ThreadDesRead(iClientThread,a1,*targetProcessName,0,KChunkShiftBy0);
+	if (err != KErrNone)
+		{
+		// Something bad happened so free the memory and return
+		delete targetProcessName;
+		return err;
+		}
+
+	// Obtain the AgentId
+	TUint64 debugAgentId = 0;
+
+	err = Kern::ThreadRawRead(iClientThread,a2,&debugAgentId,sizeof(debugAgentId));
+	if (err == KErrNone)
+		{
+		// Remove the process from our list of tracked processes
+		err = TheDProcessTracker.DetachProcess(*targetProcessName, debugAgentId);
+		}
+
+	// Free the kernel-side memory containing targetProcessName data
+	delete targetProcessName;
+	return err;
+	}
+
+/* Register the detachment of a debug agent from all processes being debugged.
+ *
+ * @param - a1 - &TUint64 Debug Agent Id.
+ * @return - KErrNone if successful. One of the system-wide error codes otherwise.
+ */
+TInt DRM_DebugChannel::DetachAgent(TAny* a1, TAny* a2)
+	{
+	// Obtain the AgentId
+	TUint64 debugAgentId = 0;
+
+	TInt err = Kern::ThreadRawRead(iClientThread,a1,&debugAgentId,sizeof(debugAgentId));
+	if (err != KErrNone)
+		{
+		return err;
+		}
+
+	// Remove the process from our list of tracked processes
+	return TheDProcessTracker.DetachAgent(debugAgentId);
+	}
+
+/* Set the action associated with a particular kernel event for a given agent and target process
+ *
+ * @param - a1 TDes8 target process name in a1
+ * @param - a2 &TRM_DebugEventActionInfo
+ * @return - KErrNone if successful. KErrArgument if the filepath is an invalid size. Or one of
+ * the other system wide error codes if appropriate.
+ */
+TInt DRM_DebugChannel::SetEventAction(TAny* a1, TAny* a2)
+	{
+	// Validate the supplied TDes8 target process name in a1
+	TInt length, maxLength;
+	TUint8* aPtr;
+
+	TInt err = Kern::ThreadGetDesInfo(iClientThread,\
+		a1,\
+		length,\
+		maxLength,\
+		aPtr,\
+		EFalse);
+	if (err != KErrNone)
+		{
+		return err;
+		}
+
+	if (length < 1 || length >= KMaxPath)
+		{
+		return KErrArgument;
+		}
+
+	if (maxLength < 1 || maxLength >= KMaxPath)
+		{
+		return KErrArgument;
+		}
+
+	// Allocate space to store the target process name in a kernelspace TPtr8
+	NKern::ThreadEnterCS();
+	TUint8* buffer = (TUint8*)Kern::AllocZ(length);
+	NKern::ThreadLeaveCS();
+	if (buffer==NULL)
+		{
+		// Out of memory
+		return KErrNoMemory;
+		}
+	TPtr8 targetProcessName(buffer,length,length);
+
+	// Read the user-side data into targetProcessName
+	err = Kern::ThreadDesRead(iClientThread,a1,targetProcessName,0,KChunkShiftBy0);
+	if (err != KErrNone)
+		{
+		// Something bad happened so free the memory and return
+		NKern::ThreadEnterCS();
+		Kern::Free(buffer);
+		NKern::ThreadLeaveCS();
+
+		return err;
+		}
+
+	// Read the Event and Action from the user-side
+	TRM_DebugEventActionInfo info(0,0,0);
+
+	err = Kern::ThreadRawRead(iClientThread, a2, &info, sizeof(info));
+	if (err != KErrNone)
+		{
+		// Could not read event action data from the user-side
+
+		// Free memory used for targetProcessName
+		NKern::ThreadEnterCS();
+		Kern::Free(buffer);
+		NKern::ThreadLeaveCS();
+
+		return err;
+		}
+	
+	DDebugAgent* debugAgent = TheDProcessTracker.FindAgentForProcessAndId( targetProcessName, info.iAgentId );
+	if (debugAgent != NULL)
+		{
+		// Set the event action
+		err = debugAgent->SetEventAction((TEventType)info.iEvent,(TKernelEventAction)info.iAction);
+		}
+	else
+		{
+		// Bad agent means there is no tracking agent
+		LOG_MSG2("Cannot locate debug agent with pid 0x%0xlx",info.iAgentId);
+		err = KErrNotFound;
+		}
+
+	// Free memory used for targetProcessName
+	NKern::ThreadEnterCS();
+	Kern::Free(buffer);
+	NKern::ThreadLeaveCS();
+
+	return err;
+
+	}
+
+TInt DRM_DebugChannel::Step(const TUint32 aThreadId, const TUint32 aNumSteps)
+	{
+	LOG_MSG3("DRM_DebugChannel::Step(aThreadId = 0x%08x, aNumSteps = 0x%08x)\n",aThreadId,aNumSteps);
+
+	DThread* thread = DebugUtils::OpenThreadHandle(aThreadId);
+
+	if (thread == NULL)
+		{
+		// The thread terminated before we could open it.
+		LOG_MSG2("DRM_DebugChannel::Step - Could not open thread %u", aThreadId);
+
+		return KErrArgument;
+		}
+
+	// We simply repeat this for desired number of steps
+	TInt err = KErrNone;
+
+	// Need to step from the current location for 'n' steps
+	TUint32 startAddress;
+
+	// We always step from the current PC.
+	err = ReadKernelRegisterValue(thread, PC_REGISTER, startAddress);
+	if(err != KErrNone)
+		{
+		LOG_MSG2("DRM_DebugChannel::Step - Could not read the PC: %d", err);
+
+		// Close the handle
+		thread->Close(NULL);
+
+		return err;
+		}
+
+	err = DoStepRange(thread, startAddress, startAddress, ETrue, EFalse, aNumSteps, ETrue);
+
+	if (err != KErrNone)
+		{
+		// There was a problem, return straightaway
+		LOG_MSG("DRM_DebugChannel::Step - failed to step");
+		}
+
+	// Close the handle
+	thread->Close(NULL);
+
+	return err;
+	}
+
+TInt DRM_DebugChannel::KillProcess(const TUint32 aProcessId, const TInt aReason)
+	{
+	LOG_MSG3("DRM_DebugChannel::KillProcess(aProcessId = 0x%08x, aReason = 0x%08x)\n",aProcessId,aReason);
+
+	DProcess* process = DebugUtils::OpenProcessHandle(aProcessId);
+
+	if (process == NULL)
+		{
+		// The process terminated before we could open it to kill it ourselves.
+		LOG_MSG2("DRM_DebugChannel::KillProcess - Could not open process %u", aProcessId);
+
+		return KErrArgument;
+		}
+
+	TInt err = KErrNone;
+
+	DebugSupport::TerminateProcess(process,aReason);
+
+	// Close the handle
+	process->Close(NULL);
+
+	return err;
+	}
+
+/* Security critical - this checks whether the specified process is debuggable or not
+ *
+ * @param aProcessId - The process id of the process to check
+ * @return KErrNone if debuggable, KErrPermissionDenied if not debuggable.
+ */
+TInt DRM_DebugChannel::IsDebuggable(const TUint32 aProcessId)
+	{
+	/* In order to ensure that only processes which are debuggable
+	 * can be debugged, this function enables the security server
+	 * to read the DProcess.iDebugAttributes field and ensure
+	 * the process was created from a debuggable executable.
+	 */
+	LOG_MSG2("DRM_DebugChannel::IsDebuggable(aProcessId 0x%08x)\n",aProcessId);
+
+	TInt err = KErrPermissionDenied;
+
+	DProcess* process = DebugUtils::OpenProcessHandle(aProcessId);
+	if (process)
+		{
+		if (process->iDebugAttributes & TProcessCreateInfo::EDebugAllowed)
+			{
+			// Yes this process exists and is debuggable
+			err = KErrNone;
+			}
+		process->Close(NULL);
+		}
+
+	if (err == KErrNone)
+		{
+		LOG_MSG2("DRM_DebugChannel::IsDebuggable(aProcessId 0x%08x) - Yes it is debuggable\n",aProcessId);
+		}
+
+	return err;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/group/rm_debug_svr.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,51 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+//
+
+ALWAYS_BUILD_AS_ARM 
+
+target         rm_debug_svr.exe
+targettype     exe
+
+sourcepath	   	../src
+source		c_shutdown_timer.cpp
+source		c_process_pair.cpp
+source        	c_security_svr_server.cpp 
+source        	c_security_svr_session.cpp 
+source		c_security_svr_async.cpp
+source        	rm_debug_svr.cpp
+
+library		euser.lib
+library         efsrv.lib
+library         btracec.lib
+
+userinclude ../inc
+userinclude ../../rmdriver/inc
+
+SYMBIAN_BASE_SYSTEMINCLUDE(nkern)
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+
+UID            0x100039CE 0x102834E2
+SECUREID       0x102834E2
+VENDORID       0x70000001
+
+
+// Enables UTrace logging of DSS public API calls
+macro SYMBIAN_TRACE_ENABLE
+
+//TCB is added for the RLocalDrive methods.
+CAPABILITY AllFiles TCB
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/inc/c_process_pair.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,53 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Provides a helper class for process security management
+// 
+//
+
+#ifndef C_PROCESS_PAIR_H
+#define C_PROCESS_PAIR_H
+
+/**
+@file
+@internalTechnology
+@released
+*/
+
+/**
+CProcessPair is a mapping between a debug agent's process Id, and
+the process fileName of a process the agent is interested in debugging.
+*/
+class CProcessPair : public CBase
+	{
+public:
+	static CProcessPair* NewL(const TDesC& aProcessName, const TProcessId aProcessId);
+	~CProcessPair();
+	TBool operator==(const CProcessPair &aProcessPair) const;
+	TBool Equals(const TDesC& aProcessName, const TProcessId aProcessId) const;
+	TBool ProcessIdMatches(const CProcessPair &aProcessPair) const;
+	TBool ProcessNameMatches(const CProcessPair &aProcessPair) const;
+	TBool ProcessIdMatches(const TProcessId &aProcessId) const;
+	TBool ProcessNameMatches(const TDesC& aProcessName) const;
+
+private:
+	CProcessPair();
+	void ConstructL(const TDesC& aProcessName, TProcessId aProcessId);
+
+private:
+	HBufC16* iProcessName;
+	TProcessId iProcessId;
+	};
+
+#endif //C_PROCESS_PAIR_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/inc/c_security_svr_async.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,83 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Asynchronous security server responder active object class.
+// 
+//
+
+#ifndef C_SECURITY_SVR_ASYNC_H
+#define C_SECURITY_SVR_ASYNC_H
+
+#include <rm_debug_api.h>
+
+#include "c_security_svr_session.h"
+#include "c_security_svr_server.h"
+
+// forward declaration
+class CSecuritySvrSession;
+
+/**
+Class used to handle asynchronous events within a DSS session. Currently this
+is only used to handle GetEvent() calls. It sets up an active object when a 
+client makes a GetEvent() call, and completes it when ready, or cancels it
+if the client so wishes.
+
+Only one outstanding active object per client session is permitted.
+*/
+class CSecuritySvrAsync : public CActive
+	{
+public:
+	~CSecuritySvrAsync();
+	static CSecuritySvrAsync* NewL(CSecuritySvrSession* aSession, const TDesC8& aProcessName, TProcessId aAgentId);
+
+	void GetEvent(const RMessage2& aMessage);
+	const TDesC8& ProcessName(void);
+
+protected:
+	CSecuritySvrAsync(CSecuritySvrSession* aSession, TProcessId aAgentId);
+
+	void ConstructL(const TDesC8& aProcessName);
+
+	virtual void RunL();
+	virtual void DoCancel();
+	virtual TInt RunError(TInt aError);
+
+private:
+
+    /*
+     * The last GetEvent message details. Needed for completion by RunL()
+     */
+    RMessagePtr2 iMessage;			
+
+    /*
+     * Temporary storage area for rm_debug.ldd to return data asynchronously
+     */
+	Debug::TEventInfo iInfo;
+
+	/*
+	 * Identity of this server session. Used for completing iMessage
+	 */
+	CSecuritySvrSession* iSession;
+
+	/*
+	 * Name of the process being debugged associated with this AO
+	 */
+	RBuf8 iProcessName;
+
+	/*
+	 * Debug Agent Id
+	 */
+	TProcessId iAgentId;
+	};
+ 
+#endif	// C_SECURITY_SVR_ASYNC_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/inc/c_security_svr_server.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,80 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Definitions for the security server server.
+// 
+//
+
+#ifndef C_SECURITY_SVR_SERVER_H
+#define C_SECURITY_SVR_SERVER_H
+
+/**
+@file
+@internalTechnology
+@released
+*/
+
+#include <rm_debug_api.h>
+#include "c_process_pair.h"
+#include "c_shutdown_timer.h"
+#include "rm_debug_kerneldriver.h"
+
+_LIT(KDebugDriverFileName,"rm_debug.ldd");
+class CSecuritySvrSession;
+
+/**
+Definition of a Debug Security Server. Responsible for managing all debug agent clients,
+including attachment/detachment from target executables. Keeps track of which executables
+are being debugged.
+*/
+class CSecuritySvrServer : public CServer2
+	{
+	public:
+		CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const;
+		TInt AttachProcessL(const TDesC& aTargetProcessName, const TProcessId aDebugAgentProcessId, const TBool aPassive);
+		TInt DetachProcess(const TDesC& aTargetProcessName, const TProcessId aDebugAgentProcessId);
+		void DetachAllProcesses(const TProcessId aDebugAgentProcessId);
+		TBool CheckAttached(const TThreadId aTargetThreadId, const RMessage2& aMessage, const TBool aPassive);
+		TBool CheckAttached(const TProcessId aTargetProcessId, const RMessage2& aMessage, const TBool aPassive);
+		TBool CheckAttachedProcess(const TDesC& aTargetProcessName, const RMessage2& aMessage, const TBool aPassive) const;
+		TBool IsDebugged(const TDesC& aTargetProcessName, const TBool aPassive) const;
+		void SessionClosed();
+		void SessionOpened();
+		static CSecuritySvrServer* NewLC();
+
+		TBool OEMTokenPermitsDebugL(const TCapabilitySet aTokenCaps, const TCapabilitySet aTargetCaps);
+		TBool OEMTokenPermitsFlashAccessL(const TCapabilitySet aTokenCaps);
+
+	protected:
+		CSecuritySvrServer(CActive::TPriority aActiveObjectPriority);
+		void ConstructL();
+		
+	private:
+		~CSecuritySvrServer();
+		TBool IsActiveDebugger(const TDesC& aTargetProcessName, const TProcessId aDebugAgentProcessId) const;
+		TBool IsDebugger(const TDesC& aTargetProcessName, const TProcessId aDebugAgentProcessId) const;
+		TInt GetProcessIdFromMessage(TProcessId& aProcessId, const RMessage2& aMessage) const;
+
+	private:
+		RPointerArray<CProcessPair> iActiveDebugMap;
+		RPointerArray<CProcessPair> iPassiveDebugMap;
+		TInt iSessionCount;
+		CShutdownTimer iShutdown;
+		RRM_DebugDriver iKernelDriver;
+
+	// Declare the CSecuritySvrAsync as a friend so it can use the iKernelDriver too
+	friend class CSecuritySvrAsync;
+	friend class CSecuritySvrSession;
+	};
+
+#endif // C_SECURITY_SVR_SERVER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/inc/c_security_svr_session.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,204 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Definitions for the security server server side session.
+// 
+//
+
+#ifndef C_SECURITY_SVR_SESSION_H
+#define C_SECURITY_SVR_SESSION_H
+
+/**
+@file
+@internalTechnology
+@released
+*/
+
+// forward declaration
+class CSecuritySvrAsync;
+
+#include "c_security_svr_async.h"
+#include <f32file.h>
+#include <d32locd.h>
+
+#include <rm_debug_api.h>
+
+#include "rm_debug_kerneldriver.h"
+
+// Server name
+_LIT(KDebugDriverName,"RunMode Debug Driver");
+
+class CSecuritySvrServer;
+
+/**
+Debug Security Server session. Manages the session with one debug agent and
+as many target executables as it has attached to.
+*/
+class CSecuritySvrSession : public CSession2
+	{
+public:
+	CSecuritySvrSession(const TProcessId& aDebugAgentProcessId);
+	~CSecuritySvrSession();
+	void ConstructL ();
+	void CreateL();
+
+	TInt OpenHandle(const TRM_DebugDriverInfo& aDriverInfo);
+	void ServiceL(const RMessage2& aMessage);
+	void ServiceError(const RMessage2 &aMessage, TInt aError);
+
+	void ResumeThreadL(const RMessage2& aMessage);
+	void SuspendThreadL(const RMessage2& aMessage);
+	//break
+	void SetBreakL(const RMessage2& aMessage);
+	void ClearBreakL(const RMessage2& aMessage);
+	void ModifyBreakL(const RMessage2& aMessage);
+	void BreakInfoL(const RMessage2& aMessage);
+
+	void StepRangeL(const RMessage2& aMessage);
+
+	void GetEventL(const RMessage2& aMessage);
+	void CancelGetEventL(const RMessage2& aMessage);
+
+	void AttachProcessL(const RMessage2& aMessage);
+	void DetachProcessL(const RMessage2& aMessage);
+	
+    void AttachAllL(const RMessage2& aMessage);
+    void DetachAllL(const RMessage2& aMessage);
+    
+	//debug functionality
+	void GetDebugFunctionalityBufSizeL(const RMessage2& aMessage);
+	void GetDebugFunctionalityL(const RMessage2& aMessage);
+	//memory
+	void ReadMemoryL(const RMessage2& aMessage);
+	void WriteMemoryL(const RMessage2& aMessage);
+	//registers
+	void ReadRegistersL(const RMessage2& aMessage);
+	void WriteRegistersL(const RMessage2& aMessage);
+	//event
+	void SetEventActionL(const RMessage2& aMessage);
+
+	void GetListL(const RMessage2& aMessage);
+	void StepL(const RMessage2& aMessage);
+	void TraceExecutableL(const RMessage2& aMessage);
+	
+	//crash log
+	void ReadCrashLogL(const RMessage2& aMessage);
+	void WriteCrashConfigL(const RMessage2& aMessage);
+	void EraseCrashLogL(const RMessage2& aMessage);
+	void EraseEntireCrashLogL(const RMessage2& aMessage);
+
+	void SetProcessBreakL(const RMessage2& aMessage);
+	void ModifyProcessBreakL(const RMessage2& aMessage);
+	void ProcessBreakInfoL(const RMessage2& aMessage);
+
+	void KillProcessL(const RMessage2& aMessage);
+
+	TCapabilitySet GetOEMDebugCapabilities(void) const { return iOEMDebugCapabilities; };
+
+#ifdef _DEBUG
+	void DoFailAlloc(const RMessage2& aMessage);
+#endif
+
+private:
+	CSecuritySvrServer& Server() const;
+	void HeapWatcher(const TUint32 aFunction, const TBool aEntry) const;
+	void WriteDataL(const RMessage2& aMessage, const TInt aIndex, const TAny* aPtr, const TUint32 aPtrSize) const;
+	void CheckAttachedL(const TThreadId aThreadId, const RMessage2& aMessage, const TBool aPassive) const;
+	void CheckAttachedL(const TProcessId aProcessId, const RMessage2& aMessage, const TBool aPassive) const;
+	TBool PermitDebugL(const TProcessId aDebugAgentProcessId, const TDesC& aTargetProcessName) const;
+	TBool IsDebugged(const TDesC& aFileName, const TBool aPassive) const;
+	void OpenFileHandleL(const TDesC& aFileName, RFs& aFs, RFile& aFileHandle);
+	TBool IsTraceBitSet(const TDesC8& aHeaderData, const TBool aXip);
+	TBool IsDebugBitSet(const TDesC8& aHeaderData, const TBool aXip);
+	TBool CheckSufficientData(const TDesC8& aHeaderData, const TBool aXip) const;
+
+	void ValidateMemoryInfoL(const TThreadId aThreadId, const Debug::TMemoryInfo &aMemoryInfo, const TBool aReadOperation);
+	void ValidateRegisterBuffersL(const RMessage2& aMessage, TUint32& aNumberOfRegisters);
+
+	TInt GetExecutablesListL(TDes8& aBuffer, TUint32& aSize) const;
+	void AppendExecutableData(TDes8& aBuffer, TUint32& aSize, const TDesC& aEntryName) const;
+	void GetSecureIdL(const TDesC& aFileName, TUid& aSecureId);
+	TUid GetSecureIdL(const TDesC8& aHeaderData, TBool aXip);
+
+	void IsDebuggableL(const TDesC& aFileName);
+	TThreadId ReadTThreadIdL(const RMessagePtr2& aMessage, const TInt aIndex) const;
+	TProcessId ReadTProcessIdL(const RMessagePtr2& aMessage, const TInt aIndex) const;
+	TBool IsExecutableXipL(RFile& aExecutable);
+	
+	void ConnectCrashPartitionL(void);
+
+	void GetDebugAgentOEMTokenCapsL();
+	TInt CheckFlashAccessPermissionL(const RThread& aClientThread);
+
+	// Declare the CSecuritySvrAsync as a friend so it can use the iKernelDriver too
+	friend class CSecuritySvrAsync;
+
+private:
+	/**
+	The TProcessId of the Debug Agent associated with this session. A convenience to
+	save looking it up repeatedly.
+	*/
+	TProcessId iDebugAgentProcessId;
+	/**
+	Need an array of async completion objects, one for each target executable.
+	*/
+	RPointerArray<CSecuritySvrAsync> iAsyncHandlers;
+
+	/**
+	Used to track whether the Debug Agent has been notified when closing the session.
+	*/
+	TBool iServerNotified;
+
+	/**
+	OEM Debug token support. This is only used when the Debug Agent has OEM debug 
+	authority provided by a specific authorisation token file. This token confers
+	the ability to debug certain executables which have not been built as 'Debuggable'.
+	
+	The OEM Debug token executable must be marked with 'AllFiles', as this is analogous
+	to looking 'inside' executables - with AllFiles, it could read all the data out of an
+	executable in \sys\bin\. In addition, since debug control of an executable implies the
+	ability to execute arbitrary code within the target process space, this would imply that
+	a Debug Agent could use any PlatSec capability which that target process possessed.
+	
+	Therefore, we require that the OEM Debug Token must also be marked with a superset of
+	the PlatSec capabilities of the executable which is to be debugged. This means the
+	Debug Agent is not granted more access/PlatSec capabilities than its authorisation
+	token allows, and cannot exploit a target executable to leverage greater access than
+	should be permitted.
+
+	iTargetCapabilities tracks which PlatSec capabilities the target executables may
+	possess and still be debugged by this debug agent. The capabilities are NOT those
+	of the debug agent process, they are the capabilites indicated in the OEM Debug Token
+	which describe the capabilities the debug agent is authorised to debug. E.g. a Debug
+	Agent might use CommsDD, but wish to debug a DRM capable executable. In that case, the
+	Debug Agent exe must be signed with CommsDD, but the OEM Debug Token need only possess
+	DRM and AllFiles (permission to look inside another executable).
+	*/
+	TCapabilitySet iOEMDebugCapabilities;
+	
+	//RLocalDrive to access the crash Flash
+	RLocalDrive iLocalDrive;
+	
+	//For NOR flash 
+	TLocalDriveCapsV2 iCaps;
+	
+	/**
+	 * If true means the local drive connected to the crash partition else connect 
+	 * when access required to crash flash partition for read operation
+	*/	
+	TBool iCrashConnected;
+	};
+
+
+#endif // C_SECURITY_SVR_SESSION_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/inc/c_shutdown_timer.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,46 @@
+// 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 the License "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:
+// Definitions for the security server's shutdown timer.
+// 
+//
+
+#ifndef C_SHUTDOWN_TIMER_H
+#define C_SHUTDOWN_TIMER_H
+
+/**
+@file
+@internalTechnology
+@released
+*/
+
+#include <e32base.h>
+
+const TInt KShutdownDelay = 5000000; // approx 5 seconds
+const TInt KActivePriorityShutdown = -1; // priority for shutdown AO
+
+/**
+Timer class used to manage shutdown of the DSS
+*/
+class CShutdownTimer : public CTimer
+	{
+public:
+	CShutdownTimer();
+	void ConstructL();
+	void Start();
+private:
+	void RunL();
+	};
+
+#endif // C_SHUTDOWN_TIMER_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/inc/low_mem_requests.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+// 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 the License "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:
+// Request numbers for use with the Debug Security Server and low mem tests
+// 
+//
+
+#ifndef LOW_MEM_REQUESTS_H
+#define LOW_MEM_REQUESTS_H
+
+/**
+@file
+@internalTechnology
+@released
+*/
+
+#ifdef _DEBUG
+// enumerators to use to call Debug Security Server in debug mode for low mem tests
+enum TLowMemDebugServRqst
+	{
+	EDebugServFailAlloc = 0x10000001,
+	EDebugServMarkEnd = 0x10000002,
+	EDebugServMarkHeap = 0x10000003
+	};
+#endif
+
+#endif //LOW_MEM_REQUESTS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/inc/rm_debug_api.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,2657 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Definitions for the run mode debug agent client side sessions.
+// 
+// WARNING: This file contains some APIs which are internal and are subject
+//          to change without notice. Such APIs should therefore not be used
+//          outside the Kernel and Hardware Services package.
+//
+
+#ifndef RM_DEBUG_API_H
+#define RM_DEBUG_API_H
+
+/**
+@file
+@publishedPartner
+@released
+*/
+
+#include <e32cmn.h>
+#include <e32def_private.h>
+
+/**
+  The Debug namespace contains all API definitions used for on-target debugging.
+  */
+namespace Debug {
+
+/** This is the maximum size in bytes a user trace can be */
+const TInt TUserTraceSize = 256;
+
+/**
+  Information in the debug functionality block is represented as a concatenation
+  of pairs of TTagHeader structures and arrays of TTag objects.
+  @see TTagHeader
+  @see RSecuritySvrSession::GetDebugFunctionality
+  */
+struct TTag
+{
+	/** Tag ID, value identifying this tag. */
+	TUint32	iTagId;
+	/**
+	  Values correspond to TTagType enumerators.
+	  @see TTagType
+	  */
+	TUint16	iType;
+	/** Size of external data associated with this tag. */
+	TUint16 iSize;
+	/** Data associated with this tag. */
+	TUint32 iValue;
+};
+
+/**
+  Enumeration defining the supported tag types. These enumerators are used in TTag.iTagId.
+  @see TTag
+  */
+enum TTagType
+{
+	/** Indicates that the iValue field of a TTag structure will contain either ETrue or EFalse. */
+	ETagTypeBoolean = 0,
+	/** Indicates that the iValue field of a TTag structure will contain a value in the TUint32 range. */
+	ETagTypeTUint32 = 1,
+	/** Indicates that the iValue field of a TTag structure will contain values from an enumeration. */
+	ETagTypeEnum = 2,
+	/** Indicates that the iValue field of a TTag structure should be interpreted as a bit field. */
+	ETagTypeBitField = 3,
+	/** Indicates that the type of the iValue field of a TTag structure is unknown. */
+	ETagTypeUnknown = 4,
+	/** Indicates that the iValue field of a TTag structure will contain a pointer. */
+	ETagTypePointer = 5
+};
+
+/**
+  Information in the debug functionality block is represented as a concatenation
+  of pairs of TTagHeader structures and arrays of TTag objects.
+  @see TTag
+  @see RSecuritySvrSession::GetDebugFunctionality
+  */
+struct TTagHeader
+{
+	/** Value identifying the contents of this TTagHeader, should be interpreted as an enumerator from TTagHeaderId.
+	  @see TTagHeaderId
+	  */
+	TUint16	iTagHdrId;
+	/** The number of TTag elements in the array associated with this TTagHeader. */
+	TUint16 iNumTags;
+};
+
+/**
+  Enumeration used to identify TTagHeader structures, TTagHeader::iTagHdrId elements take these enumerators as values.
+  @see TTagHeader
+  */
+enum TTagHeaderId
+{
+	ETagHeaderIdCore = 0,            /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TFunctionalityCore. */
+	ETagHeaderIdMemory = 1,          /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TFunctionalityMemory. */
+	/**
+	  Identifies a TTagHeader with associated TTag elements with iTagId values from TFunctionalityRegister.
+	  These values are defined as in the document Symbian Core Dump File Format Appendix C
+	  (see SGL.TS0028.027 - Symbian Core Dump File Format v1.0.doc).
+	  The TTag objects in the associated array have an iSize value corresponding to the size of the register's data in bytes.
+	  */
+	ETagHeaderIdRegistersCore = 2,
+	/**
+	  Identifies a TTagHeader with associated TTag elements with iTagId values corresponding to coprocessor register identifiers.
+	  Coprocessor registers are defined as in the document Symbian Core Dump File Format Appendix C as follows
+	  (see SGL.TS0028.027 - Symbian Core Dump File Format v1.0.doc):
+
+	  For each 32-bit data word defining a co-pro register, the definition of the meaning of the bits follows
+	  the ARM Architecture Reference manual instruction coding
+
+	  Upper Halfword	Lower Halfword
+	  Opcode 2			CRm
+
+	  For example: The Domain Access Control Register is Register 3 of co-processor 15. The encoding is therefore
+	  CRm = 3
+	  Opcode2 = 0
+
+	  Therefore the functionality tag would be:
+	  TagID:  15			// co-processor number
+	  Type: ETagTypeTUint32
+	  Data: 0x00000003		// Opcode2 = 0, CRm = 3
+	  */
+	ETagHeaderIdCoProRegisters = 3,  /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TFunctionalityRegister. */
+	ETagHeaderIdBreakpoints = 4,     /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TFunctionalityBreakpoint. */
+	ETagHeaderIdStepping = 5,        /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TFunctionalityStep. */
+	ETagHeaderIdExecution = 6,       /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TFunctionalityExec. */
+	ETagHeaderIdEvents = 7,          /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TEventType. */
+	ETagHeaderIdApiConstants = 8,    /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TFunctionalityApiConstants.*/
+	ETagHeaderList = 9,              /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TListId. */
+	ETagHeaderIdKillObjects = 10,    /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TFunctionalityKillObject. */
+	ETagHeaderIdSecurity = 11,		 /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TFunctionalitySecurity */
+	ETagHeaderIdBuffers = 12,        /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TBufferType. */
+	ETagHeaderIdStopModeFunctions = 13, /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TFunctionalityStopModeFunctions. */	
+};
+
+/**
+  This structure is not used in the run-mode debug API.
+  @deprecated
+  */
+struct TSubBlock
+{
+	/** Header to identify the TSubBlock. */
+	TTagHeader iHeader;
+	/** Pointer to array of TTag values associated with this TSubBlock. */
+	TTag* iTagArray;
+};
+
+/**
+  These tags define what kinds of core functionality are supported by the run-mode debug subsystem.
+  TTag structures associated with the ETagHeaderIdCore sub-block will have iTagId values from this enumeration.
+  See each enumerator for an explanation of how a TTag with that iTagId should be interpreted.
+  */
+enum TFunctionalityCore
+{
+	ECoreEvents = 0,        /**< Indicates whether events processing is supported. */
+	ECoreStartStop = 1,     /**< Indicates whether suspending and resuming threads is supported. */
+	ECoreMemory = 2,        /**< Indicates whether reading and writing memory is supported. */
+	ECoreRegister = 3,      /**< Indicates whether reading and writing register values is supported. */
+	ECoreBreakpoint = 4,    /**< Indicates whether breakpoints are supported. */
+	ECoreStepping = 5,      /**< Indicates whether stepping is supported. */
+	ECoreLists = 6,         /**< Indicates whether listings are supported. */
+	ECoreLogging = 7,       /**< Indicates whether logging is supported. */
+	ECoreHardware = 8,      /**< Indicates whether hardware support is supported. */
+	ECoreApiConstants = 9,  /**< Indicates whether the information in the ETagHeaderIdApiConstants sub-block is relevant. */
+	ECoreKillObjects = 10,  /**< Indicates whether killing objects (i.e. threads and processes) is supported. */
+	ECoreSecurity = 11,		/**< Indicates whether OEM Debug token support or other security info is supported. */
+	ECoreStopModeFunctions = 12, /**< Indicates whether Stop Mode function calling is supported. */
+	ECoreStopModeBuffers = 13, /**< Indicates whether Stop Mode buffers are supported. */
+	
+	/**
+	  @internalTechnology
+	  A debug agent should find the number of core tags from the DFBlock rather than this enumerator.
+	  */
+	ECoreLast
+};
+
+/**
+  These tags define what kind of memory operations can be performed.
+  TTag structures associated with the ETagHeaderIdMemory sub-block will have iTagId values from this enumeration.
+  See each enumerator for an explanation of how a TTag with that iTagId should be interpreted.
+ */
+enum TFunctionalityMemory
+{
+	EMemoryRead = 0,          /**< Indicates whether reading memory is supported. */
+	EMemoryWrite = 1,         /**< Indicates whether writing memory is supported. */
+	EMemoryAccess64 = 2,      /**< Indicates whether 64 bit memory access is supported. */
+	EMemoryAccess32 = 3,      /**< Indicates whether 32 bit memory access is supported. */
+	EMemoryAccess16 = 4,      /**< Indicates whether 16 bit memory access is supported. */
+	EMemoryAccess8 = 5,       /**< Indicates whether 8 bit memory access is supported. */
+	EMemoryBE8 = 6,           /**< Indicates whether reading memory as 8 bit big-endian values is supported. */
+	EMemoryBE32 = 7,          /**< Indicates whether reading memory as 32 bit big-endian values is supported. */
+	EMemoryLE8 = 8,           /**< Indicates whether reading memory as 8 bit little-endian values is supported. */
+	EMemoryMaxBlockSize = 9,  /**< Corresponds to the maximum size of a block of memory which can be requested. */
+	/**
+	  @internalTechnology
+	  A debug agent should find the number of memory tags from the DFBlock rather than this enumerator.
+	  */
+	EMemoryLast
+};
+
+/**
+  These tags define which objects can be killed by the device driver.
+  TTag structures associated with the ETagHeaderIdKillObjects sub-block will have iTagId values from this enumeration.
+  See each enumerator for an explanation of how a TTag with that iTagId should be interpreted.
+ */
+enum TFunctionalityKillObject
+{
+	EFunctionalityKillThread = 0,          /**< Indicates whether killing threads is supported. */
+	EFunctionalityKillProcess = 1,         /**< Indicates whether killing processes is supported. */
+	/**
+	  @internalTechnology
+	  A debug agent should find the number of kill object tags from the DFBlock rather than this enumerator.
+	  */
+	EFunctionalityKillObjectLast
+};
+
+/**
+  A TTag with an id from the TFunctionalityRegister enum will have a value from this enumeration.
+  The values define how a register can be accessed, if at all.
+ */
+enum TFunctionalityAccess
+{
+	EAccessNone = 0,       /**< Indicates that a register cannot be accessed. */
+	EAccessReadOnly = 1,   /**< Indicates that a register can be read, but not written to. */
+	EAccessWriteOnly = 2,  /**< Indicates that a register can be written to, but not read. */
+	EAccessReadWrite = 3,  /**< Indicates that a register can be both read and written to. */
+	EAccessUnknown = 4,    /**< Indicates that it is unspecified whether reading or writing to a register is possible. */
+};
+
+/**
+  These enumerators act as core register identifiers.
+  TTag structures associated with the ETagHeaderIdRegistersCore sub-block will have iTagId values from this enumeration.
+  The numeric value of each enumerator identifies the register according to the definitions in the Symbian Core Dump File Format Appendix B
+  (see SGL.TS0028.027 - Symbian Core Dump File Format v1.0.doc).
+  */
+enum TFunctionalityRegister
+{
+	ERegisterR0 = 0x00000000,      /**< Identifier for user mode register R0. */
+	ERegisterR1 = 0x00000100,      /**< Identifier for user mode register R1. */
+	ERegisterR2 = 0x00000200,      /**< Identifier for user mode register R2. */
+	ERegisterR3 = 0x00000300,      /**< Identifier for user mode register R3. */
+	ERegisterR4 = 0x00000400,      /**< Identifier for user mode register R4. */
+	ERegisterR5 = 0x00000500,      /**< Identifier for user mode register R5. */
+	ERegisterR6 = 0x00000600,      /**< Identifier for user mode register R6. */
+	ERegisterR7 = 0x00000700,      /**< Identifier for user mode register R7. */
+	ERegisterR8 = 0x00000800,      /**< Identifier for user mode register R8. */
+	ERegisterR9 = 0x00000900,      /**< Identifier for user mode register R9. */
+	ERegisterR10 = 0x00000a00,     /**< Identifier for user mode register R10. */
+	ERegisterR11 = 0x00000b00,     /**< Identifier for user mode register R11. */
+	ERegisterR12 = 0x00000c00,     /**< Identifier for user mode register R12. */
+	ERegisterR13 = 0x00000d00,     /**< Identifier for user mode register R13. */
+	ERegisterR14 = 0x00000e00,     /**< Identifier for user mode register R14. */
+	ERegisterR15 = 0x00000f00,     /**< Identifier for user mode register R15. */
+	ERegisterCpsr = 0x00001000,    /**< Identifier for CPSR. */
+	ERegisterR13Svc = 0x00001100,  /**< Identifier for R13 supervisor mode banked register. */
+	ERegisterR14Svc = 0x00001200,  /**< Identifier for R14 supervisor mode banked register. */
+	ERegisterSpsrSvc = 0x00001300, /**< Identifier for SPSR supervisor mode banked register. */
+	ERegisterR13Abt = 0x00001400,  /**< Identifier for R13 Abort mode banked register. */
+	ERegisterR14Abt = 0x00001500,  /**< Identifier for R14 Abort mode banked register. */
+	ERegisterSpsrAbt = 0x00001600, /**< Identifier for SPSR Abort mode banked register. */
+	ERegisterR13Und = 0x00001700,  /**< Identifier for R13 Undefined mode banked register. */
+	ERegisterR14Und = 0x00001800,  /**< Identifier for R14 Undefined mode banked register. */
+	ERegisterSpsrUnd = 0x00001900, /**< Identifier for SPSR Undefined mode banked register. */
+	ERegisterR13Irq = 0x00001a00,  /**< Identifier for R13 Interrupt mode banked register. */
+	ERegisterR14Irq = 0x00001b00,  /**< Identifier for R14 Interrupt mode banked register. */
+	ERegisterSpsrIrq = 0x00001c00, /**< Identifier for SPSR Interrupt mode banked register. */
+	ERegisterR8Fiq = 0x00001d00,   /**< Identifier for R8 Fast Interrupt mode banked register. */
+	ERegisterR9Fiq = 0x00001e00,   /**< Identifier for R9 Fast Interrupt mode banked register. */
+	ERegisterR10Fiq = 0x00001f00,  /**< Identifier for R10 Fast Interrupt mode banked register. */
+	ERegisterR11Fiq = 0x00002000,  /**< Identifier for R11 Fast Interrupt mode banked register. */
+	ERegisterR12Fiq = 0x00002100,  /**< Identifier for R12 Fast Interrupt mode banked register. */
+	ERegisterR13Fiq = 0x00002200,  /**< Identifier for R13 Fast Interrupt mode banked register. */
+	ERegisterR14Fiq = 0x00002300,  /**< Identifier for R14 Fast Interrupt mode banked register. */
+	ERegisterSpsrFiq = 0x00002400, /**< Identifier for SPSR Fast Interrupt mode banked register. */
+	/**
+	  @internalTechnology
+	  A debug agent should find the number of core registers from the DFBlock rather than this enumerator.
+	  */
+	ERegisterLast = 37
+};
+
+
+/**
+  These tags define the kind of breakpoints that are supported.
+  TTag structures associated with the ETagHeaderIdBreakpoints sub-block will have iTagId values from this enumeration.
+  See each enumerator for an explanation of how a TTag with that iTagId should be interpreted.
+ */
+enum TFunctionalityBreakpoint
+{
+	EBreakpointThread = 0,         /**< Indicates whether thread specific breakpoints are supported. */
+	EBreakpointProcess = 1,        /**< Indicates whether process specific breakpoints are supported. */
+	EBreakpointSystem = 2,         /**< Indicates whether system wide breakpoints are supported. */
+	EBreakpointArm = 3,            /**< Indicates whether ARM mode breakpoints are supported. */
+	EBreakpointThumb = 4,          /**< Indicates whether Thumb mode breakpoints are supported. */
+	EBreakpointT2EE = 5,           /**< Indicates whether Thumb2 mode breakpoints are supported. */
+	EBreakpointArmInst = 6,        /**< Reserved for future use. */
+	EBreakpointThumbInst = 7,      /**< Reserved for future use. */
+	EBreakpointT2EEInst = 8,       /**< Reserved for future use. */
+	EBreakpointSetArmInst = 9,     /**< Reserved for future use. */
+	EBreakpointSetThumbInst = 10,  /**< Reserved for future use. */
+	EBreakpointSetT2EEInst = 11,   /**< Reserved for future use. */
+	/**
+	  @internalTechnology
+	  A debug agent should find the number of breakpoint tags from the DFBlock rather than this enumerator.
+	  */
+	EBreakpointLast
+};
+
+/**
+  These enumerators provide information about the stepping capabilities of the debug sub-system.
+  TTag structures associated with the ETagHeaderIdStepping sub-block will have iTagId values from this enumeration.
+  See each enumerator for an explanation of how a TTag with that iTagId should be interpreted.
+ */
+enum TFunctionalityStep
+{
+	EStep = 0, /**< Indicates whether instruction stepping is supported. */
+	/**
+	  @internalTechnology
+	  A debug agent should find the number of stepping tags from the DFBlock rather than this enumerator.
+	  */
+	EStepLast
+};
+
+/**
+  These enumerators provide information about the execution control capabilities of the debug sub-system.
+  TTag structures associated with the ETagHeaderIdExecution sub-block will have iTagId values from this enumeration.
+  See each enumerator for an explanation of how a TTag with that iTagId should be interpreted.
+ */
+enum TFunctionalityExec
+{
+	EExecThreadSuspendResume = 0,  /**< Indicates whether suspending and resuming threads is supported. */
+	EExecProcessSuspendResume = 1, /**< Indicates whether suspending and resuming processes is supported. */
+	EExecSystemSuspendResume = 2,  /**< Indicates whether suspending and resuming the entire system is supported. */
+	/**
+	  @internalTechnology
+	  A debug agent should find the number of execution control tags from the DFBlock rather than this enumerator.
+	  */
+	EExecLast
+};
+
+/**
+  This enumeration defines the event types supported by the debug sub-system.
+  TTag structures associated with the ETagHeaderIdEvents sub-block will have
+  iTagId values from this enumeration, and iValue values from the TKernelEventAction enumeration.
+
+  These enumerators are also used by the RSecuritySvrSession API to identify events.
+  @see RSecuritySvrSession
+  @see TKernelEventAction
+ */
+enum TEventType
+{
+	EEventsBreakPoint = 0,    /**< Identifies a breakpoint event. */
+	EEventsSwExc = 1,         /**< Identifies a software exception event. */
+	EEventsHwExc = 2,         /**< Identifies a hardware exception event. */
+	EEventsKillThread = 3,    /**< Identifies a kill thread event. */
+	EEventsAddLibrary = 4,    /**< Identifies an add library event. */
+	EEventsRemoveLibrary = 5, /**< Identifies a remove library event. */
+	/**
+	 If an event is generated and there is only a single space remaining in the events queue then
+	 an event of type EEventsBufferFull will be stored in the queue and the generated event will
+	 be discarded. If further events occur while the buffer is full the events will be discarded.
+	 As such an event of type EEventsBufferFull being returned signifies that one or more events
+	 were discarded. An event of this type has no valid data associated with it.
+	 */
+	EEventsBufferFull = 6,
+	EEventsUnknown = 7,       /**< Identifies an event of unknown type. */
+	EEventsUserTrace = 8,     /**< Identifies a user trace. */
+	EEventsProcessBreakPoint = 9, /**< Identifies a process breakpoint event. */
+	EEventsStartThread = 10, /**< Identifies a start thread event. */
+	EEventsUserTracesLost = 11, /**< Identifies user traces being lost. */
+	EEventsAddProcess = 12, /**< Identifies an AddProcess event */
+	EEventsRemoveProcess = 13, /**< Identifies a RemoveProcess event */
+	/**
+	  @internalTechnology
+	  A debug agent should find the number of event types from the DFBlock rather than this enumerator.
+	  */
+	EEventsLast
+};
+
+/**
+  These enumerators provide information about constants which are used in the RSecuritySvrSession API.
+  TTag structures associated with the ETagHeaderIdApiConstants sub-block will have iTagId values from this enumeration.
+  See each enumerator for an explanation of how a TTag with that iTagId should be interpreted.
+ */
+enum TFunctionalityApiConstants
+	{
+	/**
+	  Corresponds to the size of a buffer required to store a TEventInfo.
+	  @see TEventInfo
+	  */
+	EApiConstantsTEventInfoSize = 0,
+	/**
+	  @internalTechnology
+	  A debug agent should find the number of API constants tags from the DFBlock rather than this enumerator.
+	  */
+	EApiConstantsLast,
+	};
+
+/**
+  The set of possible actions which could be taken when a kernel event occurs.
+  Not all actions are possible for all events. The debug functionality sub-block with header id ETagHeaderIdEvents
+  indicates which values are permitted for each event. The value given for that event should be
+  considered as the most intrusive action the debugger may set: with the definition that EActionSuspend is more
+  intrusive than EActionContinue, which is more intrusive than EActionIgnore.
+  @see RSecuritySvrSession
+  */
+enum TKernelEventAction
+{
+	/** If an event action is set to this value then events of that type will be
+	  ignored, and not reported to the debugger. */
+	EActionIgnore = 0,
+	/** If an event action is set to this value then events of that type will be
+	  reported to the debugger and the thread which generated the event will be
+	  allowed to continue executing. */
+	EActionContinue = 1,
+	/** If an event action is set to this value then events of that type will be
+	  reported to the debugger and the thread which generated the event will be
+	  suspended. */
+	EActionSuspend = 2,
+	/**
+	  @internalTechnology
+	  Count of event actions.
+	  */
+	EActionLast
+};
+
+/**
+  These enumerators provide information about the ability of the debug subsystem to support OEM Debug tokens.
+  TTag structures associated with the ETagHeaderIdSecurity sub-block will have iTagId values from this enumeration.
+  See each enumerator for an explanation of how a TTag with that iTagId should be interpreted.
+ */
+enum TFunctionalitySecurity
+{
+	ESecurityOEMDebugToken = 0,  /**< Indicates whether the DSS supports the use of OEM Debug Tokens. */
+
+	/**
+	  @internalTechnology
+	  A debug agent should find the number of tags from the DFBlock rather than this enumerator.
+	  */
+	ESecurityLast
+};
+
+/**
+  Used for storing the contents of a 32 bit register
+  */
+typedef TUint32 TRegisterValue32;
+
+
+/**
+ * Processor mode
+ */
+enum TArmProcessorModes
+{
+	EUserMode=0x10,    	//!< EUserMode
+    EFiqMode=0x11,  	//!< EFiqMode
+    EIrqMode=0x12,  	//!< EIrqMode
+    ESvcMode=0x13,  	//!< ESvcMode
+    EAbortMode=0x17,	//!< EAbortMode
+    EUndefMode=0x1b,	//!< EUndefMode
+    EMaskMode=0x1f  	//!< EMaskMode
+};
+
+
+
+/**
+  Structure containing information about the state of the registers when a
+  hardware exception occurred
+  */
+class TRmdArmExcInfo
+	{
+public:
+	/** Enumeration detailing the types of exception which may occur. */
+	enum TExceptionType
+		{
+		/** Enumerator signifying that a prefetch abort error has occurred. */
+		EPrefetchAbort = 0,
+		/** Enumerator signifying that a data abort error has occurred. */
+		EDataAbort = 1,
+		/** Enumerator signifying that an undefined instruction error has occurred. */
+		EUndef =2
+		};
+
+	/** Value of CPSR. */
+	TRegisterValue32 iCpsr;
+	/** Type of exception which has occurred. */
+	TExceptionType iExcCode;
+	/** Value of R13 supervisor mode banked register. */
+	TRegisterValue32 iR13Svc;
+	/** Value of user mode register R4. */
+	TRegisterValue32 iR4;
+	/** Value of user mode register R5. */
+	TRegisterValue32 iR5;
+	/** Value of user mode register R6. */
+	TRegisterValue32 iR6;
+	/** Value of user mode register R7. */
+	TRegisterValue32 iR7;
+	/** Value of user mode register R8. */
+	TRegisterValue32 iR8;
+	/** Value of user mode register R9. */
+	TRegisterValue32 iR9;
+	/** Value of user mode register R10. */
+	TRegisterValue32 iR10;
+	/** Value of user mode register R11. */
+	TRegisterValue32 iR11;
+	/** Value of R14 supervisor mode banked register. */
+	TRegisterValue32 iR14Svc;
+	/** Address which caused exception (System Control Coprocessor Fault Address Register) */
+	TRegisterValue32 iFaultAddress;
+	/** Value of System Control Coprocessor Fault Status Register. */
+	TRegisterValue32 iFaultStatus;
+	/** Value of SPSR supervisor mode banked register. */
+	TRegisterValue32 iSpsrSvc;
+	/** Value of user mode register R13. */
+	TRegisterValue32 iR13;
+	/** Value of user mode register R14. */
+	TRegisterValue32 iR14;
+	/** Value of user mode register R0. */
+	TRegisterValue32 iR0;
+	/** Value of user mode register R1. */
+	TRegisterValue32 iR1;
+	/** Value of user mode register R2. */
+	TRegisterValue32 iR2;
+	/** Value of user mode register R3. */
+	TRegisterValue32 iR3;
+	/** Value of user mode register R12. */
+	TRegisterValue32 iR12;
+	/** Value of user mode register R15, points to instruction which caused exception. */
+	TRegisterValue32 iR15;
+	};
+
+/**
+  The maximum size, in bytes, of the panic category string returned as part of a
+  TEventInfo object.
+
+  @see TEventInfo
+  @see TThreadKillInfo
+  */
+const TInt KPanicCategoryMaxName = KMaxName;
+
+/**
+  Event specific information returned as part of a TEventInfo object when
+  an agent set breakpoint is hit.
+  */
+class TThreadBreakPointInfo
+	{
+public:
+	/** Identifies the type of exception. */
+	TExcType iExceptionNumber;
+	/** Structure containing information about the ARM register values. */
+	TRmdArmExcInfo iRmdArmExcInfo;
+	};
+
+/**
+  Event specific information returned as part of a TEventInfo object when
+  a software exception occurs.
+  */
+class TThreadSwExceptionInfo
+	{
+public:
+	/** The value of the program counter. */
+	TUint32 iCurrentPC;
+	/** Identifies the type of exception. */
+	TExcType iExceptionNumber;
+	};
+
+/**
+  Event specific information returned as part of a TEventInfo object when
+  a hardware exception occurs.
+  */
+class TThreadHwExceptionInfo
+	{
+public:
+	/** Identifies the type of exception. */
+	TExcType iExceptionNumber;
+	/** Structure containing information about the ARM register values. */
+	TRmdArmExcInfo iRmdArmExcInfo;
+	};
+
+/**
+  Event specific information returned as part of a TEventInfo object when
+  a thread kill event occurs.
+  */
+class TThreadKillInfo
+	{
+public:
+	/** The value of the program counter. */
+	TUint32 iCurrentPC;
+	/** Specifies the reason for the kill thread event, this value is specific to the killed thread and does not correspond to a standard Symbian enumeration. */
+	TInt iExitReason;
+	/** Specifies the type of the thread kill event, values correspond to elements of TExitType. */
+	TUint8 iExitType;
+	/** The panic category of the killed thread. */
+	TUint8 iPanicCategory[KPanicCategoryMaxName];
+	/** Contains the length in bytes of the initialised data in iPanicCategory. */
+	TInt iPanicCategoryLength;
+	};
+
+/**
+  Event specific information returned as part of a TEventInfo object when
+  a library load event occurs.
+  */
+class TLibraryLoadedInfo
+	{
+public:
+	/** The name of the file that the library was loaded from. */
+	TUint8 iFileName[KMaxName];
+	/** Contains the length in bytes of the initialised data in iFileName. */
+	TInt iFileNameLength;
+	/** The code base address (.text). */
+	TUint32 iCodeAddress;
+	/** The base address of the initialised data section (.data). */
+	TUint32 iDataAddress;
+	};
+
+/**
+  Event specific information returned as part of a TEventInfo object when
+  a thread is started
+  */
+class TStartThreadInfo
+	{
+public:
+	/** The name of the file that the process owning the thread was created from. */
+	TUint8 iFileName[KMaxName];
+	/** Contains the length in bytes of the initialised data in iFileName. */
+	TInt iFileNameLength;
+	};
+
+/**
+  Event specific information returned as part of a TEventInfo object when
+  a process is added. Note that the Process may not be fully constructed,
+  e.g. no threads.
+  */
+class TAddProcessInfo
+	{
+public:
+	/** The name of the file that the process was created from. */
+	TUint8 iFileName[KMaxName];
+	/** Contains the length in bytes of the initialised data in iFileName. */
+	TInt iFileNameLength;
+	/** The UID3 of this process */
+	TUint32 iUid3;  
+	/** Contains the CreatorThread ID if available: May be 0 */
+	TUint64 iCreatorThreadId;  
+	};
+
+/**
+  Event specific information returned as part of a TEventInfo object when
+  a process is removed. Note that the Process may not be fully destroyed,
+  so its resources should only be accessed if you already have a handle to it.
+  */
+class TRemoveProcessInfo
+	{
+public:
+	/** The name of the file that the process was created from. */
+	TUint8 iFileName[KMaxName];
+	/** Contains the length in bytes of the initialised data in iFileName. */
+	TInt iFileNameLength;
+	TUint32 iSpare1;	// Unused
+	};
+
+/**
+  Event specific information returned as part of a TEventInfo object when
+  a library unload event occurs.
+  */
+class TLibraryUnloadedInfo
+	{
+public:
+	/** The name of the file that the library was loaded from. */
+	TUint8 iFileName[KMaxName];
+	/** Contains the length in bytes of the initialised data in iFileName. */
+	TInt iFileNameLength;
+	};
+
+/**
+ * Enum to represent the context of a user trace message
+ */ 
+enum TUserTraceMessageContext 
+{
+	ESingleMessage = 0x1,   /** Indicates this message is the only one corresponding to a given user trace */ 
+	EMultiStart = 0x2, /** Indicates this message is the start of a user trace which consists of multiple messages */
+	EMultiMid = 0x3, /** Indicates this message is one in a series of user trace messages */
+	EMultiEnd = 0x4, /** Indicates this message is the last in a series of user trace messages */
+	/**
+	  @internalTechnology
+	  A debug agent should find the number of core tags from the DFBlock rather than this enumerator.
+	  */
+	ELast = 0x5	
+};
+	
+/**
+ *   Event specific information returned as part of a TEventInfo object 
+ *   when a user trace event occurs.
+ */
+class TUserTraceInfo
+	{
+public:
+	/** The user trace text */
+	TUint8 iUserTraceText[TUserTraceSize];
+	
+	/** User trace text length */
+	TInt iUserTraceLength;
+	
+	/** The context of the message */
+	TUserTraceMessageContext iMessageStatus;
+	};
+	
+	
+/**
+  Structure used to store information about an event. An object of this type
+  is passed as an argument to the RSecuritySvrSession::GetEvent function,
+  and is filled in by the debug driver, and returned to the agent, when a
+  relevant event occurs.
+
+  The debug functionality block contains the size in bytes of the data that
+  the driver will return when a GetEvent call is issued. A debug agent should
+  ensure that this value equals the size of this TEventInfo object to ensure
+  that a compatible debug driver is being used. The value is stored as
+  EApiConstantsTEventInfoSize in the TFunctionalityApiConstants block.
+
+  @see RSecuritySvrSession::GetDebugFunctionality
+  @see RSecuritySvrSession::GetEvent
+  */
+class TEventInfo
+	{
+public:
+
+	/** Constructor sets all elements to default values. */
+	inline TEventInfo() { Reset(); };
+
+	/** Resets all values to default values. */
+	inline void Reset()
+		{
+		iProcessId = 0;
+		iProcessIdValid = EFalse;
+		iThreadId = 0;
+		iThreadIdValid = EFalse;
+		iEventType = (TEventType)NULL;
+		iActionTaken = EActionIgnore;
+		};
+
+public:
+
+	/** The process ID of the process which the event occurred in. */
+	TUint64 				iProcessId;
+	/** The thread ID of the thread which the event occurred in. */
+	TUint64 				iThreadId;
+	/** Has value ETrue if iProcessId is valid, EFalse otherwise. */
+	TUint8					iProcessIdValid;
+	/** Has value ETrue if iThreadId is valid, EFalse otherwise. */
+	TUint8					iThreadIdValid;
+	/** What action was taken by the debug system when it received the event. A TKernelEventAction */
+	TUint8					iActionTaken;
+	TUint8					iSpare;
+
+	/** Indicates the type of the event. This type should be used to determine
+	    the type of the information stored in the union which is part of this class. */
+	TEventType				iEventType;
+	union
+		{
+		/** Information which is specific to the break point event. */
+		TThreadBreakPointInfo iThreadBreakPointInfo;
+		/** Information which is specific to the software exception event. */
+		TThreadSwExceptionInfo iThreadSwExceptionInfo;
+		/** Information which is specific to the hardware exception event. */
+		TThreadHwExceptionInfo iThreadHwExceptionInfo;
+		/** Information which is specific to the thread kill event. */
+		TThreadKillInfo iThreadKillInfo;
+		/** Information which is specific to the library loaded event. */
+		TLibraryLoadedInfo iLibraryLoadedInfo;
+		/** Information which is specific to the library unloaded event. */
+		TLibraryUnloadedInfo iLibraryUnloadedInfo;
+		/** Information which is specific to the user trace event. */
+		TUserTraceInfo iUserTraceInfo;
+		/** Information which is specific to the start thread event. */
+		TStartThreadInfo iStartThreadInfo;
+		/** Information which is specific to the Add Process event. */
+		TAddProcessInfo iAddProcessInfo;
+		/** Information which is specific to the Remove Process event. */
+		TRemoveProcessInfo iRemoveProcessInfo;
+		};
+	};
+
+/**
+  @internalComponent
+  */
+class TProcessInfo
+	{
+	public:
+
+		inline TProcessInfo() { Reset(); }
+
+		inline TProcessInfo(TUint32 aId, TUint32 aCodeAddress, TUint32 aCodeSize, TUint32 aDataAddress)
+				: iId(aId),
+				  iCodeAddress(aCodeAddress),
+				  iCodeSize(aCodeSize),
+				  iDataAddress(aDataAddress) { }
+
+		inline void Reset()
+			{
+			iId = 0;
+			iCodeAddress = 0;
+			iCodeSize = 0;
+			iDataAddress = 0;
+			}
+
+	public:
+
+		TUint32 iId;
+		TUint32 iCodeAddress;
+		TUint32 iCodeSize;
+		TUint32 iDataAddress;
+	};
+
+/* Other functionality may be defined here later */
+
+/**
+Represents a register id value, in the terms of the Symbian ELF format:
+ - bits 0-7 define the class
+ - bits 8-15 define the rd_id
+ - bits 16-31 define the rd_sub_id
+
+Both the core registers (TFunctionalityRegister type) and the coprocessor registers
+follow this identifier scheme.
+*/
+typedef TUint32 TRegisterInfo;
+
+/**
+Enum representing the status flags which could be returned from a register
+access call.
+*/
+enum TRegisterFlag
+	{
+	/**
+	Default value, a register access call will never return this value
+	*/
+	ENotSet = 0,
+	/**
+	Would be returned if the register is supported by the debug driver but the kernel cannot access the register
+	*/
+	EInValid = 1,
+	/**
+	Would be returned if the register could be accessed correctly
+	*/
+	EValid = 2,
+	/**
+	Would be returned if the register is not supported by the debug driver
+	*/
+	ENotSupported = 3,
+	/**
+	Would be returned if a non-4 byte register value was requested
+	*/
+	EBadSize = 4
+	};
+
+/**
+Enum representing the different ARM CPU instruction set architectures.
+*/
+enum TArchitectureMode
+	{
+	/** Represents the ARM CPU architecture. */
+	EArmMode = 1,
+	/** Represents the Thumb CPU architecture. */
+	EThumbMode = 2,
+	/**
+	  Represents the Thumb2 CPU architecture.
+	  @prototype
+	  */
+	EThumb2EEMode = 3
+	};
+
+/**
+  Used as an identifier for breakpoints set by the RSecuritySvrSession::SetBreak function.
+  @see RSecuritySvrSession
+  */
+typedef TInt32 TBreakId;
+
+/**
+  Specifies the type of a code segment.
+  @see TCodeSegListEntry
+  */
+enum TCodeSegType
+	{
+	EUnknownCodeSegType = 0, /**< Signifies an unknown code segment type. */
+	EExeCodeSegType = 1,     /**< Signifies a code segment belonging to an executable. */
+	EDllCodeSegType = 2      /**< Signifies a code segment belonging to a library. */
+	};
+
+/**
+Structure used for extracting data from a descriptor returned by a call to
+RSecuritySvrSession::GetList() when GetList() is called with TListId::ECodeSegs
+as the first argument.
+
+@see RSecuritySvrSession::GetList()
+
+@code
+//buffer is a TDesC8 containing 4-byte aligned TCodeSegListEntry objects
+//create a pointer to the start of the data
+TUint8* ptr = (TUint8*)buffer.Ptr();
+//create a pointer to the end of the data
+const TUint8* ptrEnd = ptr + buffer.Length();
+while(ptr < ptrEnd)
+	{
+	//cast the pointer to be a TCodeSegListEntry object
+	TCodeSegListEntry& entry = *(TCodeSegListEntry*)ptr;
+	//use the TCodeSegListEntry pointer, i.e.
+	TUint16 nameLength = entry.iNameLength;
+	TPtr name(&(entry.iName[0]), nameLength, nameLength);
+	// move ptr on to point to the next TCodeSegListEntry object
+	ptr += Align4(entry.GetSize());
+	}
+@endcode
+*/
+class TCodeSegListEntry
+	{
+public:
+	TInt GetSize() const;
+public:
+	/**
+	  Address of the start of the code segment.
+	  */
+	TUint32 iCodeBase;
+	/**
+	  Size of the code segment.
+	  */
+	TUint32 iCodeSize;
+	/**
+	  Size of the const data segment
+	  */
+	TUint32 iConstDataSize;
+	/**
+	  Address of the initialised data
+	  */
+	TUint32 iInitialisedDataBase;
+	/**
+	  Size of the initialised data
+	  */
+	TUint32 iInitialisedDataSize;
+	/**
+	  Size of the uninitialised data
+	  */
+	TUint32 iUninitialisedDataSize;
+	/**
+	  Boolean indicating whether the code segment is execute in place
+	  */
+	TBool iIsXip;
+	/**
+	  Indicates whether the code segment is from an executable or a dll, or neither
+	  */
+	TCodeSegType iCodeSegType;
+	/** Uid3 of this segment. */
+	TUint32 iUid3;
+	/** Currently unused element. May be used in future to aid maintaining compatibility. */
+	TUint32 iSpare2;
+	/**
+	  Length of the code segment's name
+	  */
+	TUint16 iNameLength;
+	/**
+	  First two bytes of the code segment's name, the name should be considered to
+	  extend past the end of the TCodeSegListEntry structure to a length
+	  corresponding to iNameLength
+	  */
+	TUint16 iName[1];
+	};
+
+/**
+Returns the size of the TCodeSegListEntry, including the file name length
+
+@return the size, in bytes, of the TCodeSegListEntry and the code segment's
+file name
+*/
+inline TInt TCodeSegListEntry::GetSize() const
+	{
+	return sizeof(TCodeSegListEntry) - sizeof(iName) + (2 * iNameLength);
+	}
+
+/**
+Structure used for extracting data from a descriptor returned by a call to
+RSecuritySvrSession::GetList() when GetList() is called with TListId::EXipLibraries
+as the first argument.
+
+@see RSecuritySvrSession::GetList()
+
+@code
+//buffer is a TDesC8 containing 4-byte aligned TXipLibraryListEntry objects
+//create a pointer to the start of the data
+TUint8* ptr = (TUint8*)buffer.Ptr();
+//create a pointer to the end of the data
+const TUint8* ptrEnd = ptr + buffer.Length();
+while(ptr < ptrEnd)
+	{
+	//cast the pointer to be a TXipLibraryListEntry object
+	TXipLibraryListEntry& entry = *(TXipLibraryListEntry*)ptr;
+	//use the TXipLibraryListEntry pointer, i.e.
+	TUint16 nameLength = entry.iNameLength;
+	TPtr name(&(entry.iName[0]), nameLength, nameLength);
+	// move ptr on to point to the next TXipLibraryListEntry object
+	ptr += Align4(entry.GetSize());
+	}
+@endcode
+*/
+class TXipLibraryListEntry
+	{
+public:
+	TInt GetSize() const;
+public:
+	/**
+	  Address of the start of the library's code segment.
+	  */
+	TUint32 iCodeBase;
+	/**
+	  Size of the code segment.
+	  */
+	TUint32 iCodeSize;
+	/**
+	  Size of the const data segment
+	  */
+	TUint32 iConstDataSize;
+	/**
+	  Address of the initialised data
+	  */
+	TUint32 iInitialisedDataBase;
+	/**
+	  Size of the initialised data
+	  */
+	TUint32 iInitialisedDataSize;
+	/**
+	  Size of the uninitialised data
+	  */
+	TUint32 iUninitialisedDataSize;
+	/** Currently unused element. May be used in future to aid maintaining compatibility. */
+	TUint32 iSpare1;
+	/** Currently unused element. May be used in future to aid maintaining compatibility. */
+	TUint32 iSpare2;
+	/**
+	  Length of the library's name
+	  */
+	TUint16 iNameLength;
+	/**
+	  First two bytes of the code segment's name, the name should be considered to
+	  extend past the end of the TXipLibraryListEntry structure to a length
+	  corresponding to iNameLength
+	  */
+	TUint16 iName[1];
+	};
+
+/**
+Returns the size of the TXipLibraryListEntry, including the file name length
+
+@return the size, in bytes, of the TXipLibraryListEntry and the library's
+file name
+*/
+inline TInt TXipLibraryListEntry::GetSize() const
+	{
+	return sizeof(TXipLibraryListEntry) - sizeof(iName) + (2 * iNameLength);
+	}
+
+/**
+Structure used for extracting data from a descriptor returned by a call to
+RSecuritySvrSession::GetList() when GetList() is called with TListId::EExecutables
+as the first argument.
+
+@see RSecuritySvrSession::GetList()
+
+@code
+//buffer is a TDesC8 containing 4-byte aligned TExecutablesListEntry objects
+//create a pointer to the start of the data
+TUint8* ptr = (TUint8*)buffer.Ptr();
+//create a pointer to the end of the data
+const TUint8* ptrEnd = ptr + buffer.Length();
+while(ptr < ptrEnd)
+	{
+	//cast the pointer to be a TExecutablesListEntry object
+	TExecutablesListEntry& entry = *(TExecutablesListEntry*)ptr;
+	//use the TExecutablesListEntry pointer, i.e.
+	TUint16 nameLength = entry.iNameLength;
+	TPtr name(&(entry.iName[0]), nameLength, nameLength);
+	// move ptr on to point to the next TExecutablesListEntry object
+	ptr += Align4(entry.GetSize());
+	}
+@endcode
+*/
+class TExecutablesListEntry
+	{
+public:
+	TInt GetSize() const;
+public:
+	/**
+	  Indicates whether an agent has registered to actively debug the executable,
+	  a non-zero value indicates that an agent has attached.
+	  */
+	TUint8 iIsActivelyDebugged;
+	/**
+	  Indicates whether any agents have registered to passively debug the executable,
+	  a non-zero value indicates that at least one agent is attached passively
+	  */
+	TUint8 iIsPassivelyDebugged;
+	/** Currently unused element. May be used in future to aid maintaining compatibility. */
+	TUint32 iSpare1;
+	/** Currently unused element. May be used in future to aid maintaining compatibility. */
+	TUint32 iSpare2;
+	/**
+	  Length of the executable's name
+	  */
+	TUint16 iNameLength;
+	/**
+	  First two bytes of the executable's name, the name should be considered to
+	  extend past the end of the TExecutablesListEntry structure to a length
+	  corresponding to iNameLength
+	  */
+	TUint16 iName[1];
+	};
+
+/**
+Returns the size of the TExecutablesListEntry, including the file name length
+
+@return the size, in bytes, of the TExecutablesListEntry and the executable's
+file name
+*/
+inline TInt TExecutablesListEntry::GetSize() const
+	{
+	return sizeof(TExecutablesListEntry) - sizeof(iName) + (2*iNameLength);
+	}
+
+/**
+Structure used for extracting data from a descriptor returned by a call to
+RSecuritySvrSession::GetList() when GetList() is called with TListId::EProcesses
+as the first argument.
+
+@see RSecuritySvrSession::GetList()
+
+@code
+//buffer is a TDesC8 containing 4-byte aligned TProcessListEntry objects
+//create a pointer to the start of the data
+TUint8* ptr = (TUint8*)buffer.Ptr();
+//create a pointer to the end of the data
+const TUint8* ptrEnd = ptr + buffer.Length();
+while(ptr < ptrEnd)
+	{
+	//cast the pointer to be a TProcessListEntry object
+	TProcessListEntry& entry = *(TProcessListEntry*)ptr;
+	//use the TProcessListEntry pointer, i.e.
+	TUint16 fileNameLength = entry.iFileNameLength;
+	TPtr name(&(entry.iNames[0]), fileNameLength, fileNameLength);
+	// move ptr on to point to the next TProcessListEntry object
+	ptr += Align4(entry.GetSize());
+	}
+@endcode
+*/
+class TProcessListEntry
+	{
+	public:
+		TInt GetSize() const;
+
+	public:
+		/** Process ID */
+		TUint64 iProcessId;
+
+		/** The Uid3 of the process */
+		TUint32 iUid3;
+
+		/** 
+		 * Process Attributes
+		 * @see DProcess::TProcessAttributes
+		 */
+		TInt iAttributes;
+
+		/**
+		 * Length of fully qualified file name of the process in bytes. Note that this
+		 * entry may be 0 if the process is in the process of shutting down.
+		 */
+		TUint16 iFileNameLength;
+
+		/**
+		 * Length of current dynamic name of the process in bytes
+		 */
+		TUint16 iDynamicNameLength;
+
+		/**
+		 * First two bytes of the process' file name, the name should be considered to
+		 * extend past the end of the TProcessListEntry structure to a length
+		 * corresponding to iFileNameLength. Directly after the data corresponding to the
+		 * file name, the dynamic name is stored with a length of iDynamicNameLength characters.
+		 * Note that these names are not null terminated and are concatenated directly after each other.
+		 * 
+		 * @code
+		 * TProcessListEntry& entry; // entry is a reference to a TProcessListEntry
+		 *
+		 * //get the file name..
+		 * TPtr fileName(&(entry.iNames[0]), iFileNameLength, iFileNameLength);
+		 *
+		 * //get the dynamic name length..
+		 * TPtr dynamicName(&(entry.iNames[0]) + iFileNameLength, iDynamicNameLength, iDynamicNameLength);
+		 * @endcode
+		 */
+		TUint16 iNames[1];
+	};
+
+/**
+Returns the size of the TProcessListEntry, including the file name length and the
+dynamic name length
+
+@return the size, in bytes, of the TProcessListEntry and the executable's
+file name file name and dynamic name
+*/
+inline TInt TProcessListEntry::GetSize() const
+	{
+	return sizeof(TProcessListEntry) - sizeof(iNames) + (2 * (iFileNameLength + iDynamicNameLength));
+	}
+
+/**
+Structure used for extracting data from a descriptor returned by a call to
+RSecuritySvrSession::GetList() when GetList() is called with TListId::EThreads
+as the first argument.
+
+@see RSecuritySvrSession::GetList()
+
+@code
+//buffer is a TDesC8 containing 4-byte aligned TThreadListEntry objects
+//create a pointer to the start of the data
+TUint8* ptr = (TUint8*)buffer.Ptr();
+//create a pointer to the end of the data
+const TUint8* ptrEnd = ptr + buffer.Length();
+while(ptr < ptrEnd)
+	{
+	//cast the pointer to be a TThreadListEntry object
+	TThreadListEntry& entry = *(TThreadListEntry*)ptr;
+	//use the TThreadListEntry pointer, i.e.
+	TUint16 nameLength = entry.iNameLength;
+	TPtr name(&(entry.iName[0]), nameLength, nameLength);
+	// move ptr on to point to the next TThreadListEntry object
+	ptr += Align4(entry.GetSize());
+	}
+@endcode
+*/
+class TThreadListEntry
+	{
+public:
+	TInt GetSize() const;
+public:
+	/**
+	  Thread ID
+	  */
+	TUint64 iThreadId;
+	/**
+	  Process ID
+	  */
+	TUint64 iProcessId;
+	/**
+	  Address of the base of the supervisor stack
+	  */
+	TUint32 iSupervisorStackBase;
+	/**
+	  Size of the supervisor stack
+	  */
+	TUint32 iSupervisorStackSize;
+	/**
+	  Non-zero if iSupervisorStackBase has been set correctly
+	  */
+	TUint8 iSupervisorStackBaseValid;
+	/**
+	  Non-zero if iSupervisorStackSize has been set correctly
+	  */
+	TUint8 iSupervisorStackSizeValid;
+	/**
+	  Address of the thread's supervisor stack pointer
+	  */
+	TUint32 iSupervisorStackPtr;
+	/**
+	  Indicator of whether the value returned as iSupervisorStackPtr is valid.
+	  It is necessary, but not necessarily sufficient, that the thread be suspended
+	  for a valid value to be returned. This may be removed from the final API and
+	  the value would be extracted instead via the ReadRegisters type calls.
+	  */
+	TRegisterFlag iSupervisorStackPtrValid;
+	/** Currently unused element. May be used in future to aid maintaining compatibility. */
+	TUint32 iSpare1;
+	/** Currently unused element. May be used in future to aid maintaining compatibility. */
+	TUint32 iSpare2;
+	/**
+	  The length of the thread's name
+	  */
+	TUint16 iNameLength;
+	/**
+	  First two bytes of the thread's name, the name should be considered to
+	  extend past the end of the TThreadListEntry structure to a length
+	  corresponding to iNameLength
+	  */
+	TUint16 iName[1];
+	};
+
+/**
+Returns the size of the TThreadListEntry, including the name length
+
+@return the size, in bytes, of the TExecutablesListEntry and the thread's name
+*/
+inline TInt TThreadListEntry::GetSize() const
+	{
+	return sizeof(TThreadListEntry) - sizeof(iName) + (2 * iNameLength);
+	}
+
+/**
+Denotes which list type to return from a RSecuritySvrSession::GetList() call
+
+@see RSecuritySvrSession::GetList()
+*/
+enum TListId
+	{
+	/**
+	Indicates that the GetList() call should return a list of the processes in
+	the system. The returned buffer will contain an array of 4-byte aligned
+	TProcessListEntry objects.
+
+	@see TProcessListEntry
+	*/
+	EProcesses = 0,
+	/**
+	Indicates that the GetList() call should return a list of the threads in
+	the system. The returned buffer will contain an array of 4-byte aligned
+	TThreadListEntry objects.
+
+	@see TThreadListEntry
+	*/
+	EThreads = 1,
+	/**
+	Indicates that the GetList() call should return a list of the code segments in
+	the system. The returned buffer will contain an array of 4-byte aligned
+	TCodeSegListEntry objects.
+
+	@see TCodeSegListEntry
+	*/
+	ECodeSegs = 2,
+	/**
+	Indicates that the GetList() call should return a list of the XIP libraries in
+	the system. The returned buffer will contain an array of 4-byte aligned
+	EXipLibraries objects.
+
+	@see EXipLibraries
+	*/
+	EXipLibraries = 3,
+	/**
+	Indicates that the GetList() call should return a list of the executables in
+	the system. The returned buffer will contain an array of 4-byte aligned
+	EExecutables objects.
+
+	@see EExecutables
+	*/
+	EExecutables = 4,
+	/**
+	Indicates that the GetList() call should return a list of the logical devices in the system.
+	*/
+	ELogicalDevices = 5,
+	/**
+	Indicates that the GetList() call should return a list of the mutexes in the system.
+	*/
+	EMutexes = 6,
+	/**
+	Indicates that the GetList() call should return a list of the servers in the system.
+	*/
+	EServers = 7,
+	/**
+	Indicates that the GetList() call should return a list of the sessions in the system.
+	*/
+	ESessions = 8,
+	/**
+	Indicates that the GetList() call should return a list of the semaphores in the system.
+	*/
+	ESemaphores = 9,
+	/**
+	Indicates that the GetList() call should return a list of the chunks in the system.
+	*/
+	EChunks = 10,
+
+	/**
+	Provides a complete list of all the breakpoints in the system and their
+	current state.
+
+	@see EBreakpoints
+	*/
+	EBreakpoints = 11,
+
+	/** 
+	The following are for the possible use of kernel-side debug and SMP breakpoint
+	manipulation.
+	*/
+	ESetBreak = 12,
+	ERemoveBreak = 13,
+	EModifyBreak = 14,
+	
+	/**
+	 * Provides static information of the system
+	 */
+	EStaticInfo = 15,
+
+	/** Last listing enum. */
+	EListLast
+	};
+
+/**
+  Bit field values denoting the scope of a listing.
+
+  In the debug functionality block, the TTag::iValue element which is returned for a listing tag
+  should be considered as a union of the supported values from this enumeration for that listing.
+  */
+enum TListScope
+	{
+	EScopeNone = 0x0,             /**< Corresponds to no scope for a listing. equivalent to not supported */
+	EScopeGlobal= 0x1,            /**< Corresponds to a global scope for a listing. */
+	EScopeProcessSpecific = 0x2,  /**< Corresponds to a process specific scope for a listing. */
+	EScopeThreadSpecific = 0x4    /**< Corresponds to a thread specific scope for a listing. */
+	};
+
+/**
+@internalComponent
+
+Interface constructor for passing IPC data for the GetList call.
+*/
+class TListDetails
+	{
+public:
+	TListDetails(const TListId aListId, const TListScope aListScope, TUint64 aTargetId=0)
+		: iListId(aListId),
+		  iListScope(aListScope),
+		  iTargetId(aTargetId) {}
+public:
+	TListId iListId;
+	TListScope iListScope;
+	TUint64 iTargetId;
+	};
+
+/** Debug Security Server Secure ID */
+const TUid KUidDebugSecurityServer = { 0x102834E2 };
+
+} // end of Debug namespace declaration
+
+// the remaining functionality in this file is intended for use on user side only
+#ifndef __KERNEL_MODE__
+
+#include <e32std.h>
+
+// API definition for Debug namespace appears elsewhere in this file.
+namespace Debug {
+
+/** The name of the Debug Security Server. */
+_LIT(KSecurityServerName,"DebugSecurityServer");
+
+/** Wildcard used for attach all calls */
+_LIT(KStar, "*");
+
+// A version must be specified when creating a session with the server
+/** The Debug Security Server's major version number. */
+const TUint KDebugServMajorVersionNumber=2;
+/** The Debug Security Server's minor version number. */
+const TUint KDebugServMinorVersionNumber=5;
+/** The Debug Security Server's patch version number. */
+const TUint KDebugServPatchVersionNumber=0;
+
+/**
+Denotes how memory should be accessed
+*/
+enum TAccess
+	{
+	EAccess8 = 1,	/**< Currently unsupported, signifies 8 bit access. */
+	EAccess16 = 2,	/**< Currently unsupported, signifies 16 bit access. */
+	EAccess32 = 4	/**< Signifies 32 bit access. */
+	};
+
+/**
+Denotes how data should be interpreted
+*/
+enum TEndianess
+	{
+	EEndLE8 = 0,	/**< Signifies 8 bit little-endian. */
+	EEndBE8 = 1,	/**< Currently unsupported, signifies 8 bit big-endian. */
+	EEndBE32 = 2	/**< Currently unsupported, signifies 32 bit big-endian. */
+	};
+
+/**
+Structure used to store information about a memory operation
+
+@internalComponent
+*/
+class TMemoryInfo
+	{
+public:
+
+	TMemoryInfo(TUint32 aAddress=0, TUint32 aLength=0, TAccess aAccess=EAccess32, TEndianess aEndianess=EEndLE8)
+		: iAddress(aAddress),
+		  iSize(aLength),
+		  iAccess(aAccess),
+		  iEndianess(aEndianess)
+		{}
+
+public:
+
+	/**
+	Address to start reading/writing memory
+	*/
+	TUint32 iAddress;
+	/**
+	Number of bytes of memory to read/write
+	*/
+	TUint32	iSize;
+	/**
+	Access size for read/write
+	@see TAccess
+	*/
+	TAccess iAccess;
+	/**
+	Endianess to interpret data as
+	@see TEndianess
+	*/
+	TEndianess iEndianess;
+	};
+
+/**
+@internalComponent
+*/
+class TBreakInfo
+	{
+public:
+	TUint32 iAddress;
+	TArchitectureMode iArchitectureMode;
+	};
+
+/**
+@internalComponent
+
+Function codes (opcodes) used in message passing between client and server
+in this header file and what arguments should be passed with each of these
+*/
+enum TDebugServRqst
+	{
+	EDebugServOpen = 1,
+	EDebugServClose = 2,
+	EDebugServSuspendThread = 3,
+	EDebugServResumeThread = 4,
+	EDebugServReadMemory = 5,
+	EDebugServWriteMemory = 6,
+	EDebugServSetBreak = 7,
+	EDebugServClearBreak = 8,
+	EDebugServModifyBreak = 9,
+	EDebugServGetEvent = 10,
+	EDebugServCancelGetEvent = 11,
+	EDebugServAttachExecutable = 12,
+	EDebugServDetachExecutable = 13,
+	EDebugServGetDebugFunctionalityBufSize = 14,
+	EDebugServGetDebugFunctionality = 15,
+	EDebugServReadRegisters = 16,
+	EDebugServWriteRegisters = 17,
+	EDebugServSetEventAction = 18,
+	EDebugServBreakInfo = 19,
+	EDebugServGetList = 20,
+	EDebugServStep = 21,
+	EDebugServSetProcessBreak = 22,
+	EDebugServProcessBreakInfo = 23,
+	EDebugServKillProcess = 24,
+	EDebugServModifyProcessBreak = 25,
+	EDebugServReadCrashFlash = 26,
+	EDebugServWriteCrashFlash = 27,
+	EDebugServEraseCrashFlash = 28,
+	EDebugServEraseEntireCrashFlash = 29,
+	EDebugServAttachAll = 30,
+	EDebugServDetachAll = 31,
+	};
+
+/**
+Client side API to debug security server (DSS). Interaction with the DSS should
+be conducted through this class only.
+*/
+class RSecuritySvrSession : public RSessionBase
+	{
+public:
+	RSecuritySvrSession();
+	TVersion Version() const;
+
+	TInt AttachExecutable(const TDesC& aProcessName, TBool aPassive);
+	TInt DetachExecutable(const TDesC& aProcessName);
+
+	TInt GetDebugFunctionalityBufSize(TUint32* aBufSize);
+	TInt GetDebugFunctionality(TDes8& aBuffer);
+
+	TInt SuspendThread(const TThreadId aThreadId);
+	TInt ResumeThread(const TThreadId aThreadId);
+
+	TInt ReadMemory(const TThreadId aThreadId, const TUint32 aAddress, const TUint32 aLength, TDes8 &aData, const TAccess aAccessSize, const TEndianess aEndianess);
+	TInt WriteMemory(const TThreadId aThreadId, const TUint32 aAddress, const TUint32 aLength, const TDesC8 &aData, const TAccess aAccessSize, const TEndianess aEndianess);
+
+	TInt ReadRegisters(const TThreadId aThreadId, const TDesC8& aRegisterIds, TDes8& aRegisterValues, TDes8& aRegisterFlags);
+	TInt WriteRegisters(const TThreadId aThreadId, const TDesC8& aRegisterIds, const TDesC8& aRegisterValues, TDes8& aRegisterFlags);
+
+	void GetEvent(const TDesC& aExecutableName, TRequestStatus &aStatus, TDes8& aEventInfo);
+	TInt CancelGetEvent(const TDesC& aExecutableName);
+	
+	TInt SetEventAction(const TDesC& aExecutableName, TEventType aEvent, TKernelEventAction aEventAction);
+
+	TInt SetBreak( TBreakId &aId, const TThreadId aThreadId, const TUint32 aAddress, const TArchitectureMode aArchitectureMode);
+	TInt ClearBreak(const TBreakId aBreakId);
+	TInt ModifyBreak(const TBreakId aBreakId, const TThreadId aThreadId, const TUint32 aAddress, const TArchitectureMode aArchitectureMode);
+	TInt BreakInfo(const TBreakId aBreakId, TThreadId& aThreadId, TUint32& aAddress, TArchitectureMode& aMode);
+	TInt SetProcessBreak( TBreakId &aId, const TProcessId aProcessId, const TUint32 aAddress, const TArchitectureMode aArchitectureMode);
+	TInt ProcessBreakInfo(const TBreakId aBreakId, TProcessId& aProcessId, TUint32& aAddress, TArchitectureMode& aMode);
+	TInt ModifyProcessBreak(const TBreakId aBreakId, const TProcessId aProcessId, const TUint32 aAddress, const TArchitectureMode aArchitectureMode);
+
+	TInt GetList(const TListId aListId, TDes8& aListData, TUint32& aDataSize);
+	TInt GetList(const TThreadId aThreadId, const TListId aListId, TDes8& aListData, TUint32& aDataSize);
+	TInt GetList(const TProcessId aProcessId, const TListId aListId, TDes8& aListData, TUint32& aDataSize);
+	TInt Step(const TThreadId aThreadId, TUint32 aNumSteps);
+	TInt KillProcess(const TProcessId aProcessId, const TInt aReason);
+	TInt ReadCrashLog(const TUint32 aPos, TDes8& aData, const TUint32 aDataSize);	
+	TInt WriteCrashConfig(const TUint32 aPos, const TDesC8& aBuffer, TUint32& aSize);
+	TInt EraseCrashLog(const TUint32 aPos, const TUint32 aBlockNumber);
+	TInt EraseCrashFlashPartition();
+
+	TInt Connect(const TVersion aVersion);
+
+	// Added in version 2.5
+    TInt AttachAll();
+    TInt DetachAll();	
+    void GetEvent(TRequestStatus &aStatus, TDes8& aEventInfo);
+    TInt CancelGetEvent();
+    TInt SetEventAction(TEventType aEvent, TKernelEventAction aEventAction);
+
+private:
+	TInt StartServer(void);
+	};
+
+/**
+Server session constructor
+*/
+inline RSecuritySvrSession::RSecuritySvrSession()
+	{
+	}
+
+/**
+Called by a client to create a session with the DSS. This method starts the
+DSS if it is not running, or connects to it if it already exists.
+
+@param aVersion version of the DSS to connect to
+
+@return KErrNone if a connection was successfully created, or one of the other
+system wide error codes
+*/
+inline TInt RSecuritySvrSession::Connect(const TVersion aVersion)
+	{
+	// Default asynch outstanding message slots for the server. Not that these are 
+	// allocated from a system-wide pool of 255, so have to be careful with resources.
+	const TUint KDefaultMessageSlots = 8;
+	
+	TInt retry=2;
+	for (;;)
+		{
+		TInt r=CreateSession(KSecurityServerName, aVersion, KDefaultMessageSlots);
+		if (r!=KErrNotFound && r!=KErrServerTerminated)
+			{
+			return r;
+			}
+		if (--retry==0)
+			{
+			return r;
+			}
+		r=StartServer();
+		if (r!=KErrNone && r!=KErrAlreadyExists)
+			{
+			return r;
+			}
+		}
+	}
+
+/**
+  Start the server
+
+  @return KErrNone on success, or one of the other system wide error codes
+  */
+inline TInt RSecuritySvrSession::StartServer()
+	{
+	// constants for the server
+	_LIT(KSecurityServerProcessName, "rm_debug_svr");
+	const TUidType serverUid(KNullUid, KNullUid, KUidDebugSecurityServer);
+
+	RProcess server;
+	TInt err = server.Create(KSecurityServerProcessName, KNullDesC, serverUid);
+
+	if(KErrNone != err)
+		{
+		return err;
+		}
+
+	// Synchronise with the process to make sure it hasn't died straight away
+	TRequestStatus stat;
+	server.Rendezvous(stat);
+	if (stat != KRequestPending)
+		{
+		// logon failed - server is not yet running, so cannot have terminated
+		server.Kill(0);             // Abort startup
+		}
+	else
+		{
+		// logon OK - start the server
+		server.Resume();
+		}
+
+	// Wait to synchronise with server - if it dies in the meantime, it
+	// also gets completed
+	User::WaitForRequest(stat);
+
+	// We can't use the 'exit reason' if the server panicked as this
+	// is the panic 'reason' and may be '0' which cannot be distinguished
+	// from KErrNone
+	err = (server.ExitType()==EExitPanic) ? KErrGeneral : stat.Int();
+	server.Close();
+	return err;
+	}
+
+/**
+Get version of RSecuritySvrSession
+
+@return a TVersion object specifying the version
+*/
+inline TVersion RSecuritySvrSession::Version(void) const
+	{
+	return (TVersion(KDebugServMajorVersionNumber, KDebugServMinorVersionNumber, KDebugServPatchVersionNumber));
+	}
+
+/**
+Suspends execution of the specified thread.
+
+@param aThreadId thread ID of the thread to suspend
+
+@return KErrNone if there were no problems, KErrPermissionDenied if security 
+        check fails or KErrArgument if the thread does not exist
+*/
+inline TInt RSecuritySvrSession::SuspendThread(const TThreadId aThreadId)
+	{
+	TPckgBuf<TThreadId> threadIdPckg(aThreadId);
+	TIpcArgs args(&threadIdPckg);
+
+	return SendReceive(EDebugServSuspendThread, args);
+	}
+
+/**
+Resumes execution of the specified thread.
+
+@param aThreadId thread ID of the thread to resume
+
+@return KErrNone if there were no problems, KErrPermissionDenied if security 
+        check fails or KErrArgument if the thread does not exist
+*/
+inline TInt RSecuritySvrSession::ResumeThread(const TThreadId aThreadId)
+	{
+	TPckgBuf<TThreadId> threadIdPckg(aThreadId);
+	TIpcArgs args(&threadIdPckg);
+
+	return SendReceive(EDebugServResumeThread, args);
+	}
+
+/**
+Purpose:
+Set a thread-specific breakpoint in an attached process. 
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must be attached to a process.
+
+@param aThreadId The thread id to which the breakpoint will apply.
+@param aAddress The virtual memory address at which to place the breakpoint.
+@param aArchitectureMode The kind of breakpoint which is to be set (e.g. ARM/Thumb/Thumb2EE)
+@param aBreakId The address to which the assigned breakpoint ID will be written by this function
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::SetBreak( TBreakId &aBreakId,const TThreadId aThreadId, const TUint32 aAddress, const TArchitectureMode aArchitectureMode)
+	{
+	TPtr8 breakIdPtr((TUint8*)&aBreakId, sizeof(aBreakId));
+
+	TPckgBuf<TThreadId> threadIdPckg(aThreadId);
+
+	TBreakInfo breakInfo;
+	breakInfo.iAddress = aAddress;
+	breakInfo.iArchitectureMode = aArchitectureMode;
+	TPckgBuf<TBreakInfo> breakInfoPckg(breakInfo);
+
+	//call driver to attempt to set break
+	TIpcArgs args(&threadIdPckg, &breakInfoPckg, &breakIdPtr);
+	return SendReceive(EDebugServSetBreak, args);
+	}
+
+/**
+Purpose:
+Clears a previously set thread-specific or process-specific breakpoint.
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must be attached to a process.
+
+@param aBreakId The TBreakId returned by a prior SetBreak call. Must have been set by the same Debug Agent.
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::ClearBreak(const TBreakId aBreakId)
+	{
+	TIpcArgs args(aBreakId);
+	return SendReceive(EDebugServClearBreak, args);
+	}
+
+/**
+Purpose:
+Modifies the properties of a previously set breakpoint.
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must be attached to a process.
+
+@param aBreakId the TBreakId returned by a prior SetBreak() call. Must have been set by the same Debug Agent.
+@param aThreadId the thread id of the thread to move the breakpoint to
+@param aAddress the virtual memory address at which to place the breakpoint.
+@param aArchitectureMode the kind of breakpoint which is to be set (e.g. ARM/Thumb/Thumb2EE)
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::ModifyBreak(const TBreakId aBreakId, const TThreadId aThreadId, const TUint32 aAddress, const TArchitectureMode aArchitectureMode)
+
+	{
+	TPckgBuf<TThreadId> threadIdPckg(aThreadId);
+	TIpcArgs args(aBreakId,&threadIdPckg,aAddress,aArchitectureMode);
+	return SendReceive(EDebugServModifyBreak, args);
+	}
+
+/**
+Purpose:
+Modifies the properties of a previously set process breakpoint.
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must be attached to a process.
+
+@param aBreakId the TBreakId returned by a prior SetBreak() call. Must have been set by the same Debug Agent.
+@param aProcessId the process id of the process to move the breakpoint to
+@param aAddress the virtual memory address at which to place the breakpoint.
+@param aArchitectureMode the kind of breakpoint which is to be set (e.g. ARM/Thumb/Thumb2EE)
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::ModifyProcessBreak(const TBreakId aBreakId, const TProcessId aProcessId, const TUint32 aAddress, const TArchitectureMode aArchitectureMode)
+
+	{
+	TPckgBuf<TProcessId> processIdPckg(aProcessId);
+	TIpcArgs args(aBreakId,&processIdPckg,aAddress,aArchitectureMode);
+	return SendReceive(EDebugServModifyProcessBreak, args);
+	}
+
+/**
+Purpose:
+Returns the properties associated with a given TBreakId. The supplied break id must previously have been allocated
+to the debug agent by a SetBreak() call.
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must be attached to a process.
+@pre The aBreakId must have been previously returned by a SetBreak() call and not subsequently cleared by ClearBreak().
+
+@param aBreakId the TBreakId returned by a prior SetBreak() call. Must have been set by the same Debug Agent.
+@param aAddress on return contains the virtual memory address of the breakpoint
+@param aThreadId on return contains the thread id of the thread that the breakpoint is set in
+@param aMode on return contains the type of this breakpoint (e.g. ARM/Thumb/Thumb2EE)
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::BreakInfo(const TBreakId aBreakId, TThreadId& aThreadId, TUint32& aAddress, TArchitectureMode& aMode)
+	{
+	// temporary descriptors
+	TPtr8 threadId((TUint8*)&aThreadId,0,sizeof(TThreadId));
+	TPtr8 address((TUint8*)&aAddress,0,sizeof(TUint32));
+	TPtr8 mode((TUint8*)&aMode,0,sizeof(TArchitectureMode));
+
+	TIpcArgs args(aBreakId,&threadId,&address,&mode);
+	return SendReceive(EDebugServBreakInfo, args);
+	}
+
+/**
+Purpose:
+Set a process-specific breakpoint in an attached process. 
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must be attached to a process.
+
+@param aProcessId The process id to which the breakpoint will apply.
+@param aAddress The virtual memory address at which to place the breakpoint.
+@param aArchitectureMode The kind of breakpoint which is to be set (e.g. ARM/Thumb/Thumb2EE)
+@param aBreakId The address to which the assigned breakpoint ID will be written by this function
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::SetProcessBreak( TBreakId &aBreakId, const TProcessId aProcessId, const TUint32 aAddress, const TArchitectureMode aArchitectureMode)
+	{
+	TPtr8 breakIdPtr((TUint8*)&aBreakId, sizeof(aBreakId));
+
+	TPckgBuf<TProcessId> threadIdPckg(aProcessId);
+
+	TBreakInfo breakInfo;
+	breakInfo.iAddress = aAddress;
+	breakInfo.iArchitectureMode = aArchitectureMode;
+	TPckgBuf<TBreakInfo> breakInfoPckg(breakInfo);
+
+	//call driver to attempt to set break
+	TIpcArgs args(&threadIdPckg, &breakInfoPckg, &breakIdPtr);
+	return SendReceive(EDebugServSetProcessBreak, args);
+	}
+
+/**
+Purpose:
+Returns the properties associated with a given TBreakId. The supplied break id must previously have been allocated
+to the debug agent by a SetProcessBreak() call.
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must be attached to a process.
+@pre The aBreakId must have been previously returned by a SetProcessBreak() call and not subsequently cleared by ClearBreak().
+
+@param aBreakId the TBreakId returned by a prior SetBreak() call. Must have been set by the same Debug Agent.
+@param aAddress on return contains the virtual memory address of the breakpoint
+@param aThreadId on return contains the thread id of the thread that the breakpoint is set in
+@param aMode on return contains the type of this breakpoint (e.g. ARM/Thumb/Thumb2EE)
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::ProcessBreakInfo(const TBreakId aBreakId, TProcessId& aProcessId, TUint32& aAddress, TArchitectureMode& aMode)
+	{
+	// temporary descriptors
+	TPtr8 processId((TUint8*)&aProcessId,0,sizeof(TProcessId));
+	TPtr8 address((TUint8*)&aAddress,0,sizeof(TUint32));
+	TPtr8 mode((TUint8*)&aMode,0,sizeof(TArchitectureMode));
+
+	TIpcArgs args(aBreakId,&processId,&address,&mode);
+	return SendReceive(EDebugServProcessBreakInfo, args);
+	}
+
+/**
+Purpose:
+Wait for an event to occur to the target executable being debugged. When an event
+occurs, the TRequestStatus is completed.
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must be attached to a process.
+
+Note 1: Events are reported on a per-executable basis, not per-thread.
+
+Note 2: All the parameters must remain in scope until either CancelGetEvent is called, or
+until the request is completed. In practice, this generally
+means these parameters should not be based on the stack, as they may go out of
+scope before the call completes.
+
+Note 3: Errors are signalled by completing aStatus
+
+@param aExecutableName The name of any executable to which the Debug Agent is attached.
+@param aStatus Debug Agent request status variable.
+@param aEventInfo Descriptor containing a TEventInfo object. 
+
+*/
+inline void RSecuritySvrSession::GetEvent(const TDesC& aExecutableName, TRequestStatus &aStatus, TDes8& aEventInfo)
+	{
+	TIpcArgs args(&aExecutableName, &aEventInfo);
+
+	SendReceive(EDebugServGetEvent, args, aStatus );
+
+	}
+ 
+/**
+Purpose:
+Cancel a previously issued asynchronous RSecuritySvrSession::GetEvent call.
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent should have called AttachExecutable and GetEvent for the same executable
+
+@param aExecutableName The name of the executable being debugged.
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::CancelGetEvent(const TDesC& aExecutableName)
+{
+	TIpcArgs args(&aExecutableName);
+
+	return SendReceive(EDebugServCancelGetEvent,args);
+}
+
+
+/**
+Purpose:
+Wait for an event to occur from any process. When an event
+occurs, the TRequestStatus is completed.
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must have called AttachAll.
+
+Note 1: Events are reported on a FIFO basis
+
+Note 2: All the parameters must remain in scope until either CancelGetEvent is called, or
+until the request is completed. In practice, this generally
+means these parameters should not be based on the stack, as they may go out of
+scope before the call completes.
+
+Note 3: Errors are signalled by completing aStatus
+
+@param aStatus Debug Agent request status variable.
+@param aEventInfo Descriptor containing a TEventInfo object.
+
+*/
+inline void RSecuritySvrSession::GetEvent(TRequestStatus &aStatus, TDes8& aEventInfo)
+    {
+	TIpcArgs args(&KStar, &aEventInfo);
+
+    SendReceive(EDebugServGetEvent, args, aStatus );
+    }
+ 
+/**
+Purpose:
+Cancel a previously issued asynchronous RSecuritySvrSession::GetEvent call.
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent should have called AttachAll and GetEvent
+
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::CancelGetEvent()
+    {
+    TIpcArgs args(&KStar);
+
+    return SendReceive(EDebugServCancelGetEvent,args);
+    }
+
+
+/**
+Called by a debug agent to request debug privileges for the executable with
+file name aExecutableName.
+
+@param aExecutableName a fully qualified file name of the executable to attach to
+@param aPassive if true then the agent has reduced debug rights.
+
+@return KErrNone if attached successfully, one of the other system wide error
+	codes otherwise
+*/
+inline TInt RSecuritySvrSession::AttachExecutable(const TDesC& aExecutableName, TBool aPassive)
+	{
+	TIpcArgs args((TInt)aPassive, &aExecutableName);
+	return SendReceive(EDebugServAttachExecutable, args);
+	}
+
+/**
+Called by a debug agent to detach from the executable with file
+name aExecutableName.
+
+@param aExecutableName the fully qualified file name of the executable to detach from
+
+@return KErrNone if detached successfully, one of the other system wide error
+	codes otherwise
+*/
+inline TInt RSecuritySvrSession::DetachExecutable(const TDesC& aExecutableName)
+	{
+	TIpcArgs args(&aExecutableName);
+	return SendReceive(EDebugServDetachExecutable, args);
+	}
+
+/**
+Called by a debug agent to attach to events from all processes
+
+@return KErrNone if attached successfully, one of the other system wide error
+    codes otherwise
+*/
+inline TInt RSecuritySvrSession::AttachAll()
+    {
+    return SendReceive(EDebugServAttachAll);
+    }
+
+/**
+Called by a debug agent to detach from all events from all processes
+
+@return KErrNone if detached successfully, one of the other system wide error
+    codes otherwise
+*/
+inline TInt RSecuritySvrSession::DetachAll()
+    {
+    return SendReceive(EDebugServDetachAll);
+    }
+
+/**
+Get buffer size required to contain Functionality text block.
+
+@see in-source documentation in rm_debug_api.h
+
+@param aBufSize function will fill this with the required buffer size
+
+@return KErrNone if the call succeeded, or one of the other system wide error
+        codes if the call failed
+*/
+inline TInt RSecuritySvrSession::GetDebugFunctionalityBufSize(TUint32 *aBufSize)
+	{	
+	TInt res = KErrNone;
+
+	TPtr8 stuff((TUint8*)aBufSize,4, 4);
+
+	TIpcArgs args(&stuff);
+
+	res = SendReceive(EDebugServGetDebugFunctionalityBufSize, args);
+	
+	return res;
+	}
+
+/**
+Get debug functionality text block and place it into aBuffer.
+
+The debug functionality block (DFBlock) is used to provide information about the functionality
+(i.e. features) which are supported by the rm_debug.ldd device driver.
+
+Calling this function with a suitably sized buffer aBuffer will result in the debug
+functionality information being stored in aBuffer. The necessary size of aBuffer can
+be determined by calling DebugFunctionalityBufSize().
+
+The format of the DFBlock is:
+
+@code
+Sub-block 0
+Sub-block 1
+...
+Sub-block N-1
+@endcode
+
+The data which will be returned by a call to GetDebugFunctionality() is constant so is
+guaranteed to fit exactly into the aBuffer allocated, assuming that the size of aBuffer
+corresponds to the value returned from GetDebugFunctionalityBufSize().
+
+Each sub-block is composed of a TTagHeader object followed by a C-style array of TTag objects.
+The sub-block contains information about a particular aspect of the debug sub-system, for example
+information about the manner in which memory can be accessed.
+The TTagHeader is comprised of an identifier which determines the type of data
+it contains, together with the number of TTag elements in the array following the TTagHeader.
+Each TTag in a sub-block has a unique ID, stored in the TTag::iTagId member variable.
+
+The only sub-block that is guaranteed to exist has TTagHeader::iTagHdrId = ETagHeaderIdCore, all other
+sub-blocks are optional. The ETagHeaderIdCore sub-block is the first sub-block within the DFBlock.
+Other sub-blocks may appear in any order after the ETagHeaderIdCore sub-block.
+
+The following is a diagrammatic representation of a sub-block the DFBlock:
+
+@code
+The HHHH represents the tag header ID of a sub-block (TTagHeader::iTagHdrId)
+The NNNN represents the number of TTag elements in the sub-block (TTagHeader::iNumTags)
+The IIIIIIII represents the ID of the TTag (TTag::iTagId)
+The TTTT represents the type of the TTag (TTag::iType)
+The SSSS represents the size of the TTag's associated data (TTag::iSize)
+The VVVVVVVV represents the TTag's value (TTag::iValue)
+
+0xNNNNHHHH	TTagHeader element for first sub-block (has N1 TTag elements)
+0xIIIIIIII	\
+0xSSSSTTTT	-- TTag 0
+0xVVVVVVVV	/
+0xIIIIIIII	\
+0xSSSSTTTT	-- TTag 1
+0xVVVVVVVV	/
+...
+0xIIIIIIII	\
+0xSSSSTTTT	-- TTag N1 - 1
+0xVVVVVVVV	/
+0xNNNNHHHH	TTagHeader element for second sub-block (has N2 TTag elements)
+0xIIIIIIII	\
+0xSSSSTTTT	-- TTag 0
+0xVVVVVVVV	/
+...
+0xIIIIIIII	\
+0xSSSSTTTT	-- TTag N2 - 1
+0xVVVVVVVV	/
+...
+0xNNNNHHHH	TTagHeader element for last sub-block (has NX TTag elements)
+0xIIIIIIII	\
+0xSSSSTTTT	-- TTag 0
+0xVVVVVVVV	/
+...
+0xIIIIIIII	\
+0xSSSSTTTT	-- TTag NX - 1
+0xVVVVVVVV	/
+@endcode
+
+The following example DFBlock contains two sub-blocks (values taken from enums below):
+- ETagHeaderIdCore
+- ETagHeaderIdMemory
+
+@code
+Binary		Meaning					Value
+
+0x000A0000	iTagHdrId, iNumTags		ETagHeaderIdCore, ECoreLast
+0x00000000	iTagId					ECoreEvents
+0x00000000	iType, iSize			ETagTypeBoolean, 0
+0x00000001	iValue					ETrue
+0x00000001	iTagId					ECoreStartStop
+0x00000000	iType, iSize			ETagTypeBoolean, 0
+0x00000001	iValue					ETrue
+...
+0x00000008	iTagId					ECoreHardware
+0x00000000	iType, iSize			ETagTypeBoolean, 0
+0x00000000	iValue					EFalse
+0x00000009	iTagId					ECoreApiConstants
+0x00000000	iType, iSize			ETagTypeBoolean, 0
+0x00000001	iValue					ETrue
+
+0x000A0001	iTagHdrId, iNumTags		ETagHeaderIdMemory, EMemoryLast
+0x00000000	iTagId					EMemoryRead
+0x00000000	iType, iSize			ETagTypeBoolean, 0
+0x00000001	iValue					ETrue
+0x00000001	iTagId					EMemoryWrite
+0x00000000	iType, iSize			ETagTypeBoolean, 0
+0x00000001	iValue					ETrue
+...
+0x00000008	iTagId					EMemoryLE8
+0x00000000	iType, iSize			ETagTypeBoolean, 0
+0x00000001	iValue					ETrue
+0x00000009	iTagId					EMemoryMaxBlockSize
+0x00000001	iType, iSize			ETagTypeTUint32, 0
+0x00004000	iValue					0x4000
+@endcode
+
+- Debug Agent DFBlock Processing:
+
+Debug Agents MUST understand and process the ETagHeaderIdCore block. The other
+blocks may be ignored if not recognised. Tags within each block may be ignored if
+not recognised.
+
+@pre aBuffer.MaxLength() >= *aBufSize where aBufSize is set by a call to: 
+     RSecuritySvrSession::GetDebugFunctionalityBufSize(TUint32 *aBufSize)
+
+@param aBuffer buffer to store functionality block in
+
+@return KErrNone if call succeeded, 
+        KErrNoMemory if temporary memory could not be allocated, 
+        KErrGeneral if debug functionality block could not be accessed
+*/
+inline TInt RSecuritySvrSession::GetDebugFunctionality(TDes8& aBuffer)
+	{
+	TIpcArgs args(&aBuffer);
+
+	TInt res = KErrNone;
+
+	res = SendReceive(EDebugServGetDebugFunctionality, args);
+
+	return res;
+	}
+
+/**
+Read a block of memory from the target debug thread defined by aThreadId.
+
+@pre the client should attach to the process containing the target thread
+@pre aData.MaxLength() >= aLength
+
+@param aThreadId thread ID of the thread to read memory from
+@param aAddress address to start reading memory from
+@param aLength number of bytes of memory to read
+@param aData descriptor to read memory into
+@param aAccessSize access size for memory reads, default is TAccess::EAccess32
+@param aEndianess interpretation of endianess of target data, default is
+       TEndianess::EEndLE8
+
+@return KErrNone if memory read successfully, or one of the other system wide error codes
+*/
+inline TInt RSecuritySvrSession::ReadMemory(const TThreadId aThreadId, const TUint32 aAddress, const TUint32 aLength, TDes8 &aData, const TAccess aAccessSize, const TEndianess aEndianess)
+	{
+	TPckgBuf<TThreadId> threadIdPckg(aThreadId);
+	//set up memory info object
+	TMemoryInfo memoryInfo;
+	memoryInfo.iAddress = aAddress;
+	memoryInfo.iSize = aLength;
+	memoryInfo.iAccess = aAccessSize;
+	memoryInfo.iEndianess = aEndianess;
+
+	TPckgBuf<TMemoryInfo> pckg(memoryInfo);
+
+	TIpcArgs args(&threadIdPckg, &pckg, &aData);
+
+	return SendReceive(EDebugServReadMemory, args);
+	}
+
+/**
+Write a block of memory to the target debug thread defined by aThreadId.
+
+@pre the client should attach non-passively to the process containing the
+     target thread
+
+@param aThreadId thread ID of the thread to write memory to
+@param aAddress address to start writing memory at
+@param aLength number of bytes of memory to write
+@param aData descriptor to read memory from
+@param aAccessSize access size for memory writes, default is TAccess::EAccess32
+@param aEndianess interpretation of endianess of target data, default is
+       TEndianess::EEndLE8
+
+@return KErrNone if memory written successfully, or one of the other system wide error codes
+*/
+inline TInt RSecuritySvrSession::WriteMemory(const TThreadId aThreadId, const TUint32 aAddress, const TUint32 aLength, const TDesC8 &aData, const TAccess aAccessSize, const TEndianess aEndianess)
+	{
+	TPckgBuf<TThreadId> threadIdPckg(aThreadId);
+	//create memory info object
+	TMemoryInfo memoryInfo;
+	memoryInfo.iAddress = aAddress;
+	memoryInfo.iSize = aLength;
+	memoryInfo.iAccess = aAccessSize;
+	memoryInfo.iEndianess = aEndianess;
+
+	TPckgBuf<TMemoryInfo> pckg(memoryInfo);
+
+	TIpcArgs args(&threadIdPckg, &pckg, &aData);
+
+	return SendReceive(EDebugServWriteMemory, args);
+	}
+
+/**
+Read register values from the thread with thread ID aThreadId. The IDs of the
+registers to read are stored as an array of TRegisterInfo objects in 
+aRegisterIds. If the nth register requested could be read then the value of the 
+register will be appended to aRegisterValues and EValid stored at 
+offset n in aRegisterFlags. If the register is supported but could not be read 
+then EInValid will be stored at offset n in aRegisterFlags and arbitrary data 
+appended in aRegisterValues. If reading the specified register is not
+supported by the kernel then ENotSupported will be stored at offset n in 
+aRegisterFlags and arbitrary data appended to aRegisterValues. If an unknown
+register is specified then EUnknown will be put in aRegisterFlags and 
+arbitrary data placed in aRegisterValues.
+
+@pre the client should attach to the process containing the target thread
+
+@see the register ID format is defined in: 
+     SGL.TS0028.027 - Symbian Core Dump File Format v1.0.doc
+
+@param aThreadId thread ID of the thread to read register values from
+@param aRegisterIds descriptor containing array of TFunctionalityRegister defined 
+       register IDs
+@param aRegisterValues descriptor to contain register values
+@param aRegisterFlags descriptor containing array of TUint8 flags, with values 
+       taken from TRegisterFlag
+
+@return KErrNone if registers were read successfully, or one of the other system wide error codes
+*/
+inline TInt RSecuritySvrSession::ReadRegisters(const TThreadId aThreadId, const TDesC8& aRegisterIds, TDes8& aRegisterValues, TDes8& aRegisterFlags)
+	{
+	TPckgBuf<TThreadId> threadIdPckg(aThreadId);
+	TIpcArgs args(&threadIdPckg, &aRegisterIds, &aRegisterValues, &aRegisterFlags);
+
+	return SendReceive(EDebugServReadRegisters, args);
+	}
+
+/**
+Write register values to the thread with thread ID aThreadId. The IDs of the 
+registers to write are stored as an array of TRegisterInfo objects in 
+aRegisterIds. The values to put in the registers are stored as an array of 
+objects in aRegisterValues. If the nth register to write could be 
+written then EValid stored at offset n in aRegisterFlags. If the register is 
+supported but could not be written then EInValid will be stored at offset n in 
+aRegisterFlags. If writing to the specified register is not supported by the 
+kernel then ENotSupported will be stored at offset n in aRegisterFlags. If an 
+unknown register is specified then EUnknown will be put in aRegisterFlags.
+
+@pre the client should attach non-passively to the process containing the 
+     target thread
+
+@see the register ID format is defined in: 
+     SGL.TS0028.027 - Symbian Core Dump File Format v1.0.doc
+
+@param aThreadId thread ID of the thread to write register values to
+@param aRegisterIds descriptor containing array of TFunctionalityRegister defined 
+       register IDs
+@param aRegisterValues descriptor containing array of register values
+@param aRegisterFlags descriptor containing array of TUint8 flags, with values 
+       taken from TRegisterFlag
+
+@return KErrNone if registers were written successfully, or one of the other system wide error codes
+*/
+inline TInt RSecuritySvrSession::WriteRegisters(const TThreadId aThreadId, const TDesC8& aRegisterIds, const TDesC8& aRegisterValues, TDes8& aRegisterFlags)
+	{
+	TPckgBuf<TThreadId> threadIdPckg(aThreadId);
+	TIpcArgs args(&threadIdPckg, &aRegisterIds, &aRegisterValues, &aRegisterFlags);
+
+	return SendReceive(EDebugServWriteRegisters, args);
+	}
+
+/**
+Purpose:
+Set the requisite actions to be taken when a particular event occurs.
+The events are defined in Debug::TEventType and the
+actions are defined in Debug::TKernelEventAction.
+
+The default action for all events is EActionIgnore.
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must be attached to the executable specified by aExecutableName.
+
+Note: Event actions are on a per-executable basis. This is
+to ensure that events such as EEventStartThread are notified to the Debug
+Agent, even though the debug agent cannot be aware of the existence
+of a new thread at the time the event occurs.
+
+@param aExecutableName The name of the executable to which the Debug Agent is attached.
+@param aEvent A TEventType enum defined in rm_debug_api.h:Debug::TEventType
+@param aEventAction Any TKernelEventAction permitted by the DFBlock.
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::SetEventAction(const TDesC& aExecutableName, TEventType aEvent, TKernelEventAction aEventAction)
+{
+	TInt res = KErrNone;
+
+	TIpcArgs args(&aExecutableName,aEvent,aEventAction);
+
+	res = SendReceive(EDebugServSetEventAction, args);
+	
+	return res;
+}
+ 
+/**
+Purpose:
+Set the requisite actions to be taken when a particular event occurs that is not 
+associated with any particular process or executable.
+
+The events are defined in Debug::TEventType and the
+actions are defined in Debug::TKernelEventAction.
+
+The default action for all events is EActionIgnore.
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must have called AttachAll.
+
+@param aEvent A TEventType enum defined in rm_debug_api.h:Debug::TEventType
+@param aEventAction Any TKernelEventAction permitted by the DFBlock.
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::SetEventAction(TEventType aEvent, TKernelEventAction aEventAction)
+    {
+    TInt res = KErrNone;
+
+    TIpcArgs args(&KStar, aEvent, aEventAction);
+
+    res = SendReceive(EDebugServSetEventAction, args);
+
+    return res;
+    }
+
+/**
+Returns a global listing corresponding to the type specified as aListId. The structure
+of the returned data depends on the value of aListId, see TListId for details.
+If aListData is not large enough to contain the listings data then
+the necessary buffer size is stored in aDataSize and the function returns
+KErrTooBig. In this case the contents of aListData will not contain useful data.
+
+Note that if the aListData buffer was too small to hold the data then the value
+returned as aDataSize corresponds to the size of the data at that particular
+instance. The size of the data will vary over time, for example the thread list
+will increase and decrease in size as threads are created and destroyed, so
+re-requesting data with a buffer with max length aDataSize will not necessarily
+succeed if a list has increased in size between the two calls.
+
+@see TListId
+
+@param aListId enum from TListId signifying which type of listing to return
+@param aListData buffer provided by the debug agent in which data can be returned by the debug system
+@param aDataSize if aListData was not large enough to contain the requested
+       data then the necessary buffer size is stored in aDataSize. If aListData
+       was large enough then the value of aDataSize is the length of aListData
+
+@return KErrNone if data was returned successfully,
+        KErrTooBig if aListData is too small to hold the data,
+	one of the other system-wide error codes
+*/
+inline TInt RSecuritySvrSession::GetList(const TListId aListId, TDes8& aListData, TUint32& aDataSize)
+	{
+	//second argument of ETrue implies a global listing
+	TListDetails info(aListId, EScopeGlobal);
+	TPtr8 infoBuf((TUint8*)&info, sizeof(TListDetails), sizeof(TListDetails));
+	TPtr8 dataSizeBuf((TUint8*)&aDataSize, sizeof(TUint32), sizeof(TUint32));
+	TIpcArgs args(&infoBuf, &aListData, &dataSizeBuf);
+	return SendReceive(EDebugServGetList, args);
+	}
+
+/**
+Returns a thread-specific listing corresponding to the type specified as aListId. The structure
+of the returned data depends on the value of aListId, see TListId for details.
+If aListData is not large enough to contain the listings data then
+the necessary buffer size is stored in aDataSize and the function returns
+KErrTooBig. In this case the contents of aListData will not contain useful data.
+
+Note that if the aListData buffer is too small to hold the data then the value
+returned as aDataSize corresponds to the size of the data at that particular
+instant. The size of the data will vary over time, for example the thread list
+will increase and decrease in size as threads are created and destroyed, so
+re-requesting data with a buffer with max length aDataSize will not necessarily
+succeed if a list has increased in size between the two calls.
+
+@see TListId
+
+@param aThreadId thread to return the listing for
+@param aListId member of TListId signifying which type of listing to return
+@param aListData buffer provided by the debug agent in which data can be returned by the debug system.
+@param aDataSize if aListData was not large enough to contain the requested
+       data then the necessary buffer size is stored in aDataSize. If aListData
+       was large enough then the value of aDataSize is the length of aListData
+
+@return KErrNone if data was returned successfully,
+        KErrTooBig if aListData is too small to hold the data,
+	one of the other system-wide error codes
+*/
+inline TInt RSecuritySvrSession::GetList(const TThreadId aThreadId, const TListId aListId, TDes8& aListData, TUint32& aDataSize)
+	{
+	TListDetails info(aListId, EScopeThreadSpecific, aThreadId.Id());
+	TPtr8 infoBuf((TUint8*)&info, sizeof(TListDetails), sizeof(TListDetails));
+	TPtr8 dataSizeBuf((TUint8*)&aDataSize, sizeof(TUint32), sizeof(TUint32));
+	TIpcArgs args(&infoBuf, &aListData, &dataSizeBuf);
+	return SendReceive(EDebugServGetList, args);
+	}
+
+/**
+Returns a process-specific listing corresponding to the type specified as aListId. The structure
+of the returned data depends on the value of aListId, see TListId for details.
+If aListData is not large enough to contain the listings data then
+the necessary buffer size is stored in aDataSize and the function returns
+KErrTooBig. In this case the contents of aListData will not contain useful data.
+
+Note that if the aListData buffer is too small to hold the data then the value
+returned as aDataSize corresponds to the size of the data at that particular
+instant. The size of the data will vary over time, for example the thread list
+will increase and decrease in size as threads are created and destroyed, so
+re-requesting data with a buffer with max length aDataSize will not necessarily
+succeed if a list has increased in size between the two calls.
+
+@see TListId
+
+@param aProcessId process to return the listing for
+@param aListId member of TListId signifying which type of listing to return
+@param aListData buffer provided by the debug agent in which data can be returned by the debug system.
+@param aDataSize if aListData was not large enough to contain the requested
+       data then the necessary buffer size is stored in aDataSize. If aListData
+       was large enough then the value of aDataSize is the length of aListData
+
+@return KErrNone if data was returned successfully,
+        KErrTooBig if aListData is too small to hold the data,
+	one of the other system-wide error codes
+*/
+inline TInt RSecuritySvrSession::GetList(const TProcessId aProcessId, const TListId aListId, TDes8& aListData, TUint32& aDataSize)
+	{
+	TListDetails info(aListId, EScopeProcessSpecific, aProcessId.Id());
+	TPtr8 infoBuf((TUint8*)&info, sizeof(TListDetails), sizeof(TListDetails));
+	TPtr8 dataSizeBuf((TUint8*)&aDataSize, sizeof(TUint32), sizeof(TUint32));
+	TIpcArgs args(&infoBuf, &aListData, &dataSizeBuf);
+	return SendReceive(EDebugServGetList, args);
+	}
+
+/**
+Purpose:
+Step one or more CPU instructions in the specified thread from the current PC.
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must be attached to a process.
+@pre The thread being stepped must be suspended by the Debug Agent.
+
+@param aThreadId the id of the thread which is to be stepped
+@param aNumSteps how many machine-level instructions are to be stepped.
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::Step(const TThreadId aThreadId, const TUint32 aNumSteps)
+	{
+	TPckgBuf<TThreadId> threadIdPckg(aThreadId);
+	TInt res = KErrNone;
+
+	TIpcArgs args(&threadIdPckg,aNumSteps);
+
+	res = SendReceive(EDebugServStep,args);
+
+	return res;
+	}
+
+/**
+Purpose:
+Kill the specified process with the supplied reason. Reason codes are equivalent
+to those in RProcess.Kill().
+
+@pre Debug Agent must be connected to the debug security server
+@pre Debug Agent must be attached to a process.
+
+@param aProcessId the id of the process which is to be killed
+@param aReason The reason to be associated with the ending of this process
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::KillProcess(const TProcessId aProcessId, const TInt aReason)
+	{
+	TPckgBuf<TProcessId> processIdPckg(aProcessId);
+	TInt res = KErrNone;
+
+	TIpcArgs args(&processIdPckg,aReason);
+
+	res = SendReceive(EDebugServKillProcess,args);
+
+	return res;
+	}
+
+/**
+Purpose
+Method to read data from the crash flash
+
+@pre aData buffer to retrieve the data from the crash flash
+@pre aDataSize Size of the data
+
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::ReadCrashLog(const TUint32 aPos, TDes8& aData, const TUint32 aDataSize)
+	{		
+		TIpcArgs args(aPos, &aData, aDataSize);		
+		TInt res = SendReceive(EDebugServReadCrashFlash,args);
+		return res;
+	}
+
+/**
+ * @internalTechnology
+ * @prototype
+ * 
+Purpose:
+Method to write the crash flash config
+
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::WriteCrashConfig(const TUint32 aPos, const TDesC8& aBuffer, TUint32& aSize)
+	{
+		TPtr8 sizePtr((TUint8*)&aSize,4, 4);
+		TIpcArgs args(aPos, &aBuffer, &sizePtr);
+		TInt res = SendReceive(EDebugServWriteCrashFlash, args);
+		return res;
+	}
+/**
+Purpose:
+Method to erase a block in the crash flash
+
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::EraseCrashLog(const TUint32 aPos, const TUint32 aBlockNumber)
+	{	
+		TIpcArgs args(aPos, aBlockNumber);
+		TInt res = SendReceive(EDebugServEraseCrashFlash, args);
+		return res;
+	}
+
+/**
+Purpose:
+Method to erase entire flash partition
+
+@return Any error which may be returned by RSessionBase::SendReceive()
+*/
+inline TInt RSecuritySvrSession::EraseCrashFlashPartition()
+	{
+	TInt res = SendReceive(EDebugServEraseEntireCrashFlash);
+	return res;
+	}
+
+} // end of Debug namespace declaration
+
+#endif // #ifndef __KERNEL_MODE__
+
+#endif // RM_DEBUG_API_H
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/inc/rm_debug_logging.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,83 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Logging macros for use in debug subsystem
+// 
+//
+
+#ifndef RM_DEBUG_LOGGING_H
+#define RM_DEBUG_LOGGING_H
+
+/* Debug messages
+ * 
+ * Debug messages are only generated for debug builds.
+ * 
+ * For kernel mode, use __KTRACE_OPT(KDEBUGGER, Kern::Printf(), 
+ * for user mode use RDebug::Printf(). 
+ * 
+ */
+
+#ifdef _DEBUG
+
+  #ifdef __KERNEL_MODE__
+
+    #include <kernel/kernel.h>
+    #include <nkern/nk_trace.h>
+
+    #define LOG_MSG(args...)			__KTRACE_OPT(KDEBUGGER, Kern::Printf(args))
+	#define LOG_ENTRY()					__KTRACE_OPT(KDEBUGGER, Kern::Printf("+%s", __PRETTY_FUNCTION__))
+	#define LOG_EXIT()					__KTRACE_OPT(KDEBUGGER, Kern::Printf("-%s", __PRETTY_FUNCTION__))
+	#define LOG_ARGS(fmt, args...)		__KTRACE_OPT(KDEBUGGER, Kern::Printf("+%s " fmt, __PRETTY_FUNCTION__, args))
+	#define LOG_RETURN(x)				__KTRACE_OPT(KDEBUGGER, Kern::Printf("Returning %d from [%s]", x, __PRETTY_FUNCTION__)
+
+	// These kept for compatability
+    #define LOG_MSG2( a, b )			__KTRACE_OPT(KDEBUGGER, Kern::Printf( a, b ))
+    #define LOG_MSG3( a, b, c )			__KTRACE_OPT(KDEBUGGER, Kern::Printf( a, b, c ))
+    #define LOG_MSG4( a, b, c, d )		__KTRACE_OPT(KDEBUGGER, Kern::Printf( a, b, c, d ))
+    #define LOG_MSG5( a, b, c, d, e )	__KTRACE_OPT(KDEBUGGER, Kern::Printf( a, b, c, d, e ))
+  #else
+
+    #include <e32debug.h>
+
+    #define LOG_MSG(args...)			RDebug::Printf(args)
+	#define LOG_DES(args...)			RDebug::Print(args) // For wide descriptors
+	#define LOG_ENTRY()					RDebug::Printf("+%s", __PRETTY_FUNCTION__)
+	#define LOG_EXIT()					RDebug::Printf("-%s", __PRETTY_FUNCTION__)
+	#define LOG_ARGS(fmt, args...)		RDebug::Printf("+%s " fmt, __PRETTY_FUNCTION__, args)
+	#define LOG_RETURN(x)				RDebug::Printf("Returning %d from [%s]", x, __PRETTY_FUNCTION__)
+
+    #define LOG_MSG2( a, b )			RDebug::Printf( a, b )
+    #define LOG_MSG3( a, b, c )			RDebug::Printf( a, b, c )
+    #define LOG_MSG4( a, b, c, d )		RDebug::Printf( a, b, c, d )
+    #define LOG_MSG5( a, b, c, d, e )	RDebug::Printf( a, b, c, d, e )
+
+  #endif
+
+#else
+
+	#define LOG_MSG(args...)
+	#define LOG_DES(args...)
+	#define LOG_ENTRY()
+	#define LOG_EXIT()
+	#define LOG_ARGS(fmt, args...)
+	#define LOG_RETURN(x)
+
+	#define LOG_MSG2( a, b )
+	#define LOG_MSG3( a, b, c )
+	#define LOG_MSG4( a, b, c, d )
+	#define LOG_MSG5( a, b, c, d, e )
+
+#endif
+
+#endif //RM_DEBUG_LOGGING_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/src/c_process_pair.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,132 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Provides a helper class for process security management
+// 
+//
+
+#include <e32base.h>
+#include <e32base_private.h>
+
+// Required for logging
+#include <rm_debug_api.h>
+
+#include "c_process_pair.h"
+#include "rm_debug_logging.h"
+
+
+CProcessPair* CProcessPair::NewL(const TDesC& aProcessName, const TProcessId aProcessId)
+	{
+	CProcessPair* self=new (ELeave) CProcessPair();
+	CleanupStack::PushL(self);
+	self->ConstructL(aProcessName, aProcessId);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+void CProcessPair::ConstructL(const TDesC& aProcessName, const TProcessId aProcessId)
+	{
+	//allocate the process name buffer and fill with aProcessName
+	iProcessName = aProcessName.Alloc();
+	if(iProcessName == NULL)
+		User::Leave(KErrNoMemory);
+
+	LOG_MSG2( "CProcessPair::ConstructL() process name: %S", &TPtr8((TUint8*)iProcessName->Ptr(), 2*iProcessName->Length(), 2*iProcessName->Length()) );
+
+	//set process id
+	iProcessId = aProcessId;
+	}
+
+CProcessPair::CProcessPair(): 
+        iProcessName(NULL)
+	{
+	}
+
+CProcessPair::~CProcessPair()
+	{
+	delete iProcessName;
+	}
+
+/**
+Check whether two CProcessPair objects are equal
+
+@param aProcessPair a CProcessPair object to match with this one
+
+@return 0 if process ids and names do not match, non-zero if they do
+*/
+TBool CProcessPair::operator==(const CProcessPair &aProcessPair) const
+	{
+	return Equals(*aProcessPair.iProcessName, aProcessPair.iProcessId);
+	}
+	
+/**
+Check whether this CProcessPair object has these values set
+
+@param aProcessName process name to check
+@param aProcessId process id to check
+
+@return 0 if process ids and names do not match, non-zero if they do
+*/
+TBool CProcessPair::Equals(const TDesC& aProcessName, const TProcessId aProcessId) const
+	{
+	return (ProcessIdMatches(aProcessId) && (ProcessNameMatches(aProcessName)));
+	}
+
+/**
+Check whether the process ids of two objects match
+
+@param aProcessPair a CProcessPair object to compare with this one
+
+@return 0 if process ids do not match, non-zero if they do
+*/
+TBool CProcessPair::ProcessIdMatches(const CProcessPair &aProcessPair) const
+	{
+	return ProcessIdMatches(aProcessPair.iProcessId);
+	}
+
+/**
+Check whether two process ids match
+
+@param aProcessId a process ID to compare with this pair's process ID
+
+@return 0 if process ids do not match, non-zero if they do
+*/
+TBool CProcessPair::ProcessIdMatches(const TProcessId &aProcessId) const
+	{
+	return iProcessId == aProcessId;
+	}
+
+/**
+Check whether the process names of two objects match in-case-sensitively
+
+@param aProcessPair a CProcessPair object to compare with this one
+
+@return 0 if process names do not match, non-zero if they do
+*/
+TBool CProcessPair::ProcessNameMatches(const CProcessPair &aProcessPair) const
+	{
+	return ProcessNameMatches(*aProcessPair.iProcessName);
+	}
+
+/**
+Check whether two strings match in-case-sensitively
+
+@param aProcessName a process name to compare with this pair's process name
+
+@return 0 if process names do not match, non-zero if they do
+*/
+TBool CProcessPair::ProcessNameMatches(const TDesC& aProcessName) const
+	{
+	return iProcessName->CompareF(aProcessName) == 0;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/src/c_security_svr_async.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,154 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Asynchronous security server active object class.
+// 
+//
+
+#include <e32base.h>
+#include <e32base_private.h>
+
+#include "c_security_svr_async.h"
+#include "rm_debug_logging.h"
+
+using namespace Debug;
+
+__ASSERT_COMPILE(_FOFF(TEventInfo, iEventType) == 20); // Checking that adding iActionTaken hasn't resized the class
+
+CSecuritySvrAsync::CSecuritySvrAsync(CSecuritySvrSession* aSession, TProcessId aAgentId)
+	: CActive(CActive::EPriorityStandard),
+	iSession(aSession),
+	iProcessName(NULL),
+	iAgentId(aAgentId)
+	{
+	LOG_MSG2("CSecuritySvrAsync::CSecuritySvrAsync(aAgentId=0x%x)", TUint(aAgentId.Id()));
+	CActiveScheduler::Add(this);
+	}
+
+// returns a CSecuritySvrAsync active object associated with
+// the specified agent and debugged process.
+CSecuritySvrAsync* CSecuritySvrAsync::NewL(CSecuritySvrSession* aSession, const TDesC8& aProcessName, TProcessId aAgentId)
+	{
+	CSecuritySvrAsync* me = new (ELeave) CSecuritySvrAsync(aSession, aAgentId);
+
+	CleanupStack::PushL(me);
+
+	me->ConstructL(aProcessName);
+
+	CleanupStack::Pop(me);
+	LOG_MSG2("CSecuritySvrAsync::NewL() obj addr=0x%x", me);
+	return (me);
+	}
+
+// dtor
+CSecuritySvrAsync::~CSecuritySvrAsync()
+	{
+	LOG_MSG("CSecuritySvrAsync::~CSecuritySvrAsync()");
+
+	// NOTE: the Cancel() function calls DoCancel() which may rely on class members so be careful not
+	// to destroy/close data members before this call if they are needed
+	Cancel();
+	iProcessName.Close();
+	}
+
+// Associates the agent id and process name with the Active Object being constructed
+void CSecuritySvrAsync::ConstructL(const TDesC8& aProcessName)
+	{
+	LOG_MSG("CSecuritySvrAsync::ConstructL()");
+	iProcessName.CreateL(aProcessName.Length());
+	iProcessName.Copy(aProcessName);
+	}
+
+// RunL() completes a previously issued call (currently only GetEvent() completion)
+void CSecuritySvrAsync::RunL()
+	{
+
+	LOG_MSG4("CSecuritySvrAsync::RunL() &iInfo=0x%08x,  iAgentId.Id()=0x%x, iEventType=%d", 
+	        (TUint8*)&iInfo, iAgentId.Id(), iInfo.iEventType);
+    LOG_MSG5(" RunL() : iProcessIdValid=%d, iThreadId=0x%x, iProcessId=0x%x, &iStatus=0x%x",
+            iInfo.iProcessIdValid, TUint(iInfo.iThreadId) , TUint(iInfo.iProcessId), &iStatus );
+    
+	// Something bad happened in the driver
+	User::LeaveIfError(iStatus.Int());
+
+	// Write back the event data to the debug agent.
+	// For compatibility we need to check the size of the buffer that the
+	// client has passed in as the size of TEventInfo will increase over time.
+	// Clients can calculate the required size from the EApiConstantsTEventInfoSize entry 
+	// in the Debug Functionality block but may still pass in buffers which
+	// are smaller than the Debug Security Server's calculation of sizeof(TEventInfo), 
+	// returning KErrTooBig in this case would be
+	// inappropriate as we would break compatibility.
+	TInt dataLengthToReturn = sizeof(TEventInfo);
+	TInt maxLengthClientSide = iMessage.GetDesMaxLengthL(1);
+	if(maxLengthClientSide < dataLengthToReturn)
+		{
+		dataLengthToReturn = maxLengthClientSide;
+		}
+
+
+	TPtr8 data((TUint8*)&iInfo, dataLengthToReturn, dataLengthToReturn);
+	iMessage.WriteL(1, data, 0);
+	iMessage.Complete(KErrNone);
+	}
+
+// Cancels the oustanding GetEvent call. May cope with other async calls in future.
+void CSecuritySvrAsync::DoCancel()
+	{
+	LOG_MSG("CSecuritySvrAsync::DoCancel()");
+	iSession->Server().iKernelDriver.CancelGetEvent(iProcessName,iAgentId.Id());
+
+	iMessage.Complete(KErrCancel);
+	}
+
+// Report any leave to the client if possible.
+TInt CSecuritySvrAsync::RunError(TInt aError)
+	{
+	LOG_MSG2("CSecuritySvrAsync::RunError()=%d", aError);
+	iMessage.Complete(aError);
+
+	return KErrNone;
+	}
+
+/**
+ * Start an asynchronous GetEvent call to the debug driver
+ * and activates this active object. 
+ * If active object already active, completes the message with error KErrInUse
+ * and takes no further action. 
+ */
+void CSecuritySvrAsync::GetEvent(const RMessage2& aMessage)
+	{
+ 	if( !IsActive() )
+ 		{
+		iMessage = aMessage;
+		LOG_MSG4("CSecuritySvrAsync::GetEvent() this = 0x%08x, iInfo=0x%08x, iStatus=0x%08x", this, &iInfo, &iStatus);
+		
+		SetActive();
+		iSession->Server().iKernelDriver.GetEvent(iProcessName,iAgentId.Id(),iStatus,iInfo);
+		}
+	else
+		{
+		LOG_MSG2("CSecuritySvrAsync::GetEvent() this = 0x%08x: ! Warning: ActiveObject is active. Returning with no effect",
+			this );
+		aMessage.Complete( KErrInUse );
+		}
+	}
+
+// Used for identifying which AO is associated with a debugged process
+const TDesC8& CSecuritySvrAsync::ProcessName(void)
+	{
+	return iProcessName;
+	}
+
+// End of file - c_security_svr_async.cpp
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/src/c_security_svr_server.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,685 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Provides the debug security server server implementation.
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#include <e32base.h>
+#include <e32base_private.h>
+#include <rm_debug_api.h>
+#include "c_process_pair.h"
+#include "c_security_svr_session.h"
+#include "c_security_svr_server.h"
+#include "rm_debug_logging.h"
+
+using namespace Debug;
+
+/**
+Server constructor, sessions are created as ESharableSessions, meaning that
+each session will be used by at most one debug agent
+*/
+CSecuritySvrServer::CSecuritySvrServer(CActive::TPriority aActiveObjectPriority)
+	: CServer2(aActiveObjectPriority, ESharableSessions),
+	  iSessionCount(0),
+	  iShutdown()
+	{
+	LOG_MSG("CSecuritySvrServer::CSecuritySvrServer()\n");
+	}
+
+/**
+Standard implementation
+
+@return pointer to new CSecuritySvrServer object
+*/
+CSecuritySvrServer* CSecuritySvrServer::NewLC()
+	{
+	LOG_MSG("CSecuritySvrServer::NewLC()\n");
+
+	CSecuritySvrServer* self=new(ELeave) CSecuritySvrServer(EPriorityStandard);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+/**
+Server destructor, performs cleanup for the server
+*/
+CSecuritySvrServer::~CSecuritySvrServer()
+	{
+	LOG_MSG("CSecuritySvrServer::~CSecuritySvrServer()\n");
+
+	// stop the kernel side driver
+	iKernelDriver.Close();
+	User::FreeLogicalDevice(KDebugDriverName);
+
+	//deallocate both the debug maps
+	iPassiveDebugMap.ResetAndDestroy();
+	iActiveDebugMap.ResetAndDestroy();
+	}
+
+/**
+Starts the server and constructs and starts the servers shutdown timer
+*/
+void CSecuritySvrServer::ConstructL()
+	{
+	LOG_MSG("CSecuritySvrServer::ConstructL()");
+
+	StartL(KSecurityServerName);
+	iShutdown.ConstructL();
+	iShutdown.Start();
+
+	//load the kernel driver
+	TInt err = User::LoadLogicalDevice(KDebugDriverFileName);
+	if(! ((KErrNone == err) || (KErrAlreadyExists == err)))
+		{
+		User::Leave(err);
+		}
+	//create an information object for initialising the driver
+	TRM_DebugDriverInfo driverInfo;
+	driverInfo.iUserLibraryEnd = 0;
+	User::LeaveIfError(iKernelDriver.Open(driverInfo));
+	}
+
+/**
+Creates a new session with the DSS. A version check is done to ensure that an
+up to date version of the DSS is available (according to the DA's needs).
+The device driver is loaded if necessary and a session with the server and a 
+handle to the driver opened.
+
+@param aRequiredVersion the minimal version of the DSS required by the DA
+
+@return a pointer to the new sever session, or NULL if any of the 
+        initialisation process failed
+*/
+CSession2* CSecuritySvrServer::NewSessionL(const TVersion& aRequiredVersion, const RMessage2& aMessage) const
+//
+// Session constructor
+//
+	{
+	LOG_ARGS("version=%d.%d.%d", aRequiredVersion.iMajor, aRequiredVersion.iMinor, aRequiredVersion.iBuild);
+
+	//assert compatible version
+	TVersion currentVersion(KDebugServMajorVersionNumber, KDebugServMinorVersionNumber, KDebugServPatchVersionNumber);
+	if(!User::QueryVersionSupported(currentVersion, aRequiredVersion))
+		{
+		LOG_MSG("Requested version not compatible with this version. Asked for %d.%d.%d but this is %d.%d.%d", aRequiredVersion.iMajor, aRequiredVersion.iMinor, aRequiredVersion.iBuild, KDebugServMajorVersionNumber, KDebugServMinorVersionNumber, KDebugServPatchVersionNumber);
+		User::Leave(KErrNotSupported);
+		}
+	
+	//get the debug agent's process id
+	RThread clientThread;
+	User::LeaveIfError(aMessage.Client(clientThread));
+	CleanupClosePushL(clientThread);
+	RProcess clientProcess;
+	User::LeaveIfError(clientThread.Process(clientProcess));
+	CleanupStack::PopAndDestroy(&clientThread);
+	TProcessId processId = clientProcess.Id();
+	clientProcess.Close();
+
+	//create session
+	LOG_MSG("About to call new(ELeave) CSecuritySvrSession()");
+	CSecuritySvrSession* servSession = new(ELeave) CSecuritySvrSession(processId);
+
+	CleanupStack::PushL(servSession);
+	servSession->ConstructL();
+	CleanupStack::Pop(servSession);
+	return servSession;
+	}
+
+/**
+Manages requests from debug agents to attach to target debug processes
+
+Given the debug agent process ID and the target process name:
+(1) checks whether the pair is already in either of the debug maps, if so
+    then returns KErrAlreadyExists
+(2) if aPassive == ETrue then just add the pair to the passive map and return
+    whatever the return value of the array write was
+(3) if aPassive == EFalse then check whether the target debug process is 
+    already reserved by another debug agent. If it is then return KErrInUse,
+    otherwise add the pair to the active debug map and return the status 
+    value of the array write.
+
+@param aTargetProcessName original FileName of the process to attach to
+@param aDebugAgentProcessId process ID of the debug agent
+@param aPassive ETrue if wish to attach passively, EFalse otherwise
+
+@return KErrNone if successfully attached, otherwise another system wide error
+        code as above
+*/
+TInt CSecuritySvrServer::AttachProcessL(const TDesC& aTargetProcessName, const TProcessId aDebugAgentProcessId, const TBool aPassive)
+	{
+	//store the pair of values
+	LOG_MSG3("CSecuritySvrServer::AttachProcessL() 0x%lx aPassive=%d", aDebugAgentProcessId.Id(), aPassive);
+
+	CProcessPair *processPair = CProcessPair::NewL(aTargetProcessName, aDebugAgentProcessId);
+	if(processPair == NULL)
+		return KErrNoMemory;
+
+	//check whether the pair already exists in the active debug map
+	for(TInt i=0; i<iActiveDebugMap.Count(); i++)
+		{
+        // Note that the equality is of the debug agent id and the proc name
+		if(*processPair == *(iActiveDebugMap[i]))
+			{
+			//process already exists
+			LOG_MSG( "  AttachProcessL() error : KErrAlreadyExists in active map\n" );
+			delete processPair;
+			return KErrAlreadyExists;
+			}
+		}
+
+	//check whether the pair already exists in the passive map
+	for(TInt i=0; i<iPassiveDebugMap.Count(); i++)
+		{
+		if(*processPair == *(iPassiveDebugMap[i]))
+			{
+			//process already exists
+			LOG_MSG( "  AttachProcessL() error : KErrAlreadyExists in passive map\n" );
+			delete processPair;
+			return KErrAlreadyExists;
+			}
+		}
+
+	if(aPassive)
+		{
+		//just add the pair and return
+		TInt err = iPassiveDebugMap.Append(processPair);
+		if(err != KErrNone)
+			{
+			// couldn't add pair for some unknown reason, so delete the pair
+			LOG_MSG2( "  AttachProcessL() error %d appending passive process pair", err );
+			delete processPair;
+			}
+		return err;
+		}
+	else
+		{
+		//check whether the process Id has already been reserved
+		for(TInt i=0; i<iActiveDebugMap.Count(); i++)
+			{
+            // Now check if this is already debugged, but only if its for a particular process.
+            // We can have several entries from AttachAll calls, and its ok to add them
+			if( (!processPair->ProcessNameMatches(_L("*"))) &&
+			    (processPair->ProcessNameMatches(*(iActiveDebugMap[i])) ) )
+				{
+				//process already being debugged
+				LOG_MSG( "  AttachProcessL() error : process already being debugged" );
+				delete processPair;
+				return KErrInUse;
+				}
+			}
+		//try to add the pair. 
+		TInt err = iActiveDebugMap.Append(processPair);
+		if(err != KErrNone)
+			{
+			// couldn't add pair for some unknown reason, so delete the pair
+			LOG_MSG2( "  AttachProcessL() error %d inserting active process pair", err );
+			delete processPair;
+			}
+		return err;
+		}
+	}
+
+/*
+Detach from debugging the specified process
+
+@param aTargetProcessName name of the process to detach from
+@param aDebugAgentProcessId process ID of the debug agent
+
+@return KErrNone if successfully detached, KErrNotFound if an attempt is made
+        to detach from a process which the debug agent hasn't previously attached to
+*/
+TInt CSecuritySvrServer::DetachProcess(const TDesC& aTargetProcessName, const TProcessId aDebugAgentProcessId)
+	{
+    LOG_MSG2( "CSecuritySvrServer::DetachProcess() for agent with id 0x%lx", aDebugAgentProcessId.Id() );
+
+	//check whether the pair is in the active debug map
+	for(TInt i=0; i<iActiveDebugMap.Count(); i++)
+		{
+		if(iActiveDebugMap[i]->Equals(aTargetProcessName, aDebugAgentProcessId))
+			{
+			//remove the process pair from the active debug map
+			delete iActiveDebugMap[i];
+			iActiveDebugMap.Remove(i);
+			return KErrNone;
+			}
+		}
+
+	//check whether the pair is in the passive debug map
+	for(TInt i=0; i<iPassiveDebugMap.Count(); i++)
+		{
+		if(iPassiveDebugMap[i]->Equals(aTargetProcessName, aDebugAgentProcessId))
+			{
+			//remove the process pair from the active debug map
+			delete iPassiveDebugMap[i];
+			iPassiveDebugMap.Remove(i);
+			return KErrNone;
+			}
+		}
+
+	//process pair wasn't in either map
+	return KErrNotFound;
+	}
+
+/**
+Given a debug agent process ID, removes all references to that debug agent
+from the debug maps
+
+@param aMessage message from the debug agent
+
+@return returns KErrNone if successful, another system wide error code otherwise
+*/
+void CSecuritySvrServer::DetachAllProcesses(const TProcessId aDebugAgentProcessId)
+	{
+	//check whether the debug agent process ID is in the active debug map
+	for(TInt i=iActiveDebugMap.Count()-1; i>=0; i--)
+		{
+		if(iActiveDebugMap[i]->ProcessIdMatches(aDebugAgentProcessId))
+			{
+			//remove the process pair from the active debug map
+			delete iActiveDebugMap[i];
+			iActiveDebugMap.Remove(i);
+			}
+		}
+
+	//check whether the debug agent process ID is in the passive debug map
+	for(TInt i=iPassiveDebugMap.Count()-1; i>=0; i--)
+		{
+		if(iPassiveDebugMap[i]->ProcessIdMatches(aDebugAgentProcessId))
+			{
+			//remove the process pair from the passive debug map
+			delete iPassiveDebugMap[i];
+			iPassiveDebugMap.Remove(i);
+			}
+		}
+	}
+
+/*
+Check whether the specified debug agent is attaced to the specfied target
+process.
+
+@param aTargetThreadId thread ID of a thread in the target process
+@param aMessage a message which originates with the debug agent
+@param aPassive if EFalse then checks whether the debug agent is the active
+       debugger of the target process. If ETrue then checks whether the debug
+       agent is attached to the target process, irrespective of whether it is
+       attached passively or actively
+
+@return ETrue if attached, EFalse otherwise
+*/
+TBool CSecuritySvrServer::CheckAttached(const TThreadId aTargetThreadId, const RMessage2& aMessage, const TBool aPassive)
+	{
+	
+	//get a handle to the target thread
+	RThread targetThread;
+	TInt err = targetThread.Open(aTargetThreadId);
+	if(err != KErrNone)
+		{
+		return EFalse;
+		}
+
+	//get a handle to the target process
+	RProcess targetProcess;
+	err = targetThread.Process(targetProcess);
+	//finshed with the thread handle so close it
+	targetThread.Close();
+	if(err != KErrNone)
+		return EFalse;
+
+	//get the target process' file name
+	TFileName targetFileName = targetProcess.FileName();
+
+	// Tamperproofing. Ensure that the debug agent really has a superset
+	// of the target process PlatSec capabilities, as authorised
+	// by an OEM Debug Token (if any)
+
+	TSecurityInfo targetSecInfo(targetProcess);
+
+	// Now compare the capabilities, to ensure the DebugAgent has been authorised with
+	// sufficient capabilities from its OEM Debug token
+	CSecuritySvrSession* session = (CSecuritySvrSession*)aMessage.Session();
+
+	// Presume we need to check the target process is debuggable unless a valid OEM Debug token in effect?
+	if (!OEMTokenPermitsDebugL(session->GetOEMDebugCapabilities(), targetSecInfo.iCaps) )
+		{
+		// No debug token therefore check if the process is debuggable
+		err = iKernelDriver.IsDebuggable(targetProcess.Id());
+		}
+
+	//finished with the process handle so close it
+	targetProcess.Close();
+
+	if (err != KErrNone)
+	{
+		// The process was not marked as debuggable by the loader, and the OEM
+		// debug token did not override the lack of a debuggable bit.
+		// The process was not marked as debuggable by the loader
+		return EFalse;
+	}
+
+	return CheckAttachedProcess(targetFileName, aMessage, aPassive);
+	}
+
+/*
+Check whether the specified debug agent is attaced to the specfied target
+process.
+
+@param aTargetProcessId process ID of the target process
+@param aMessage a message which originates with the debug agent
+@param aPassive if EFalse then checks whether the debug agent is the active
+       debugger of the target process. If ETrue then checks whether the debug
+       agent is attached to the target process, irrespective of whether it is
+       attached passively or actively
+
+@return ETrue if attached, EFalse otherwise
+*/
+TBool CSecuritySvrServer::CheckAttached(const TProcessId aTargetProcessId, const RMessage2& aMessage, const TBool aPassive)
+	{
+	//get a handle to the target process
+	RProcess targetProcess;
+	TInt err =targetProcess.Open(aTargetProcessId);
+	if(err != KErrNone)
+		{
+		return EFalse;
+		}
+
+	//get the target process' file name
+	TFileName targetFileName = targetProcess.FileName();
+
+	// Tamperproofing. Ensure that the debug agent really has a superset
+	// of the target process PlatSec capabilities, as authorised
+	// by an OEM Debug Token (if any)
+
+	TSecurityInfo targetSecInfo(targetProcess);
+
+	// Now compare the capabilities, to ensure the DebugAgent has been authorised with
+	// sufficient capabilities from its OEM Debug token
+	CSecuritySvrSession* session = (CSecuritySvrSession*)aMessage.Session();
+
+	// Presume we need to check the target process is debuggable unless a valid OEM Debug token in effect?
+	if ( !OEMTokenPermitsDebugL(session->GetOEMDebugCapabilities(), targetSecInfo.iCaps) )
+		{
+		// No debug token therefore check if the process is debuggable
+		err = iKernelDriver.IsDebuggable(targetProcess.Id());
+		}
+
+	//finished with the process handle so close it
+	targetProcess.Close();
+
+	if (err != KErrNone)
+	{
+		return EFalse;
+	}
+
+	return CheckAttachedProcess(targetFileName, aMessage, aPassive);
+	}
+
+/*
+Check whether the specified debug agent is attaced to the specfied target
+process.
+
+@param aTargetProcessName 
+@param aMessage a message which originates with the debug agent
+
+@return ETrue if attached, EFalse otherwise
+*/
+TBool CSecuritySvrServer::CheckAttachedProcess(const TDesC& aTargetProcessName, const RMessage2& aMessage, const TBool aPassive) const
+	{
+	//get the debug agent's process id
+	TProcessId clientProcessId = 0;
+	TInt err = GetProcessIdFromMessage(clientProcessId, aMessage);
+	if(err != KErrNone)
+		return EFalse;
+
+	//check permissions
+	if(aPassive)
+		return IsDebugger(aTargetProcessName, clientProcessId);
+	else
+		return IsActiveDebugger(aTargetProcessName, clientProcessId);
+	}
+
+/**
+Tests whether the debug agent is attached actively to the target debug process
+
+@param aTargetProcessName target debug process' FileName
+@param aDebugAgentProcessId process ID of a debug agent
+
+@return ETrue if the specified debug agent is actively attached to the 
+        specified target debug process, EFalse otherwise
+*/
+TBool CSecuritySvrServer::IsActiveDebugger(const TDesC& aTargetProcessName, const TProcessId aDebugAgentProcessId) const
+	{
+	//check whether the pair is in the active debug map
+	for(TInt i=0; i<iActiveDebugMap.Count(); i++)
+		{
+		// If both match, which can include aTargetProcessName being "*"
+		if(iActiveDebugMap[i]->Equals(aTargetProcessName, aDebugAgentProcessId))
+			{
+			LOG_MSG2( "CSecuritySvrServer::IsActiveDebugger() for agent id 0x%lx matches name and pid", 
+					aDebugAgentProcessId.Id() );			
+			return ETrue;
+			}
+		// if the pid matches and the name in the map is "*", indicating that 
+		// this is an attach all agent, and thus debugging 
+		if( iActiveDebugMap[i]->ProcessIdMatches(aDebugAgentProcessId) &&
+			iActiveDebugMap[i]->ProcessNameMatches(_L("*")) )
+			{
+			LOG_MSG2( "CSecuritySvrServer::IsActiveDebugger() for AttachAll agent id 0x%lx", 
+				aDebugAgentProcessId.Id() );
+			return ETrue;
+			}
+		}
+	//not found so return false
+	return EFalse;
+	}
+
+/**
+Tests whether the target process is being debugged
+
+@param aTargetProcessName target process' FileName
+@param aPassive indicates whether to check for the process being actively debugged,
+or passively debugged
+
+@return ETrue if the specified target process is being debugged,
+        EFalse otherwise
+*/
+TBool CSecuritySvrServer::IsDebugged(const TDesC& aTargetProcessName, const TBool aPassive) const
+	{
+	//get a reference to the appropriate list
+	const RPointerArray<CProcessPair>& map = (aPassive) ? iPassiveDebugMap : iActiveDebugMap;
+
+	//iterate through the map trying to match the aTargetProcessName
+	for(TInt i=0; i<map.Count(); i++)
+		{
+		if(map[i]->ProcessNameMatches(aTargetProcessName))
+			{
+			return ETrue;
+			}
+		}
+	return EFalse;
+	}
+
+/**
+Tests whether the debug agent is attached to the target debug process
+
+@param aTargetProcessName target debug process' FileName
+@param aDebugAgentProcessId process ID of a debug agent
+
+@return ETrue if the specified debug agent is attached to the 
+        specified target debug process (regardless of whether it is attached
+	passively or actively), EFalse otherwise
+*/
+TBool CSecuritySvrServer::IsDebugger(const TDesC& aTargetProcessName, const TProcessId aDebugAgentProcessId) const
+	{
+	//check whether the pair is in the active debug map
+	if(IsActiveDebugger(aTargetProcessName, aDebugAgentProcessId))
+		return ETrue; 
+
+	//check whether the pair is in the passive debug map
+	for(TInt i=0; i<iPassiveDebugMap.Count(); i++)
+		{
+		if(iPassiveDebugMap[i]->Equals(aTargetProcessName, aDebugAgentProcessId))
+			return ETrue;
+		}
+	//not found so return false
+	return EFalse;
+	}
+
+/**
+Decrements the server's count of how many sessions are connected to it and
+starts the shutdown timer if there are no sessions connected
+*/
+void CSecuritySvrServer::SessionClosed()
+	{
+	if(--iSessionCount < 1)
+		{
+		iShutdown.Start();
+		}
+	}
+
+/**
+Increments the servers count of how many sessions are connected to it and
+cancels the shutdown timer if it is running
+*/
+void CSecuritySvrServer::SessionOpened()
+	{
+	iSessionCount++;
+	iShutdown.Cancel();
+	}
+
+/** 
+  Get the process id of the thread which sent aMessage
+  @param aProcessId process id of the thread which sent aMessage
+  @param aMessage message object sent by thread 
+
+  @return KErrNone if aProcessId could be set, or one of the system wide error codes if not
+  */
+TInt CSecuritySvrServer::GetProcessIdFromMessage(TProcessId& aProcessId, const RMessage2& aMessage) const
+	{
+	//get the debug agent's thread
+	RThread clientThread;
+	TInt err = aMessage.Client(clientThread);
+	if(err != KErrNone)
+		{
+		return err;
+		}
+
+	//get the debug agent's process
+	RProcess clientProcess;
+	err = clientThread.Process(clientProcess);
+
+	//finished with the thread handle so close it
+	clientThread.Close();
+
+	//check if there was an error from getting the process
+	if(err != KErrNone)
+		{
+		return err;
+		}
+
+	//get the debug agent's process id
+	aProcessId = clientProcess.Id();
+
+	//finished with the process handle so close it
+	clientProcess.Close();
+
+	return KErrNone;
+	}
+
+/**
+  Helper function which determines whether the capabilities of the
+  OEM Token are sufficient to permit debug of an application.
+
+  Normally, we use the AllFiles capability as a proxy which
+  means a Debug Agent can debug non-debuggable executables,
+  provided it has a superset of the capabilities of the executable
+  to be debugged.
+ 
+  However, this causes the problem that all OEM Debug Tokens implicitly
+  give the power to debug an AllFiles executable, even if all that
+  is really needed is the power to debug an app with no capabilities,
+  or capabilities other than AllFiles.
+  
+  To address this, we treat the AllFiles capability in a special way.
+  The AllFiles capability in a token is taken to mean that an OEM has
+  signed the token, and hence can debug other executables. But this does
+  not inclue the ability to debug an AllFiles executable. To debug an AllFiles
+  executable, the token must also have TCB.
+
+  @param aTokenCaps - The PlatSec capabilities of a token
+  @param aTargetCaps - The PlatSec capabilities of a target app to be debugged
+
+  @return ETrue if authorised for debugging, EFalse otherwise.
+
+  @leave Any system error code.
+  */
+TBool CSecuritySvrServer::OEMTokenPermitsDebugL(const TCapabilitySet aTokenCaps, const TCapabilitySet aTargetCaps)
+	{	
+	LOG_MSG("CSecuritySvrSession::OEMTokenPermitsDebugL\n");
+
+	// Is the token valid - i.e. does it have AllFiles.
+	if ( !aTokenCaps.HasCapability(ECapabilityAllFiles) )
+		{
+		// Token is not valid, as it does not have AllFiles.
+		LOG_MSG("CSecuritySvrSession::OEMTokenPermitsDebugL - Token does not have AllFiles\n");
+			
+		return EFalse;
+		}
+
+	// Token MUST have a strict superset of capabilities
+	if ( !aTokenCaps.HasCapabilities(aTargetCaps) )
+		{
+		// Token does not have at least all the capabilities of the target
+		LOG_MSG("CSecuritySvrSession::OEMTokenPermitsDebugL - Token does not have superset of target capabilities\n");
+
+		return EFalse;
+		}
+
+	// Special case: If the target has AllFiles, the Token must have TCB
+	if ( aTargetCaps.HasCapability(ECapabilityAllFiles) )
+		{
+		// Target has AllFiles, so does the Token have TCB?
+		if ( !aTokenCaps.HasCapability(ECapabilityTCB) )
+			{
+			// Token does not have TCB.
+			LOG_MSG("CSecuritySvrSession::OEMTokenPermitsDebugL - Token does not have TCB when target has AllFiles\n");
+	
+			return EFalse;
+			}
+		}
+
+	// If we have passed all the above tests, the token permits debug
+	return ETrue;
+	}
+
+/**
+ * This looks at a debug tokens capability and ensures it is sufficient 
+ * to provide access to the flash partition
+ * @param aTokenCaps Capabilties of the Token
+ * @return TBool Whether or not flash access is permitted
+ */
+TBool CSecuritySvrServer::OEMTokenPermitsFlashAccessL(const TCapabilitySet aTokenCaps)
+	{	
+	//Must have TCB to access flash
+	return aTokenCaps.HasCapability(ECapabilityTCB);
+	}
+
+//eof
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/src/c_security_svr_session.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,2653 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Provides the debug security server session implementation.
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+// Needed so we get the text strings for capabilities
+#define __INCLUDE_CAPABILITY_NAMES__
+
+#include <e32std.h>
+#include <e32std_private.h>
+#include <e32btrace.h>
+#include <d32btrace.h>
+#include <e32base.h>
+#include <e32base_private.h>
+#include <e32uid.h>
+#include <f32file.h>
+#include <e32capability.h>
+#include <rm_debug_api.h>
+
+// required for direct parsing of e32image/tromimage headers
+#include <f32image.h>
+#include <e32rom.h>
+
+//added for direct access to media driver
+#include <partitions.h>
+#include <ftlcontrolio.h>
+
+#include "c_security_svr_session.h"
+#include "c_security_svr_server.h"
+#include "c_security_svr_async.h"
+#include "rm_debug_logging.h"
+#ifdef _DEBUG
+#include "low_mem_requests.h"
+#endif
+
+using namespace Debug;
+
+CSecuritySvrSession::CSecuritySvrSession(const TProcessId& aDebugAgentProcessId)
+	: iDebugAgentProcessId(aDebugAgentProcessId),
+	  iServerNotified(EFalse),
+	  iCrashConnected(EFalse)
+	{
+	// Ensure that this debug agent has no target capability override
+	// by default
+	iOEMDebugCapabilities.SetEmpty();
+	}
+
+void CSecuritySvrSession::ServiceError(const RMessage2 &aMessage, TInt aError)
+	{
+	LOG_MSG2("CSecuritySvrSession::ServiceError(), aError: %d\n", aError);
+
+	//insert ending heap markers
+	HeapWatcher(aMessage.Function(), EFalse);
+
+	aMessage.Complete(aError);
+	}
+
+/**
+Called by the client/server framework as part of session creation.
+
+Notifies the server that a session is being created
+*/
+void CSecuritySvrSession::CreateL()
+	{
+	LOG_MSG("CSecuritySvrSession::CreateL()\n");
+
+	//notify the server that the session has been opened
+	Server().SessionOpened();
+	iServerNotified = ETrue;
+	}
+
+/**
+  Returns a reference to the DSS
+
+  @return a reference to the DSS
+  */
+CSecuritySvrServer& CSecuritySvrSession::Server() const
+    {
+    return *static_cast<CSecuritySvrServer*>(const_cast<CServer2*>(CSession2::Server()));
+    }
+
+/**
+Session destructor. Performs necessary cleanup and notifies the server that the
+session is being closed
+*/
+CSecuritySvrSession::~CSecuritySvrSession()
+	{
+	LOG_MSG("CSecuritySvrSession::~CSecuritySvrSession!()\n");
+
+	// Cancel any outstanding async objects.
+	iAsyncHandlers.ResetAndDestroy();
+		
+	// Inform the device driver of the agent detach.
+	Server().iKernelDriver.DetachAgent(iDebugAgentProcessId.Id());
+
+	LOG_MSG( "CSecuritySvrSession::~CSecuritySvrSession() : -> securityServer.DetachAllProcesses()\n" );
+	Server().DetachAllProcesses(iDebugAgentProcessId);
+
+	//notify the server that the session has closed
+	if(iServerNotified)
+		{
+		Server().SessionClosed();
+		}
+	}
+
+void CSecuritySvrSession::ConstructL()
+	{
+	// nothing to do
+	}
+
+/**
+  Used to insert heap checking markers.
+
+  @param aFunction The function that heap markers should be added for
+  @param aEntry if ETrue indicates that heap checking is starting, if EFalse
+  that heap checking is ending.
+  */
+void CSecuritySvrSession::HeapWatcher(const TUint32 aFunction, const TBool aEntry) const
+	{
+	switch(aFunction)
+		{
+		case EDebugServAttachExecutable:
+			return;
+		case EDebugServDetachExecutable:
+			return;
+		case EDebugServSuspendThread:
+			return;
+		case EDebugServResumeThread:
+			return;
+		case EDebugServAttachAll:
+			return;
+		case EDebugServDetachAll:
+			return;
+// used for out-of-memory testing in debug mode
+#ifdef _DEBUG
+		// start heap marking in on entry, do nothing on exit
+		case EDebugServMarkHeap:
+			{
+			if(aEntry)
+				{
+				__UHEAP_MARK;
+				}
+			return;
+			}
+		// stop heap marking on exit, do nothing on entry
+		case EDebugServMarkEnd:
+			{
+			if(!aEntry)
+				{
+				__UHEAP_MARKEND;
+				}
+			return;
+			}
+#endif
+		default:
+			if(aEntry)
+				{
+				__UHEAP_MARK;
+				}
+			else
+				{
+				__UHEAP_MARKEND;
+				}
+			return;
+		}
+	}
+
+void CSecuritySvrSession::ServiceL(const RMessage2& aMessage)
+//
+// Session service handler
+//
+	{
+	//insert starting heap markers
+	HeapWatcher(aMessage.Function(), ETrue);
+
+	switch(aMessage.Function())
+		{
+		case EDebugServResumeThread:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServResumeThread\n" );
+			ResumeThreadL(aMessage);
+			break;
+
+		case EDebugServSuspendThread:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServSuspendThread\n" );
+			SuspendThreadL(aMessage);
+			break;
+
+		case EDebugServReadMemory:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServReadMemory\n" );
+			ReadMemoryL(aMessage);
+			break;
+
+		case EDebugServWriteMemory:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServWriteMemory\n" );
+			WriteMemoryL(aMessage);
+			break;
+
+		case EDebugServSetBreak:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServSetBreak\n" );
+			SetBreakL(aMessage);
+			break;
+
+		case EDebugServClearBreak:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServClearBreak\n" );
+			ClearBreakL(aMessage);
+			break;
+
+		case EDebugServModifyBreak:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServModifyBreak\n" );
+			ModifyBreakL(aMessage);
+			break;
+
+		case EDebugServModifyProcessBreak:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServModifyProcessBreak\n" );
+			ModifyProcessBreakL(aMessage);
+			break;
+
+		case EDebugServBreakInfo:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServBreakInfo\n" );
+			BreakInfoL(aMessage);
+			break;
+
+		case EDebugServReadRegisters:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServReadRegisters\n" );
+			ReadRegistersL(aMessage);
+			break;
+
+		case EDebugServWriteRegisters:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServWriteRegisters\n" );
+			WriteRegistersL(aMessage);
+			break;
+
+		case EDebugServGetEvent:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServGetEvent\n" );
+			GetEventL(aMessage);
+			break;
+
+		case EDebugServCancelGetEvent:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServCancelGetEvent\n" );
+			CancelGetEventL(aMessage);
+			break;
+
+		case EDebugServAttachExecutable:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServAttachExecutable\n" );
+			AttachProcessL(aMessage);
+			break;
+
+		case EDebugServDetachExecutable:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServDetachExecutable\n" );
+			DetachProcessL(aMessage);
+			break;
+
+		case EDebugServAttachAll:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServAttachAll\n" );
+			AttachAllL(aMessage);
+			break;
+
+		case EDebugServDetachAll:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServDetachAll\n" );
+			DetachAllL(aMessage);
+			break;			
+			
+		case EDebugServGetDebugFunctionalityBufSize:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServGetDebugFunctionalityBufSize\n" );
+			GetDebugFunctionalityBufSizeL(aMessage);
+			break;
+
+		case EDebugServGetDebugFunctionality:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServGetDebugFunctionality\n" );
+			GetDebugFunctionalityL(aMessage);
+			break;
+
+		case EDebugServSetEventAction:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServSetEventAction\n" );
+			SetEventActionL(aMessage);
+			break;
+
+		case EDebugServGetList:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServGetList\n" );
+			GetListL(aMessage);
+			break;
+
+		case EDebugServStep:
+			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServStep\n");
+			StepL(aMessage);
+			break;
+
+		case EDebugServSetProcessBreak:
+			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServSetProcessBreak\n");
+			SetProcessBreakL(aMessage);
+			break;
+		
+		case EDebugServProcessBreakInfo:
+			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServProcessBreakInfo\n");
+			ProcessBreakInfoL(aMessage);
+			break;
+
+		case EDebugServKillProcess:
+			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServKillProcess\n");
+			KillProcessL(aMessage);
+			break;
+
+#ifdef _DEBUG
+		case EDebugServMarkHeap:
+			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServMarkHeap\n");
+			// all taken care of in HeapWatcher
+			aMessage.Complete(KErrNone);
+			break;
+
+		case EDebugServMarkEnd:
+			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServMarkEnd\n");
+			// all taken care of in HeapWatcher
+			aMessage.Complete(KErrNone);
+			break;
+
+		case EDebugServFailAlloc:
+			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServFailAlloc\n");
+			DoFailAlloc(aMessage);
+			break;
+#endif
+		case EDebugServReadCrashFlash:
+			ReadCrashLogL(aMessage);
+			break;		
+		case EDebugServWriteCrashFlash:
+			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServWriteCrashFlash\n");
+			WriteCrashConfigL(aMessage);
+			break;
+		case EDebugServEraseCrashFlash:
+			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServEraseCrashFlash\n");
+			EraseCrashLogL(aMessage);
+			break;
+		case EDebugServEraseEntireCrashFlash:
+			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServEraseEntireCrashFlash\n");
+			EraseEntireCrashLogL(aMessage);
+			break;
+		default:
+			LOG_MSG( "CSecuritySvrSession::ServiceL() Unknown request, calling User::Leave(KErrNotSupported);\n" );
+			User::Leave(KErrNotSupported);
+			break;
+		}
+
+	//insert ending heap markers
+	HeapWatcher(aMessage.Function(), EFalse);
+	
+	LOG_EXIT();
+	}
+
+#ifdef _DEBUG
+/**
+  Used to control heap failure in debug mode.
+  @param aMessage If aMessage.Int0 is non-zero then heap will be set to fail on that allocation.
+  If aMessage.Int0 is zero then the heap failure count is reset
+  */
+void CSecuritySvrSession::DoFailAlloc(const RMessage2& aMessage)
+	{
+	TInt count = aMessage.Int0();
+	if(count == 0)
+		{
+		__UHEAP_RESET;
+		}
+	else
+		{
+		__UHEAP_FAILNEXT(count);
+		}
+	aMessage.Complete(KErrNone);
+	}
+#endif
+
+/**
+Suspends execution of the specified thread.
+
+@param aMessage contains an integer representation of the target thread's
+       thread ID at offset 0.
+
+@leave KErrPermissionDenied if security check fails or KErrArgument if the
+       thread does not exist
+*/
+void CSecuritySvrSession::SuspendThreadL(const RMessage2& aMessage)
+	{
+
+	LOG_MSG( "CSecuritySvrSession::SuspendThreadL()\n" );
+
+	//get thread ID
+	TThreadId threadId = ReadTThreadIdL(aMessage, 0);
+	//check attached
+	CheckAttachedL(threadId, aMessage, EFalse);
+
+	//security check passed so can perform actions
+	User::LeaveIfError(Server().iKernelDriver.SuspendThread(threadId));
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+Resumes execution of the specified thread.
+
+@param aMessage contains an integer representation of the target thread's
+       thread ID at offset 0.
+
+@leave KErrPermissionDenied if security check fails or KErrArgument if the
+       thread does not exist
+*/
+void CSecuritySvrSession::ResumeThreadL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::ResumeThreadL()\n" );
+
+	//get thread ID
+	TThreadId threadId = ReadTThreadIdL(aMessage, 0);
+
+	//check attached
+	CheckAttachedL(threadId, aMessage, EFalse);
+	
+	//security check passed so can perform actions
+	TInt err = Server().iKernelDriver.ResumeThread(threadId);
+	aMessage.Complete(err);
+	}
+
+void CSecuritySvrSession::GetDebugFunctionalityBufSizeL(const RMessage2& aMessage)
+//
+// Retrieve size of functionality data buffer in bytes which must be allocated
+// by the client
+//
+	{
+	LOG_MSG( "CSecuritySvrSession::GetDebugFunctionalityBufSizeL()\n" );
+
+	TUint32 result = 0;
+	// Get Buffer size from the kernel driver
+	User::LeaveIfError(Server().iKernelDriver.GetDebugFunctionalityBufSize(result));
+
+	TPtr8 stuff((TUint8*)&result,4, 4);
+
+	aMessage.WriteL(0,stuff);
+
+	aMessage.Complete(KErrNone);
+	}
+
+void CSecuritySvrSession::GetDebugFunctionalityL(const RMessage2& aMessage)
+//
+// Retrieve the functionality data and place it in a buffer
+// allocated by the client.
+//
+	{
+	LOG_MSG( "CSecuritySvrSession::GetDebugFunctionalityL()\n" );
+
+	TUint32 dfsize = 0;
+
+	// Get Buffer size from the kernel driver
+	User::LeaveIfError(Server().iKernelDriver.GetDebugFunctionalityBufSize(dfsize));
+
+	// Allocate space for the functionality data
+	HBufC8* dftext = HBufC8::NewLC(dfsize);
+
+	const TPtr8& dfPtr = dftext->Des();
+
+	// Extract said data from the device driver
+	User::LeaveIfError(Server().iKernelDriver.GetDebugFunctionality((TDes8&)dfPtr));
+
+	// Return data to client
+	aMessage.WriteL(0,dfPtr);
+
+	// Free buffer
+	CleanupStack::PopAndDestroy(dftext);
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+Reads memory from a specified thread using the passed parameters. The user 
+should ensure that the TPtr8 that is passed in has size greater than or equal
+to the size of the memory that is trying to be read.
+
+@param aMessage The RMessage2 object should be constructed as follows:
+    * aMessage.Int0() is the thread ID of the target debug app
+    * aMessage.Ptr1() is a TMemoryInfo object which contains the following:
+        * the address of the memory to be read from the target debug thread
+        * the size of the memory block to be read from the target debug thread
+	* the access size to use
+	* the endianess to interpret the data as
+    * aMessage.Ptr2() is the address of the buffer in the debug agent thread 
+      that the data from the target debug app should be written into 
+
+@leave KErrPermissionDenied if client is not attached to the target
+       thread's process,
+       KErrNoMemory if memory could not be allocated,
+       KErrArgument if there are problems with the aMessage object,
+       KErrBadHandle if the thread represented by aMessage.Ptr0() is invalid,
+       an error value from CSecuritySvrSession::ValidateMemoryInfo if checking
+       the memory attributes failed,
+       or another of the system wide error codes
+*/
+void CSecuritySvrSession::ReadMemoryL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::ReadMemoryL()\n" );
+
+	//get debug app thread ID
+	TThreadId threadId = ReadTThreadIdL(aMessage, 0);
+
+	CheckAttachedL(threadId, aMessage, ETrue);
+
+	//create and initialise the memory info object
+	TMemoryInfo targetMemory;
+	TPtr8 targetMemoryPtr( (TUint8 *)&targetMemory, sizeof(TMemoryInfo) );
+
+	aMessage.ReadL(1,targetMemoryPtr);
+
+	//check memory info is acceptable
+	ValidateMemoryInfoL(threadId, targetMemory, ETrue);
+
+	RBuf8 data;
+	data.CreateL(targetMemory.iSize);
+	data.CleanupClosePushL();
+
+	//fill buffer with data from target debug thread
+	User::LeaveIfError(Server().iKernelDriver.ReadMemory(threadId, targetMemory.iAddress, targetMemory.iSize, data));
+
+	//attempt to write the data from the target debug thread back to the agent
+	aMessage.WriteL(2, data);
+
+	//delete temporary buffer
+	CleanupStack::PopAndDestroy(&data);
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+Writes memory to a specified thread using the passed parameters. 
+
+@param aMessage The RMessage2 object should be constructed as follows:
+    * aMessage.Ptr0() is the thread ID of the target debug app
+    * aMessage.Ptr1() is a TMemoryInfo object which contains the following:
+        * the address of the memory to be written to the target debug thread
+        * the size of the memory block to be written to the target debug thread
+	* the access size to use
+	* the endianess to interpret the data as
+    * aMessage.Ptr2() is the address of the buffer in the debug agent thread 
+      that the data to write to the target debug app should be read from
+
+@leave KErrPermissionDenied if client is not attached (actively) to the target
+       thread's process,
+       KErrNoMemory if memory could not be allocated,
+       KErrArgument if there are problems with the aMessage object,
+       KErrBadHandle if the thread represented by aMessage.Ptr0() is invalid,
+       an error value from CSecuritySvrSession::ValidateMemoryInfo if checking
+       the memory attributes failed,
+       or another of the system wide error codes
+*/
+void CSecuritySvrSession::WriteMemoryL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::WriteMemoryL()\n" );
+
+	//get debug app thread ID
+	TThreadId threadId = ReadTThreadIdL(aMessage, 0);
+
+	CheckAttachedL(threadId, aMessage, EFalse);
+
+	//create and initialise the memory info object
+	TMemoryInfo targetMemory;
+	TPtr8 targetMemoryPtr( (TUint8 *)&targetMemory, sizeof(TMemoryInfo) );
+
+	aMessage.ReadL(1,targetMemoryPtr);
+
+	//check memory info is acceptable
+	ValidateMemoryInfoL(threadId, targetMemory, EFalse);
+
+	//create temporary buffer and read data from client
+	RBuf8 data;
+	data.CreateL(targetMemory.iSize);
+	data.CleanupClosePushL();
+	
+	aMessage.ReadL(2, data);
+
+	// what about telling the driver about endianess/access size?
+	User::LeaveIfError(Server().iKernelDriver.WriteMemory(threadId, targetMemory.iAddress, targetMemory.iSize, data));
+
+	//free temporary buffer
+	CleanupStack::PopAndDestroy(&data);
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+@internalTechnology
+
+Notes: This call is used to set a thread specific breakpoint. Its input arguments
+are the thread id, address and architecture type of the breakpoint. It returns success
+or failure, and if successful, it sets the TBreakId in the Debug Agent to the 
+breakpoint id by which it can be referenced in future calls to ModifyBreak,ClearBreak and
+BreakInfo.
+
+@param aMessage.Ptr0() - aThreadId is thread id of the target debug process
+@param aMessage.Ptr1() - Address of a TBreakInfo in the Debug Agent
+@param aMessage.Ptr2() - Address of a TBreakId in the Debug Agent
+@leave KErrPermissionDenied if the security check fails.
+ KErrAlreadyExists if there is a breakpoint overlapping the desired address.
+ KErrNotSupported if the architecture type is unrecognised.
+ KErrNoMemory if there is no more memory to complete the operation.
+ KErrArgument if the breakpoint address alignment is unsuitable for the requested
+ breakpoint.
+ KErrOverflow if there are too many breakpoints set.
+*/
+void CSecuritySvrSession::SetBreakL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::SetBreakL!()\n" );
+
+	//get debug app thread ID
+	TThreadId threadId = ReadTThreadIdL(aMessage, 0);
+
+	//check that the agent has attached to the target process
+	CheckAttachedL(threadId, aMessage, EFalse);
+
+	//create and initialise the break info object
+	TBreakInfo breakInfo;
+	TPtr8 breakInfoPtr( (TUint8 *)&breakInfo, sizeof(TBreakInfo) );
+
+	aMessage.ReadL(1,breakInfoPtr);
+
+	LOG_MSG4( "CSecuritySvrSession::SetBreakL, threadId=0x%lx, addr=0x%x, mode=%d", 
+			threadId.Id(), breakInfo.iAddress, breakInfo.iArchitectureMode);
+			
+	//set break in target app
+	TBreakId breakId = 0;
+	User::LeaveIfError(Server().iKernelDriver.SetBreak(breakId, threadId, breakInfo.iAddress, breakInfo.iArchitectureMode));
+
+	//attempt to write the break id back to the debug agent
+	WriteDataL(aMessage, 2, &breakId, sizeof(breakId));
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+Clears a breakpoint previously set by a SetBreak() call.
+
+@param aMessage.Int0() - TBreakId of the breakpoint to be removed.
+*/
+void CSecuritySvrSession::ClearBreakL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::ClearBreakL()\n" );
+
+	const TInt breakId = aMessage.Int0();
+
+	// Check that the breakpoint exists
+	TUint64 objectId;
+	TUint32 address;
+	TArchitectureMode mode;
+	TBool threadSpecific = EFalse;
+
+	User::LeaveIfError(Server().iKernelDriver.BreakInfo(breakId,objectId,address,mode,threadSpecific));
+
+	if(threadSpecific)
+		{
+		// Check that the debug agent is attached to the thread for which the
+		// breakpoint is currently set.
+		LOG_MSG4( "CSecuritySvrSession::ClearBreakL( brkId=%d), addr=0x%x, tId=0x%x", 
+			breakId, address, I64LOW(objectId) );		
+		CheckAttachedL(TThreadId(objectId), aMessage, EFalse);		
+		}
+	else
+		{
+		// Check that the debug agent is attached to the process for which the
+		// breakpoint is currently set.
+		LOG_MSG4( "CSecuritySvrSession::ClearBreakL( brkId=%d), addr=0x%x, pId=0x%x", 
+			breakId, address, I64LOW(objectId) );		
+		CheckAttachedL(TProcessId(objectId), aMessage, EFalse);
+		}
+
+	// Finally clear the breakpoint
+	User::LeaveIfError(Server().iKernelDriver.ClearBreak(breakId));
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+@param aMessage.Int0() - Breakpoint Id of interest
+@param aMessage.Ptr1() - Address in Debug Agent to place threadId of the breakpoint
+@param aMessage.Ptr2() - Address in Debug Agent to place address of the breakpoint
+@param aMessage.Ptr3() - Address in Debug Agent to place the architecture mode of the breakpoint
+@leave Any error which may be returned by RSessionBase::SendReceive()
+*/
+void CSecuritySvrSession::BreakInfoL(const RMessage2& aMessage)
+	{
+	const TBreakId breakId = (TBreakId)aMessage.Int0();
+
+	TThreadId threadId;
+	TUint32 address;
+	TArchitectureMode mode;
+	TBool threadSpecific = ETrue;
+
+	TUint64 threadIdData;
+	User::LeaveIfError(Server().iKernelDriver.BreakInfo(breakId,threadIdData,address,mode,threadSpecific));
+
+	if(!threadSpecific)
+		{
+		User::Leave(KErrNotFound);
+		}
+
+	threadId = TThreadId(threadIdData);
+
+	//check that the agent has attached to the target process
+	CheckAttachedL(threadId, aMessage, EFalse);
+
+	// return the threadId
+	WriteDataL(aMessage, 1, &threadId, sizeof(threadId));
+
+	// return the address
+	WriteDataL(aMessage, 2, &address, sizeof(address));
+
+	// return the mode
+	WriteDataL(aMessage, 3, &mode, sizeof(mode));
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+@internalTechnology
+
+Modify a previously set breakpoint.
+
+@param aMessage.Int0() - The breakpoint id of the breakpoint to modify
+@param aMessage.Ptr1() - The new Thread Id for the breakpoint
+@param aMessage.Int2() - The new virtual memory address for the breakpoint
+@param aMessage.Int3() - The new architecture mode for the breakpoint
+@return KErrNone if succesful. KErrPermissionDenied if the security check fails.
+ KErrAlreadyExists if there is a breakpoint overlapping the desired address.
+ KErrNotSupported if the architecture type is unrecognised.
+ KErrNoMemory if there is no more memory to complete the operation.
+ KErrArgument if the breakpoint address alignment is unsuitable for the requested
+ breakpoint.
+ KErrOverflow if there are too many breakpoints set.
+*/
+void CSecuritySvrSession::ModifyBreakL(const RMessage2& aMessage)
+	{
+	const TBreakId breakId = (TBreakId)aMessage.Int0();
+	const TThreadId threadId = ReadTThreadIdL(aMessage, 1);
+	const TUint32 address = aMessage.Int2();
+	const TArchitectureMode mode = (TArchitectureMode)aMessage.Int3();
+
+	// Get information on the breakpoint to check the security status
+	TUint64 checkThreadId;
+	TUint32 checkAddress;
+	TArchitectureMode checkMode;
+	TBool threadSpecific;
+
+	User::LeaveIfError(Server().iKernelDriver.BreakInfo(breakId,checkThreadId,checkAddress,checkMode,threadSpecific));
+
+	LOG_MSG4( "CSecuritySvrSession::ModifyBreakL(brkId=%d) tId=0x%x, addr=0x%x", 
+			breakId, I64LOW(threadId.Id()), address );
+			
+	// Security check that the thread Id is associated with the debug agent
+
+	//check that the agent has attached to the target process
+	CheckAttachedL(TThreadId(checkThreadId), aMessage, EFalse);
+
+	// now check that the thread Id which is being set is permitted
+	//check that the agent has attached to the target process
+	CheckAttachedL(threadId, aMessage, EFalse);
+
+	User::LeaveIfError(Server().iKernelDriver.ModifyBreak(breakId,threadId,address,mode));
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+@internalTechnology
+
+Notes: This call is used to set a process wide breakpoint. Its input arguments
+are the process id, address and architecture type of the breakpoint. It returns success
+or failure, and if successful, it sets the TBreakId in the Debug Agent to the 
+breakpoint id by which it can be referenced in future calls to ModifyBreak,ClearBreak and
+BreakInfo.
+
+@param aMessage.Ptr0() - aProcessId is process id of the target debug process
+@param aMessage.Ptr1() - Address of a TBreakInfo in the Debug Agent
+@param aMessage.Ptr2() - Address of a TBreakId in the Debug Agent
+@leave KErrPermissionDenied if the security check fails.
+ KErrAlreadyExists if there is a breakpoint overlapping the desired address.
+ KErrNotSupported if the architecture type is unrecognised.
+ KErrNoMemory if there is no more memory to complete the operation.
+ KErrArgument if the breakpoint address alignment is unsuitable for the requested
+ breakpoint.
+ KErrOverflow if there are too many breakpoints set.
+*/
+void CSecuritySvrSession::SetProcessBreakL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::SetProcessBreakL()\n" );
+
+	//get debug app thread ID
+	TProcessId procId = ReadTProcessIdL(aMessage, 0);
+
+	//check that the agent has attached to the target process
+	CheckAttachedL(procId, aMessage, EFalse);
+
+	//create and initialise the memory info object
+	TBreakInfo breakInfo;
+	TPtr8 breakInfoPtr( (TUint8 *)&breakInfo, sizeof(TBreakInfo) );
+
+	aMessage.ReadL(1,breakInfoPtr);
+
+	LOG_MSG4( "CSecuritySvrSession::SetProcessBreakL pId=0x%x, addr=0x%x, mode=%d ", 
+			I64LOW(procId.Id()), breakInfo.iAddress, breakInfo.iArchitectureMode );
+
+	//set break in target app
+	TBreakId breakId = 0;
+	User::LeaveIfError(Server().iKernelDriver.SetProcessBreak(breakId, procId, breakInfo.iAddress, breakInfo.iArchitectureMode));
+
+	//attempt to write the break id back to the debug agent
+	WriteDataL(aMessage, 2, &breakId, sizeof(breakId));
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+@internalTechnology
+
+Modify a previously set process breakpoint.
+
+@param aMessage.Int0() - The breakpoint id of the breakpoint to modify
+@param aMessage.Ptr1() - The new Process Id for the breakpoint
+@param aMessage.Int2() - The new virtual memory address for the breakpoint
+@param aMessage.Int3() - The new architecture mode for the breakpoint
+@return KErrNone if succesful. KErrPermissionDenied if the security check fails.
+ KErrAlreadyExists if there is a breakpoint overlapping the desired address.
+ KErrNotSupported if the architecture type is unrecognised.
+ KErrNoMemory if there is no more memory to complete the operation.
+ KErrArgument if the breakpoint address alignment is unsuitable for the requested
+ breakpoint.
+ KErrOverflow if there are too many breakpoints set.
+*/
+void CSecuritySvrSession::ModifyProcessBreakL(const RMessage2& aMessage)
+	{
+	const TBreakId breakId = (TBreakId)aMessage.Int0();
+	const TProcessId processId = ReadTProcessIdL(aMessage, 1);
+	const TUint32 address = aMessage.Int2();
+	const TArchitectureMode mode = (TArchitectureMode)aMessage.Int3();
+
+	// Get information on the breakpoint to check the security status
+	TUint64 checkProcessId;
+	TUint32 checkAddress;
+	TArchitectureMode checkMode;
+	TBool threadSpecific;
+
+	User::LeaveIfError(Server().iKernelDriver.BreakInfo(breakId,checkProcessId,checkAddress,checkMode,threadSpecific));
+
+	LOG_MSG4( "CSecuritySvrSession::ModifyProcessBreakL(brkId=%d) pId=0x%x, addr=0x%x", 
+			breakId, I64LOW(processId.Id()), address );
+
+
+	// Security check that the process Id is associated with the debug agent
+
+	//check that the agent has attached to the target process
+	CheckAttachedL(TProcessId(checkProcessId), aMessage, EFalse);
+
+	// now check that the process Id which is being set is permitted
+	//check that the agent has attached to the target process
+	CheckAttachedL(processId, aMessage, EFalse);
+
+	User::LeaveIfError(Server().iKernelDriver.ModifyProcessBreak(breakId,processId,address,mode));
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+@param aMessage.Int0() - Breakpoint Id of interest
+@param aMessage.Ptr1() - Address in Debug Agent to place process Id of the breakpoint
+@param aMessage.Ptr2() - Address in Debug Agent to place address of the breakpoint
+@param aMessage.Ptr3() - Address in Debug Agent to place the architecture mode of the breakpoint
+@leave Any error which may be returned by RSessionBase::SendReceive()
+*/
+void CSecuritySvrSession::ProcessBreakInfoL(const RMessage2& aMessage)
+	{
+	const TBreakId breakId = (TBreakId)aMessage.Int0();
+
+	TProcessId procId;
+	TUint32 address;
+	TArchitectureMode mode;
+	TBool threadSpecific;
+
+	TUint64 procIdData;
+	User::LeaveIfError(Server().iKernelDriver.BreakInfo(breakId,procIdData,address,mode,threadSpecific));
+	if(threadSpecific)
+		{
+		User::Leave(KErrNotFound);
+		}
+	procId = TProcessId(procIdData);
+
+	//check that the agent has attached to the target process
+	CheckAttachedL(procId, aMessage, EFalse);
+
+	// return the processId
+	WriteDataL(aMessage, 1, &procId, sizeof(procId));
+
+	// return the address
+	WriteDataL(aMessage, 2, &address, sizeof(address));
+
+	// return the mode
+	WriteDataL(aMessage, 3, &mode, sizeof(mode));
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+Read register values.
+
+@param aMessage should contain:
+        * at offset 0 a pointer to the thread ID of the target thread
+        * at offset 1 a descriptor representing an array of TRegisterInfo 
+          register IDs
+        * at offset 2 a descriptor representing an array into which TRegister 
+          register values will be written
+        * at offset 3 a descriptor representing an array into which TUint8 
+          register flags will be written
+
+@leave KErrArgument if the max length of the array at offset 1 is not a 
+       multiple of sizeof(TRegisterInfo), if the max length of the array 
+       at offset 2 is not a multiple of sizeof(TRegister), if the max 
+       length of the array at offset 3 is not a multiple of sizeof(TUint8), if
+       any of the descriptors have max length of 0, or if the three 
+       descriptors do not represent the same number of registers,
+       KErrNoMemory if there is insufficient memory,
+       KErrDied, if the thread with thread ID aThreadId is dead
+*/
+void CSecuritySvrSession::ReadRegistersL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::ReadRegistersL()\n" );
+
+	const TThreadId threadId = ReadTThreadIdL(aMessage, 0);
+
+	//check the agent is attached to the thread
+	CheckAttachedL(threadId, aMessage, ETrue);
+
+	//number of registers being requested
+	TUint32 numberOfRegisters;
+
+	//check length of descriptors is acceptable
+	ValidateRegisterBuffersL(aMessage, numberOfRegisters);
+
+	// Passed data will be saved in this descriptor.
+	RBuf8 ids;
+	ids.CreateL(numberOfRegisters * sizeof(TRegisterInfo));
+	// Do the right cleanup if anything subsequently goes wrong
+	ids.CleanupClosePushL();
+	
+	//read the data from the client thread
+	aMessage.ReadL(1, ids);
+
+	//create buffer to fill with data from target debug thread
+	HBufC8 *data = HBufC8::NewLC(aMessage.GetDesMaxLength(2));
+	TPtr8 values(data->Des());   
+	
+	HBufC8 *flagsData = HBufC8::NewLC(numberOfRegisters * sizeof(TUint8));
+	TPtr8 flags(flagsData->Des());   
+	
+	//get register info and return relevant parts back to agent
+	User::LeaveIfError(Server().iKernelDriver.ReadRegisters(threadId, ids, values, flags));
+	aMessage.WriteL(2, values);
+	aMessage.WriteL(3, flags);
+	
+	//delete temporary buffers and return status
+	CleanupStack::PopAndDestroy(flagsData);
+	CleanupStack::PopAndDestroy(data);
+	CleanupStack::PopAndDestroy(&ids);
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+Write register values.
+
+@param aMessage should contain:
+        * at offset 0 a pointer to the thread ID of the target thread
+        * at offset 1 a descriptor representing an array of TRegisterInfo 
+          register IDs
+        * at offset 2 a descriptor representing an array of TRegister register 
+          values
+        * at offset 3 a descriptor representing an array into which TUint8 
+          register flags will be written
+
+@leave KErrArgument if the max length of the array at offset 1 is not a 
+       multiple of sizeof(TRegisterInfo), if the max length of the array 
+       at offset 2 is not a multiple of sizeof(TRegister), if the max 
+       length of the array at offset 3 is not a multiple of sizeof(TUint8), if
+       any of the descriptors have max length of 0, or if the three 
+       descriptors do not represent the same number of registers,
+       KErrNoMemory if there is insufficient memory,
+       KErrDied, if the thread with thread ID aThreadId is dead
+*/
+void CSecuritySvrSession::WriteRegistersL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::WriteRegistersL()\n" );
+
+	const TThreadId threadId = ReadTThreadIdL(aMessage, 0);
+
+	CheckAttachedL(threadId, aMessage, EFalse);
+
+	//number of registers attempting to set
+	TUint32 numberOfRegisters;
+
+	//check length of descriptors is acceptable
+	ValidateRegisterBuffersL(aMessage, numberOfRegisters);
+
+	// Passed register ids will be saved in this descriptor.
+	RBuf8 ids;
+
+	//allocate buffer
+	ids.CreateL(numberOfRegisters * sizeof(TRegisterInfo));
+
+	// Do the right cleanup if anything subsequently goes wrong
+	ids.CleanupClosePushL();
+
+	//read the data from the client thread
+	aMessage.ReadL(1, ids);
+
+	// Passed register values will be saved in this descriptor.
+	RBuf8 values;
+
+	//allocate buffer
+	values.CreateL(aMessage.GetDesMaxLength(2));
+	// Do the right cleanup if anything subsequently goes wrong
+	values.CleanupClosePushL();
+	//read the data from the client thread
+	aMessage.ReadL(2,values);
+
+	HBufC8 *flagsData = HBufC8::NewLC(numberOfRegisters*sizeof(TUint8));
+	TPtr8 flags(flagsData->Des());
+
+	//get register info and return relevant parts back to agent
+	User::LeaveIfError(Server().iKernelDriver.WriteRegisters(threadId, ids, values, flags));
+
+	//write flags data back
+	aMessage.WriteL(3, flags);
+
+	CleanupStack::PopAndDestroy(flagsData);
+	CleanupStack::PopAndDestroy(&values);
+	CleanupStack::PopAndDestroy(&ids);
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+Processes an attach request from a debug agent. Gets the target debug
+processes' original FileName as an argument. The method sets completion
+status of the aMessage argument to KErrNone if successfully attached and to
+another of the system wide error codes if there were problems.
+
+@param aMessage contains:
+       * a boolean at offset 0 which indicates whether the agent wishes to
+       attach passively
+       * a buffer at offset 1 which contains the FileName
+       of the target debug process.
+*/
+void CSecuritySvrSession::AttachProcessL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::AttachProcessL()\n" );
+
+	const TBool passive = aMessage.Int0();
+
+	TInt deslen = aMessage.GetDesLengthL(1);
+
+	// Passed data will be saved in this descriptor.
+	RBuf processName;
+
+	// Max length set to the value of "deslen", but current length is zero
+	processName.CreateL(deslen);
+
+	// Do the right cleanup if anything subsequently goes wrong
+	processName.CleanupClosePushL();
+
+	// Copy the client's descriptor data into our buffer.
+	aMessage.ReadL(1,processName);
+
+	//
+	// Security Check
+	//
+	// It is not permitted to debug the debug security server!
+	//
+	// get the secure id of the executable
+	TUid secureId(TUid::Null());
+	GetSecureIdL(processName, secureId);
+	if (KUidDebugSecurityServer.iUid == secureId.iUid)
+		{
+		// The debug agent has requested to debug the Debug Security Server
+		// This is either an error, or an attempt to breach security. We
+		// therefore refuse to agree to this request, and return KErrPermissionDenied
+		LOG_MSG("Debug Agent attempted to debug the Debug Security Server");
+		User::Leave(KErrPermissionDenied);
+		}
+
+	// Check the OEM Debug token capabilities 
+	GetDebugAgentOEMTokenCapsL();
+	
+	// Get the Security info via rlibrary::getinfo
+	RLibrary::TInfo info;
+	TPckg<RLibrary::TInfo> infoBuf(info);
+
+	TInt err = RLibrary::GetInfo(processName, infoBuf);
+	if (err != KErrNone)
+		{
+		LOG_MSG2("Cannot parse the target executable header, err=%d", err);
+		// Could not read the header for this executable :-(
+		CleanupStack::PopAndDestroy(&processName);
+		aMessage.Complete(err);
+		return;
+		}
+	
+	// Special case for AllFiles - OEM Debug tokens MUST have
+	// AllFiles, as this is what allows them to read contents
+	// of other executables.
+	TBool checkDebuggable = ETrue;
+
+	// Does an OEM Debug Token permit debug where it would normally not be
+	// permitted?
+	if ( Server().OEMTokenPermitsDebugL(iOEMDebugCapabilities, info.iSecurityInfo.iCaps) )
+		{
+		// OEM Debug token is valid and has sufficient capabilities
+		LOG_MSG("CSecuritySvrSession::AttachProcessL() - Debug Agent has sufficient capabilites based on OEM Debug Token");	
+		
+		checkDebuggable = EFalse;
+		}
+
+	if (checkDebuggable)
+		{
+		// OEM Debug token (if any), does not confer sufficient capabilities to
+		// debug the specified target executable. Therefore debugging can only
+		// be permitted if the target executable itself has been built as 'Debuggable'
+		LOG_MSG("CSecuritySvrSession::AttachProcessL() - Debug Agent has insufficient capabilites based on OEM Debug Token");	
+
+		IsDebuggableL(processName);
+		}
+
+	User::LeaveIfError(Server().AttachProcessL(processName, iDebugAgentProcessId, passive));
+
+	// Inform the kernel driver about the attachment, so that it
+	// can track per-agent data about the process.
+	RBuf8 processName8;
+
+	processName8.CreateL(deslen);
+
+	processName8.CleanupClosePushL();
+
+	processName8.Copy(processName);
+
+	User::LeaveIfError(Server().iKernelDriver.AttachProcess(processName8, iDebugAgentProcessId.Id()));
+
+	// Create an Active Object to handle asynchronous calls to GetEvent
+	CSecuritySvrAsync* handler = CSecuritySvrAsync::NewL(this,processName8,iDebugAgentProcessId);
+
+	err = iAsyncHandlers.Insert(handler,0);
+	if (err != KErrNone)
+		{
+		// If we don't have an asynchronous handler, we should detach
+		// the driver as well.
+		Server().iKernelDriver.DetachProcess(processName8,iDebugAgentProcessId.Id());
+		Server().DetachProcess(processName, iDebugAgentProcessId);
+		// The DSS should NEVER panic itself. If the above calls fail, so be it we will attempt to limp on
+		}
+
+	User::LeaveIfError(err);
+
+	CleanupStack::PopAndDestroy(&processName8);
+
+	CleanupStack::PopAndDestroy(&processName);
+
+	aMessage.Complete(KErrNone);
+	}
+
+
+/**
+Processes an attach request from a debug agent from all processes. 
+The method sets completion status of the aMessage argument to KErrNone 
+if successfully attached and to another of the system wide error codes 
+if there were problems.
+
+@param aMessage contains no data
+*/
+void CSecuritySvrSession::AttachAllL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::AttachAllL()\n" );
+
+
+	// Run the OEM Debug token, if run ok then sets iOEMDebugCapabilities
+	GetDebugAgentOEMTokenCapsL();
+
+	// Debug token must have All caps to use AttachToAll
+	TCapabilitySet allCaps;
+	allCaps.SetAllSupported();
+	if (!Server().OEMTokenPermitsDebugL(iOEMDebugCapabilities, allCaps))
+		{
+		LOG_MSG("Client's OEM token doesn't have capability ALL required for AttachAll()");
+		User::Leave(KErrPermissionDenied);
+		}
+
+
+	User::LeaveIfError(Server().AttachProcessL(_L("*"), iDebugAgentProcessId, EFalse));
+
+    TBuf8<1> KStar8=_L8("*");
+
+    User::LeaveIfError(Server().iKernelDriver.AttachProcess(KStar8, iDebugAgentProcessId.Id()));
+
+    // Create an Active Object to handle asynchronous calls to GetAllEvent
+    CSecuritySvrAsync* handler = CSecuritySvrAsync::NewL(this,KStar8,iDebugAgentProcessId);    
+    TInt err = iAsyncHandlers.Insert(handler,0);
+    if (err != KErrNone)
+        {
+        // If we don't have an asynchronous handler, we should detach
+        // the driver as well.
+        Server().iKernelDriver.DetachProcess(KStar8,iDebugAgentProcessId.Id());
+        Server().DetachProcess(_L("*"), iDebugAgentProcessId);
+        }
+
+    User::LeaveIfError(err);
+
+	aMessage.Complete(KErrNone);   
+	}
+
+
+/**
+Reads the OEM Debug Token associated with the debug agent if any. The OEM Debug Token
+allows the Debug Agent to debug certain executables which have not been built as
+'Debuggable'.
+
+This works as follows: The OEM Debug Token is an executable with a special name
+of the form "OEMDebug_<DA_SID>.exe" where <DA_SID> is the Secure ID of the Debug Agent
+in hexadecimal. For example: "OEMDebug_F123ABCD.exe" would be a valid name. This token executable
+must be signed with 'AllFiles' + X, where X is the set of PlatSec capabilities that are
+possessed by the target executable to be debugged.
+
+This function reads the capabilities possessed by the token by creating a process based
+on the executable, and reading the TSecurityInfo associated with the process. This ensures
+that the loader has validated the token has not been tampered with and that the security
+information is valid.
+
+The security information is then stored for future use as member data in iOEMDebugCapabilities.
+
+Leaves if there is an error, otherwise simply fills in the capabilities
+in iOEMDebugCapabilities.
+
+It is not an error for the OEM Debug token not to exist. In this case, the function simply returns.
+*/
+void CSecuritySvrSession::GetDebugAgentOEMTokenCapsL(void)
+	{
+	if (iOEMDebugCapabilities.HasCapability(ECapabilityAllFiles))
+		{
+		// Then we've already read the caps - wasteful to read them again
+		return;
+		}
+
+	// Obtain the security info about the debug agent process
+	//get the debug agent's process
+	RProcess debugAgentProcess;
+
+	CleanupClosePushL(debugAgentProcess);
+
+	debugAgentProcess.Open(iDebugAgentProcessId);
+
+	// We have now obtained a process handle based on the token executable, so we can check its security properties.
+	TSecurityInfo secInfo(debugAgentProcess);
+
+	// Compute the name of the OEM debug token based on the SID of the debug agent
+	_LIT(KDSSOEMDebugTokenPrefix,"OEMDebug_");
+	_LIT(KDSSOEMDebugTokenAppendFmt,"%08X.exe");
+
+	RBuf agentTokenName;
+	agentTokenName.CreateL(KDSSOEMDebugTokenPrefix().Size()+8+1);	// allow space for SID+null terminator
+	agentTokenName.CleanupClosePushL();
+
+	agentTokenName.SetLength(0);
+
+	// Add OEMDebug_
+	agentTokenName.Append(KDSSOEMDebugTokenPrefix());
+
+	// Add debug agent Secure ID
+	agentTokenName.AppendFormat(KDSSOEMDebugTokenAppendFmt,secInfo.iSecureId.iId);
+	
+	// just log the token name for the moment.
+	RBuf8 agentTokenName8;
+
+	agentTokenName8.CreateL(agentTokenName.Length()+1);
+
+	agentTokenName8.CleanupClosePushL();
+
+	agentTokenName8.Copy(agentTokenName);
+
+	agentTokenName8.Append(TChar(0));
+
+	LOG_MSG2("CSecuritySvrSession::GetDebugAgentOEMTokenCapsL() - OEM Debug Token Name is %s",agentTokenName8.Ptr()); 
+
+	// Cleanup
+	CleanupStack::PopAndDestroy(&agentTokenName8);
+
+	// Now locate and start the executable...
+	RProcess agentToken;
+	TInt err = agentToken.Create(agentTokenName, KNullDesC);
+	if (KErrNone != err)
+		{
+		// Failed to create a process based on the token, just give up
+		LOG_MSG2("CSecuritySvrSession::GetDebugAgentOEMTokenCapsL() - Could not create process based on token due to err 0x%8x\n",err);
+		
+		// Cleanup remaining items from the stack
+		CleanupStack::PopAndDestroy(&agentTokenName);
+
+		CleanupStack::PopAndDestroy(&debugAgentProcess);
+		return;
+		}
+
+	// Synchronise with the process to make sure it hasn't died straight away
+	TRequestStatus stat;
+	agentToken.Rendezvous(stat);
+	if (stat != KRequestPending)
+		{
+		// logon failed - agentToken is not yet running, so cannot have terminated
+		agentToken.Kill(0);             // Abort startup
+		}
+
+	// store the OEM Debug Token security data 
+	TSecurityInfo agentSecInfo(agentToken);
+
+	// Note capabilities for future use
+	iOEMDebugCapabilities=agentSecInfo.iCaps;
+	
+	// resume the token. It _should_ just exit, but we don't really care.
+	agentToken.Resume();
+
+	// Wait to synchronise with agentToken - if it dies in the meantime, it
+	// also gets completed
+	User::WaitForRequest(stat);
+
+	// Just close the handle to it again.
+	agentToken.Close();
+
+	// Cleanup remaining items from the stack
+	CleanupStack::PopAndDestroy(&agentTokenName);
+
+	CleanupStack::PopAndDestroy(&debugAgentProcess);
+
+	}
+
+/**
+  Checks whether the file passed in as aExecutable is XIP or not
+
+  @param aExecutable file to check
+  @return ETrue if the file is XIP, EFalse otherwise
+  */
+TBool CSecuritySvrSession::IsExecutableXipL(RFile& aExecutable)
+	{
+	TUint atts;
+	User::LeaveIfError(aExecutable.Att(atts));
+
+	return atts & KEntryAttXIP;
+	}
+
+/**
+  Gets access to the symbian crash partition for crash access operation.
+  */
+void CSecuritySvrSession::ConnectCrashPartitionL (void)
+	{
+	LOG_MSG("CSecuritySvrSession::ConnectCrashPartitionL()");
+	
+	TBool changed;
+	TInt error = KErrNone;
+	TInt i=0;
+	
+	//Intialising to EFalse
+	iCrashConnected = EFalse;
+	
+	TPckg<TLocalDriveCapsV2> capsBuf(iCaps);
+	
+	//check for the symbian crash partition
+	for (i=0; i<KMaxLocalDrives; i++)
+		{
+		error = iLocalDrive.Connect (i, changed);
+		if ( error == KErrNone)
+			{
+			error = iLocalDrive.Caps(capsBuf);
+			if ( error != KErrNone)
+				{
+				//continue if not found
+				continue;
+				}
+			if ( iCaps.iPartitionType == (TUint16)KPartitionTypeSymbianCrashLog)
+				{				
+				LOG_MSG2("Found Symbian crash log partition on drive: %d",i);
+				iCrashConnected = ETrue;
+				break;
+				}			
+			}
+		}
+	if ( i == KMaxLocalDrives)
+		{
+		LOG_MSG("No crash log partition found with valid crash log signature found.  Exiting...");
+		User::Leave (KErrNotFound);
+		}
+
+	// Nand Flash not currently supported.
+	if (iCaps.iType == EMediaNANDFlash)
+		{
+		LOG_MSG( "CSecuritySvrSession::ConnectCrashPartitionL()  Nand Flash not currently supported\n" );
+		User::Leave (KErrNotSupported);
+		}
+	}
+/** Checks that aHeaderData contains enough data to cast it to the
+  appropriate header type.
+
+  @param aHeaderData buffer containing header data read from a file
+  @param aXip boolean indicating whether the header data is for an XIP image
+
+  @return ETrue if enough data in buffer, EFalse otherwise
+  */
+TBool CSecuritySvrSession::CheckSufficientData(const TDesC8& aHeaderData, const TBool aXip) const
+	{
+	TUint minimumHeaderSize = aXip ? sizeof(TRomImageHeader) : sizeof(E32ImageHeaderV);
+	return (aHeaderData.Length() >= minimumHeaderSize);
+	}
+
+/**
+  Opens a file handle to aFileName using aFileHandle
+  @param aFileName file to open handle to
+  @param aFs file system to use to open the handle
+  @param aFileHandle file handle to open
+
+  @leave one of the system wide error codes
+  */
+void CSecuritySvrSession::OpenFileHandleL(const TDesC& aFileName, RFs& aFs, RFile& aFileHandle)
+	{
+	TInt err = aFileHandle.Open(aFs, aFileName, EFileRead | EFileShareReadersOnly);
+	if (err != KErrNone)
+		{
+		// Could not open the file for reading
+		LOG_MSG("CSecuritySvrSession::OpenFileHandleL - Failed to open executable\n");
+
+		User::Leave(err);
+		}
+	}
+
+/**
+  Checks whether an executable has the debug bit set
+
+  @param aHeaderData buffer containing the header of the executable
+  @param aXip indication of whether the executable is XIP or not
+
+  @return ETrue if debug bit is set, EFalse otherwise
+  */
+TBool CSecuritySvrSession::IsDebugBitSet(const TDesC8& aHeaderData, const TBool aXip)
+	{
+	if(!CheckSufficientData(aHeaderData, aXip))
+		{
+		return EFalse;
+		}
+
+	if (aXip)
+		{
+		TRomImageHeader* hdr = (TRomImageHeader*)aHeaderData.Ptr();
+		return (hdr->iFlags & KRomImageDebuggable);
+		}
+	else
+		{
+		// it is an epoc32 image
+		E32ImageHeaderV* hdr = (E32ImageHeaderV*)aHeaderData.Ptr();
+		return (hdr->iFlags & KImageDebuggable);
+		}
+	}
+
+/**
+Determines whether a particular executable is marked as 'debuggable'
+
+Notes:
+This function is currently hard coded to understand the format of e32 and
+TRomImage file headers. Ideally this will be replaced by a call to RLibrary::GetInfo
+which can return the 'debuggable' information. Unfortunately, this call currently
+does not provide the information for XIP executables :-(
+
+@leave KErrPermissionDenied if the debug bit is not set, or one of the other
+system wide error codes
+*/
+void CSecuritySvrSession::IsDebuggableL(const TDesC& aFileName)
+	{
+#ifndef IGNORE_DEBUGGABLE_BIT
+
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+
+	RFile targetExe;
+	OpenFileHandleL(aFileName, fs, targetExe);
+	CleanupClosePushL(targetExe);
+
+	// Read in the entire header
+	RBuf8 e32HdrBuf;
+	e32HdrBuf.CreateL(RLibrary::KRequiredImageHeaderSize);
+	e32HdrBuf.CleanupClosePushL();
+
+	// Read the entire header as far as possible
+	TInt err = targetExe.Read(e32HdrBuf);
+	if (err != KErrNone)
+		{
+		// Could not read the file 
+		LOG_MSG("CSecuritySvrSession::IsDebuggableL - Failed to read executable\n");
+
+		User::Leave(err);
+		}
+
+	if(!CheckSufficientData(e32HdrBuf, IsExecutableXipL(targetExe)))
+		{
+		User::Leave(KErrGeneral);
+		}
+
+	if(! IsDebugBitSet(e32HdrBuf, IsExecutableXipL(targetExe)))
+		{
+		User::Leave(KErrPermissionDenied);
+		}
+	CleanupStack::PopAndDestroy(3, &fs);
+
+#else
+	LOG_MSG("CSecuritySvrSession::IsDebuggableL() Debuggable bit temporarily ignored!!!");
+#endif
+	}
+
+/**
+Processes a detach request from a debug agent. Gets the target debug
+processes' original FileName as an argument. The method sets completion
+status of the aMessage argument to KErrNone if successfully detached and to
+another of the system wide error codes if there were problems.
+
+@param aMessage contains:
+       * a buffer at offset 0 which contains the FileName
+       of the target debug process.
+*/
+void CSecuritySvrSession::DetachProcessL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::DetachProcessL()\n" );
+
+	TInt deslen = aMessage.GetDesLengthL(0);
+	// Passed data will be saved in this descriptor.
+	RBuf processName;
+
+	// Max length set to the value of "deslen", but current length is zero
+	processName.CreateL(deslen);
+
+	// Do the right cleanup if anything subsequently goes wrong
+	processName.CleanupClosePushL();
+
+	// Copy the client's descriptor data into our buffer.
+	aMessage.ReadL(0,processName);
+
+	User::LeaveIfError(Server().DetachProcess(processName, iDebugAgentProcessId));
+
+	// Inform the kernel driver about the detachment, so that
+	// it can stop tracking per-agent data for the debugged process.
+	RBuf8 processName8;
+
+	processName8.CreateL(deslen);
+
+	processName8.CleanupClosePushL();
+
+	processName8.Copy(processName);
+
+	// Remove the Asynchronous Object associated with this process
+	for(TInt i=0; i<iAsyncHandlers.Count(); i++)
+		{
+		if (processName8.Compare(iAsyncHandlers[i]->ProcessName()) == 0)
+			{
+			delete iAsyncHandlers[i];
+			iAsyncHandlers.Remove(i);
+
+			break;
+			}
+		}
+	
+	// Inform the driver that we are no longer attached to this process
+	User::LeaveIfError(Server().iKernelDriver.DetachProcess(processName8,iDebugAgentProcessId.Id()));
+	
+	CleanupStack::PopAndDestroy(&processName8);
+	CleanupStack::PopAndDestroy(&processName);
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+Processes a DetachAll request from a debug agent.
+The method sets completion status of the aMessage argument to 
+KErrNone if successfully detached and to
+another of the system wide error codes if there were problems.
+
+@param aMessage contains:
+       * a buffer at offset 0 which contains the FileName
+       of the target debug process.
+*/
+void CSecuritySvrSession::DetachAllL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::DetachAllL()" );
+
+	User::LeaveIfError(Server().DetachProcess(_L("*"), iDebugAgentProcessId));
+
+	TBuf8<1> KStar8=_L8("*");
+    
+	TBool found = EFalse;
+
+	// Remove the Asynchronous Object associated with the AttachAll, not the rest
+	for(TInt i=0; i<iAsyncHandlers.Count(); i++)
+		{
+		if (iAsyncHandlers[i]->ProcessName().Compare(KStar8) == 0)
+			{
+			delete iAsyncHandlers[i];
+			iAsyncHandlers.Remove(i);
+			User::LeaveIfError(Server().iKernelDriver.DetachProcess(KStar8,iDebugAgentProcessId.Id()));
+			found = ETrue;
+			break;
+			}
+		}
+
+	if( !found )
+		{
+		LOG_MSG2( "CSecuritySvrSession::DetachAllL() : Did not find the asynch handler for agent 0x%lx",
+				iDebugAgentProcessId.Id() );
+		User::Leave(KErrNotFound);
+		}
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+@param aMessage The RMessage2 object is expected to contain:
+  * aMessage.Int0() - TDes8 Containing the process name.
+  * aMessage.Int1() - Address of TPtr8 containing TEventInfo
+
+*/
+void CSecuritySvrSession::GetEventL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::GetEventL()\n" );
+
+	// Local descriptor to contain target process name
+	TInt deslen = aMessage.GetDesLengthL(0);
+
+	RBuf processName;
+
+	processName.CreateL(deslen);
+	
+	processName.CleanupClosePushL();
+
+	// Read the target process name into processName
+	aMessage.ReadL(0,processName);
+
+	// Check if debug agent is attached to process
+	if(!Server().CheckAttachedProcess(processName, aMessage, EFalse))
+		{
+		LOG_MSG("CSecuritySvrSession::GetEventL() - Not attached to this process\n");
+
+		// Debug Agent is not attached at all to the requested process
+		User::Leave(KErrPermissionDenied);
+		}
+
+	// Identify which process is being debugged, so that
+	// we can locate the appropriate active object handler.
+	RBuf8 processName8;
+
+	processName8.CreateL(processName.Length());
+
+	processName8.CleanupClosePushL();
+
+	processName8.Copy(processName);
+
+	// Find the Asynchronous Object associated with this process,
+	// as it is permissible to have an outstanding GetEvent call
+	// for each attached process.
+	TBool foundHandler = EFalse;
+	for(TInt i=0; i<iAsyncHandlers.Count(); i++)
+		{
+		if (processName8.Compare(iAsyncHandlers[i]->ProcessName()) == 0)
+			{
+			iAsyncHandlers[i]->GetEvent(aMessage);
+			foundHandler = ETrue;
+			break;
+			}
+		}
+
+	if (foundHandler == EFalse)
+		{
+		// could not find an async handler object. Report the problem.
+		LOG_MSG("CSecuritySvrSessionL - Could not find a handler object\n");
+		User::Leave(KErrNotFound);
+		}
+
+	// Actually make the driver call, passing in the agent Id
+	// so that the driver knows which per-agent event queue
+	// to interrogate to retrieve the latest event.
+	CleanupStack::PopAndDestroy(&processName8);
+	CleanupStack::PopAndDestroy(&processName);
+	}
+
+/**
+Cancels a pre-issued GetEvent call for a specific debugged process.
+
+@param aMessage.Int0() - TDes8 containing aProcessName
+*/
+void CSecuritySvrSession::CancelGetEventL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::CancelGetEventL()\n" );
+
+	// Local descriptor to contain target process name
+	TInt deslen = aMessage.GetDesLengthL(0);
+
+	RBuf processName;
+
+	processName.CreateL(deslen);
+
+	processName.CleanupClosePushL();
+
+	// Read the target process name into processName
+	aMessage.ReadL(0,processName,0);
+
+	// Debug Agent is not an active debugger. Check if the DA is passively attached
+	if(!Server().CheckAttachedProcess(processName, aMessage, EFalse))
+		{
+		// Debug Agent is not attached at all to the requested process
+		User::Leave(KErrPermissionDenied);
+		}
+
+	// Identify the appropriate active object associate
+	// with this process.
+	RBuf8 processName8;
+
+	processName8.CreateL(processName.Length());
+
+	processName8.CleanupClosePushL();
+
+	processName8.Copy(processName);
+
+	// Find the Asynchronous Object associated with this process
+	TBool foundHandler = EFalse;
+	for(TInt i=0; i<iAsyncHandlers.Count(); i++)
+		{
+		if (processName8.Compare(iAsyncHandlers[i]->ProcessName()) == 0)
+			{
+
+			// Found the AO handler, so cancel the outstanding getevent call.
+			iAsyncHandlers[i]->Cancel();
+			foundHandler = ETrue;
+			break;
+			}
+		}
+
+	if(!foundHandler)
+		{
+		// We could not found a handler, so report the problem to the debug agent
+		User::Leave(KErrNotFound);
+		}
+
+	//do cleanup
+	CleanupStack::PopAndDestroy(&processName8);
+	CleanupStack::PopAndDestroy(&processName);
+
+	aMessage.Complete(KErrNone);
+	}
+
+/*
+ Purpose: Sets the required event action to be taken for a specific
+ process and event combination
+
+@param aMessage The RMessage2 object is expected to contain:
+  * aMessage.Int0() - TDes8 Containing the process name.
+  * aMessage.Int1() - TEventType
+  * aMessage.Int2() - TKernelEventAction
+  *
+*/
+void CSecuritySvrSession::SetEventActionL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::SetEventActionL()\n" );
+
+	// Local descriptor to contain target process name
+	TInt deslen = aMessage.GetDesLengthL(0);
+
+	RBuf processName;
+
+	processName.CreateL(deslen);
+
+	processName.CleanupClosePushL();
+
+	// Read the target process name into processName
+	aMessage.ReadL(0,processName);
+
+	//check that the agent has attached to the target process
+	if(!Server().CheckAttachedProcess(processName, aMessage, EFalse))
+		{
+		// Debug Agent is not attached at all to the requested process
+		User::Leave(KErrPermissionDenied);
+		}
+
+	// Extract and validate the arguments from aMessage
+	TUint32 event  = aMessage.Int1();
+	if (event >= EEventsLast)
+		{
+		// Supplied event Id was not recognised
+		User::Leave(KErrArgument);
+		}
+
+	TUint32 action = aMessage.Int2();
+	if(action >= EActionLast)
+	{
+		// Supplied event action was not recognised
+		User::Leave(KErrArgument);
+	}
+
+	RBuf8 processName8;
+
+	processName8.CreateL(processName.Length());
+
+	processName8.CleanupClosePushL();
+
+	processName8.Copy(processName);
+
+	// Make the call to the device driver
+	TInt err = Server().iKernelDriver.SetEventAction(processName8, \
+		(TEventType)event,\
+		(TKernelEventAction)action,\
+		iDebugAgentProcessId.Id());
+
+	User::LeaveIfError(err);
+
+	CleanupStack::PopAndDestroy(&processName8);
+	CleanupStack::PopAndDestroy(&processName);
+
+	aMessage.Complete(KErrNone);
+}
+
+/**
+Purpose: Single-step a thread for a specified number of instructions
+
+@param aMessage.Ptr0() - Thread Id of the thread to be stepped
+@param aMessage.Int1() - Number of instructions to step.
+
+@leave one of the system wide error codes
+
+*/
+void CSecuritySvrSession::StepL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::StepL()\n" );
+
+	const TThreadId threadId = ReadTThreadIdL(aMessage, 0);
+	const TInt32 numSteps = aMessage.Int1();
+
+	CheckAttachedL(threadId, aMessage, EFalse);
+
+	User::LeaveIfError(Server().iKernelDriver.Step( threadId, numSteps ));
+
+	aMessage.Complete(KErrNone);
+	}
+
+/**
+ * This checks whether or not the agent is permitted access to the flash partition
+ * @return KErrNone if allowed, otherwise one of the system wide error codes
+ * @leave one of the system wide error codes
+ */
+TInt CSecuritySvrSession::CheckFlashAccessPermissionL(const RThread& aClientThread)
+	{
+	// Read the OEM Debug token capabilities (if any)
+	GetDebugAgentOEMTokenCapsL();
+	
+	if(Server().OEMTokenPermitsFlashAccessL((iOEMDebugCapabilities)))
+		{
+		return KErrNone;
+		}
+
+	return KErrPermissionDenied;
+	}
+
+/**
+Purpose: Read the crash log from the crash flash partition
+@param aMessage.Int0() - Position to read from.
+@param aMessage.Ptr1() - Buffer to hold the data retrieved
+@param aMessage.Int2() - Size of the data to read.
+
+@leave one of the system wide error codes
+*/
+void CSecuritySvrSession::ReadCrashLogL (const RMessage2& aMessage)
+	{	
+	//get the debug agent's thread and push handle onto clean up stack
+	RThread clientThread;
+	User::LeaveIfError(aMessage.Client(clientThread));
+	CleanupClosePushL(clientThread);
+	
+	TInt err = CheckFlashAccessPermissionL(clientThread);
+	
+	CleanupStack::PopAndDestroy(&clientThread);
+	
+	if(KErrNone != err)
+		{
+		LOG_MSG2( "CSecuritySvrSession::ReadCrashLogL()  Access Not Granted - [%d]\n", err );
+		aMessage.Complete(err);
+		return;
+		}
+	
+	//Check whether drive connected.
+	if(!iCrashConnected)
+		ConnectCrashPartitionL();	
+
+	TInt readPosition = aMessage.Int0(); //read position
+	
+	TInt readSize = aMessage.Int2(); //read size
+	
+	RBuf8 readBuf;
+	readBuf.CreateL(readSize);
+	readBuf.CleanupClosePushL();
+	
+	err = iLocalDrive.Read (readPosition, readSize, readBuf);
+	
+	//write the list data back
+	aMessage.WriteL (1, readBuf);	
+	
+	CleanupStack::PopAndDestroy (&readBuf);	
+	
+	//Complete message
+	aMessage.Complete(err);	
+	}
+/**
+Purpose: Function to write the crash config to the crash flash partition
+
+@param aMessage.Int0() - write position in bytes from start position in flash partition.
+@param aMessage.Ptr1() - Buffer containing the data to be written onto the flash. 
+                         The size could be 0 if only flash partition size is needed. 
+@param aMessage.Int2() - returns the size of the flash partition.
+
+@leave one of the system wide error codes
+*/
+void CSecuritySvrSession::WriteCrashConfigL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::WriteCrashConfigL()\n" );
+	
+	//get the debug agent's thread and push handle onto clean up stack
+	RThread clientThread;
+	User::LeaveIfError(aMessage.Client(clientThread));
+	CleanupClosePushL(clientThread);
+	
+	TInt err = CheckFlashAccessPermissionL(clientThread);
+	
+	CleanupStack::PopAndDestroy(&clientThread);
+	
+	if(KErrNone != err)
+		{
+		LOG_MSG2( "CSecuritySvrSession::WriteCrashConfigL()  Access Not Granted - [%d]\n", err );
+		aMessage.Complete(err);
+		return;
+		}
+	
+	//Check whether drive connected.
+	if(!iCrashConnected)
+		ConnectCrashPartitionL();	
+	
+	// Get the length of the buffer
+	TInt deslen = aMessage.GetDesLengthL(1);
+
+	RBuf8 dataBuf;
+	dataBuf.CreateL(deslen);
+	dataBuf.CleanupClosePushL();
+
+	// data to be written to flash
+	aMessage.ReadL(1,dataBuf);
+	
+	TUint32 position = aMessage.Int0(); //position to start from
+		
+	err = iLocalDrive.Write(position,(const TDesC8&)dataBuf);
+	
+	TPtr8 dataSize((TUint8*)&deslen,4, 4);
+	
+	//write the size of the data written back
+	aMessage.WriteL(2,dataSize);
+		
+	//destroy buffer
+	CleanupStack::PopAndDestroy(&dataBuf); 
+	
+	aMessage.Complete(err);	
+	}
+/**
+Purpose: Method to erase the crash flash block
+
+@param aMessage.Int0() - write position in bytes from start position in flash partition.
+@param aMessage.Int2() - Number of blocks to erase.
+
+@leave one of the system wide error codes
+*/
+
+void CSecuritySvrSession::EraseCrashLogL(const RMessage2& aMessage)
+	{	
+	LOG_MSG( "CSecuritySvrSession::EraseCrashLogL()\n" );
+	
+	//get the debug agent's thread and push handle onto clean up stack
+	RThread clientThread;
+	User::LeaveIfError(aMessage.Client(clientThread));
+	CleanupClosePushL(clientThread);
+	
+	TInt err = CheckFlashAccessPermissionL(clientThread);
+	
+	CleanupStack::PopAndDestroy(&clientThread);
+	
+	if(KErrNone != err)
+		{
+		LOG_MSG2( "CSecuritySvrSession::EraseCrashLogL()  Access Not Granted - [%d]\n", err );
+		aMessage.Complete(err);
+		return;
+		}
+			
+	//Check whether drive connected.
+	if(!iCrashConnected)
+		ConnectCrashPartitionL();	
+	
+	TInt64 position = aMessage.Int0();	
+	TInt size = aMessage.Int1();
+	
+	//Format drive
+	err = iLocalDrive.Format(position,size*iCaps.iEraseBlockSize);		
+ 
+	aMessage.Complete(err);	
+	}
+
+/**
+Purpose: Method to erase the entire crash flash block
+@leave one of the system wide error codes
+*/
+
+void CSecuritySvrSession::EraseEntireCrashLogL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::EraseEntireCrashLogL()\n" );
+	
+	//get the debug agent's thread and push handle onto clean up stack
+	RThread clientThread;
+	User::LeaveIfError(aMessage.Client(clientThread));
+	CleanupClosePushL(clientThread);
+	
+	TInt err = CheckFlashAccessPermissionL(clientThread);
+	
+	CleanupStack::PopAndDestroy(&clientThread);
+	
+	if(KErrNone != err)
+		{
+		LOG_MSG2( "CSecuritySvrSession::EraseEntireCrashLogL()  Access Not Granted - [%d]\n", err );
+		aMessage.Complete(err);
+		return;
+		}	
+	
+	//Check whether drive connected.
+	if(!iCrashConnected)
+		ConnectCrashPartitionL();
+	
+	TUint numberBlocks = iCaps.iSize /iCaps.iEraseBlockSize;
+	
+	//Format drive
+	for(TInt i = 0; i < numberBlocks; i++)
+		{
+		err = iLocalDrive.Format(i*iCaps.iEraseBlockSize,iCaps.iEraseBlockSize);
+		if(KErrNone != err)
+			{
+			RDebug::Printf("err = %d", err);
+			aMessage.Complete(err);
+			return;
+			}
+		}
+	
+	
+	aMessage.Complete(err);
+	}
+
+
+/**
+Purpose: Kill a specified process
+
+@param aMessage.Ptr0() - Process Id of the thread to be stepped
+@param aMessage.Int1() - Reason code to supply when killing the process.
+
+@leave one of the system wide error codes
+
+*/
+void CSecuritySvrSession::KillProcessL(const RMessage2& aMessage)
+	{
+	LOG_MSG( "CSecuritySvrSession::KillProcessL()\n" );
+
+	const TProcessId processId = ReadTProcessIdL(aMessage, 0);
+	const TInt32 reason = aMessage.Int1();
+
+	CheckAttachedL(processId, aMessage, EFalse);
+
+	User::LeaveIfError(Server().iKernelDriver.KillProcess( processId, reason ));
+
+	aMessage.Complete(KErrNone);
+	}
+
+/** Gets the secure id of aFileName
+  @param aFileName file name of executable to get SID for
+  @param aSecureId on return will contain the SID of aFileName
+
+  @leave one of the system wide error codes
+  */
+void CSecuritySvrSession::GetSecureIdL(const TDesC& aFileName, TUid& aSecureId)
+	{
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+
+	RFile targetExe;
+	OpenFileHandleL(aFileName, fs, targetExe);
+	CleanupClosePushL(targetExe);
+
+	// Read in the entire header
+	RBuf8 e32HdrBuf;
+	e32HdrBuf.CreateL(RLibrary::KRequiredImageHeaderSize);
+	e32HdrBuf.CleanupClosePushL();
+
+	// Read the entire header as far as possible
+	TInt err = targetExe.Read(e32HdrBuf);
+	if (err != KErrNone)
+		{
+		// Could not read the file 
+		LOG_MSG("CSecuritySvrSession::GetSecureIdL - Failed to read executable\n");
+
+		User::Leave(err);
+		}
+
+	if(!CheckSufficientData(e32HdrBuf, IsExecutableXipL(targetExe)))
+		{
+		User::Leave(KErrGeneral);
+		}
+
+	aSecureId = GetSecureIdL(e32HdrBuf, IsExecutableXipL(targetExe));
+
+	CleanupStack::PopAndDestroy(3, &fs);
+	}
+
+/** Get the secure id from aHeaderData
+  @param aHeaderData an executable's header data to read SID from
+  @param aXip indication of whether the header data is from an XIP file
+
+  @return secure ID from aHeaderData
+  */
+TUid CSecuritySvrSession::GetSecureIdL(const TDesC8& aHeaderData, TBool aXip)
+	{
+	if(!CheckSufficientData(aHeaderData, aXip))
+		{
+		User::Leave(KErrGeneral);
+		}
+
+	if (aXip)
+		{
+		TRomImageHeader* hdr = (TRomImageHeader*)aHeaderData.Ptr();
+		return TUid::Uid(hdr->iS.iSecureId);
+		}
+	else
+		{
+		// it is an epoc32 image
+		E32ImageHeaderV* hdr = (E32ImageHeaderV*)aHeaderData.Ptr();
+		return TUid::Uid(hdr->iS.iSecureId);
+		}
+	}
+
+/**
+@param aMessage contains:
+ * aMessage.Ptr0() a TListDetails object
+ * aMessage.Ptr1() a client supplied TDes8 for the driver to return data in
+ * aMessage.Ptr2() a TUint32 for the driver to return the size of the requested listing's data in
+
+@leave KErrTooBig if the buffer passed as argument 1 of aMessage is too
+       small to contain the requested data,
+       KErrNoMemory if a temporary buffer could not be allocated,
+       or one of the other system wide error codes
+*/
+void CSecuritySvrSession::GetListL(const RMessage2& aMessage)
+	{
+	LOG_MSG("CSecuritySvrSession::GetListL()");
+
+	// buffer to write list data into before copying back to agent
+	RBuf8 listDetailsBuf;
+
+	//allocate buffer
+	listDetailsBuf.CreateL(sizeof(TListDetails));
+
+	// Do the right cleanup if anything subsequently goes wrong
+	listDetailsBuf.CleanupClosePushL();
+
+	//read the data from the client thread
+	aMessage.ReadL(0, listDetailsBuf);
+	TListDetails* listDetails = (TListDetails*)listDetailsBuf.Ptr();
+
+	//get the type of list requested
+	TListId type = (TListId)aMessage.Int0();
+
+	//create a buffer to store the data in
+	RBuf8 buffer;
+	buffer.CreateL(aMessage.GetDesMaxLength(1));
+	buffer.CleanupClosePushL();
+
+	//create a temporary variable to potentially store data length in
+	TUint32 size = 0;
+
+	TInt err = KErrNone;
+
+	// the executables list is generated in the DSS rather than in the driver
+	// so is treated separately
+	if(listDetails->iListId == EExecutables)
+		{
+		if(listDetails->iListScope != EScopeGlobal)
+			{
+			User::Leave(KErrArgument);
+			}
+		if(listDetails->iTargetId != 0)
+			{
+			User::Leave(KErrArgument);
+			}
+		err = GetExecutablesListL(buffer, size);
+		}
+	else
+		{
+		err = Server().iKernelDriver.GetList(listDetails->iListId, listDetails->iListScope, listDetails->iTargetId, iDebugAgentProcessId, buffer, size);
+		}
+
+	if(err == KErrNone)
+		{
+		//write the list data back
+		aMessage.WriteL(1, buffer);
+		}
+
+	TPtr8 sizePtr((TUint8*)&size, sizeof(TUint32), sizeof(TUint32));
+	//write size back to agent
+	aMessage.WriteL(2, sizePtr);
+
+	CleanupStack::PopAndDestroy(&buffer);
+	CleanupStack::PopAndDestroy(&listDetailsBuf);
+
+	aMessage.Complete(err);
+	}
+
+/**
+Gets the executables list and returns it in aBuffer if it's big enough
+
+@param aBuffer caller supplied buffer to write data into
+@param aSize on return contains the size of the data in the buffer, or the
+       size that the buffer would need to be to contain the data
+
+@return KErrNone on success, or KErrTooBig if the requested data will not fit in aBuffer
+
+@leave one of the system wide error codes
+*/
+TInt CSecuritySvrSession::GetExecutablesListL(TDes8& aBuffer, TUint32& aSize) const
+	{
+	LOG_MSG("CSecuritySvrSession::GetExecutablesList()");
+
+	//initialise values and connect to file system
+	aSize = 0;
+	aBuffer.SetLength(0);
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+
+	// uids corresponding to executable image
+	TUidType uids(KExecutableImageUid, KNullUid, KNullUid);
+
+	//create a string containing the directory name. The drive letter is represented
+	//by X but will be replaced by the appropriate drive letter for each drive
+	_LIT(KColonSysBin,":\\sys\\bin\\");
+
+	//create a modifiable copy of KColonSysBin, preceeded by an empty space for the drive letter
+	RBuf dirName;
+	dirName.CreateL(1 + KColonSysBin().Length());
+	dirName.CleanupClosePushL();
+
+	//set the length to 1 (to later fill with the drive letter) and then append KColonSysBin
+	dirName.SetLength(1);
+	dirName.Append(KColonSysBin());
+
+	//get the list of valid drives for the device
+	TDriveList driveList;
+	User::LeaveIfError(fs.DriveList(driveList));
+
+	//check each valid sys/bin directory for executables
+	for(TInt i=0; i<KMaxDrives; i++)
+		{
+		//if the drive is not valid then skip this drive
+		if(!driveList[i])
+			{
+			//skip processing this drive
+			continue;
+			}
+
+		//get the drive letter and insert it as the drive letter for dirName
+		TChar driveLetter;
+		User::LeaveIfError(fs.DriveToChar(i, driveLetter));
+		dirName[0] = (TUint)driveLetter;
+
+		//get a list of the exes in this drive's sys/bin directory
+		CDir* localDir = NULL;
+		TInt err = fs.GetDir(dirName, uids, ESortByName, localDir);
+		if(KErrNoMemory == err)
+			{
+			User::Leave(err);
+			}
+		if(!localDir)
+			{
+			//skip processing this drive
+			continue;
+			}
+
+		//push onto cleanup stack in case we leave
+		CleanupStack::PushL(localDir);
+
+		//iterate through the files
+		for(TInt j=0; j<localDir->Count(); j++)
+			{
+			//will store x:\sys\bin\<file-name> type string
+			RBuf fullPathName;
+
+			TUint16 nameLength = dirName.Length() + (*localDir)[j].iName.Length();
+			fullPathName.CreateL(nameLength);
+			fullPathName.CleanupClosePushL();
+			fullPathName.Copy(dirName);
+			fullPathName.Append((*localDir)[j].iName);
+
+			//add the data to the buffer
+			AppendExecutableData(aBuffer, aSize, fullPathName);
+
+			//do cleanup
+			CleanupStack::PopAndDestroy(&fullPathName);
+			}
+
+		//do cleanup
+		CleanupStack::PopAndDestroy(localDir);
+		}
+
+	//do cleanup
+	CleanupStack::PopAndDestroy(2, &fs);
+
+	//return appropriate value as to whether the kernel's data was too big
+	return (aSize <= aBuffer.MaxLength()) ? KErrNone : KErrTooBig;
+	}
+
+
+/**
+  Append data to aBuffer and update size of aSize if the data will fit. If it will
+  not fit then just puts the nee size in aSize.
+
+  @param aBuffer buffer to append the data to
+  @param aSize on return contains the new size of the buffer if the data could be
+  appended, otherwise aSize is updated to reflect the size the buffer would have if
+  the data had fitted.
+  @param aEntryName file name of the entry to add to the buffer
+  */
+void CSecuritySvrSession::AppendExecutableData(TDes8& aBuffer, TUint32& aSize, const TDesC& aEntryName) const
+	{
+	//update aSize to include the size of the data for this entry
+	aSize = Align4(aSize + sizeof(TExecutablesListEntry) + (2*aEntryName.Length()) - sizeof(TUint16));
+
+	//if the data will fit, and we haven't already stopped putting data in, then append the data,
+	//if we've stopped putting data in then aSize will be bigger than aBuffer.MaxLength()
+	if(aSize <= aBuffer.MaxLength())
+		{
+		TExecutablesListEntry& entry = *(TExecutablesListEntry*)(aBuffer.Ptr() + aBuffer.Length());
+		//check whether an agent has registered to actively debug fullPathName
+		TBool activelyDebugged = IsDebugged(aEntryName, EFalse);
+		entry.iIsActivelyDebugged = activelyDebugged ? 1 : 0;
+
+		//check whether any agents have registered to passively debug fullPathName
+		TBool passivelyDebugged = IsDebugged(aEntryName, ETrue);
+		entry.iIsPassivelyDebugged = passivelyDebugged ? 1 : 0;
+
+		entry.iNameLength = aEntryName.Length();
+		TPtr name(&(entry.iName[0]), aEntryName.Length(), aEntryName.Length());
+		name = aEntryName;
+		//pad the buffer to a four byte boundary
+		aBuffer.SetLength(aSize);
+		}
+	}
+/**
+Helper function
+
+Write data back to the thread that owns aMessage
+
+@param aMessage the message which is passed between processes
+@param aIndex the message slot which the data will be passed back in
+@param aPtr pointer to data in this thread to be written into aMessage
+@param aPtrSize size in bytes of the data to be written
+
+@leave one of the system wide error codes
+*/
+void CSecuritySvrSession::WriteDataL(const RMessage2& aMessage, const TInt aIndex, const TAny* aPtr, const TUint32 aPtrSize) const
+	{
+	TPtr8 dataPtr((TUint8*)aPtr, aPtrSize, aPtrSize);
+
+	aMessage.WriteL(aIndex, dataPtr);
+	}
+
+/**
+Helper function.
+
+Checks whether the debug agent (the owner of the aMessage) is attached to the
+thread with thread id of aThreadId.
+
+@param aThreadId thread ID of target debug thread
+@param aMessage message owned by the debug agent
+@param aPassive indicates whether to check if attached passively or actively
+
+@leave KErrPermissionDenied if the agent is not attached to the process,
+       KErrNoMemory if the security server could not be accessed
+*/
+void CSecuritySvrSession::CheckAttachedL(const TThreadId aThreadId, const RMessage2& aMessage, const TBool aPassive) const
+	{
+	//check that the agent has attached to the target process
+	if(! Server().CheckAttached(aThreadId, aMessage, aPassive))
+		{
+		LOG_MSG("CSecuritySvrSession::CheckAttachedL() failed");
+		User::Leave(KErrPermissionDenied);
+		}
+	}
+
+/**
+Helper function.
+
+Checks whether the debug agent (the owner of the aMessage) is attached to the
+process with process id of aProcessId.
+
+@param aProcessId process ID of target debug thread
+@param aMessage message owned by the debug agent
+@param aPassive indicates whether to check if attached passively or actively
+
+@leave KErrPermissionDenied if the agent is not attached to the process,
+       KErrNoMemory if the security server could not be accessed
+*/
+void CSecuritySvrSession::CheckAttachedL(const TProcessId aProcessId, const RMessage2& aMessage, const TBool aPassive) const
+	{
+	
+	//check that the agent has attached to the target process
+	if(! Server().CheckAttached(aProcessId, aMessage, aPassive))
+		{
+		LOG_MSG("CSecuritySvrSession::CheckAttachedL() (process) failed");
+		User::Leave(KErrPermissionDenied);
+		}
+	}
+
+/**
+Check whether the debug agent is permitted to attach to the target process.
+Note that this function does not actually attach the agent to the process, it
+simply tests whether an attach call would potentially be successful.
+
+Currently this method returns ETrue in all cases but will be updated once
+the security checking framework is in place.
+
+@param aDebugAgentProcessId process id of the debug agent
+@param aTargetProcessName original file name of the target process
+
+@return ETrue if the debug agent would be allowed to attch to the target process,
+        EFalse otherwise
+*/
+TBool CSecuritySvrSession::PermitDebugL(const TProcessId aDebugAgentProcessId, const TDesC& aTargetProcessName) const
+	{
+	return ETrue;
+	}
+
+/**
+Helper function
+
+Validates that the memory info passed in meets the debug driver's requirements
+
+@param aMemoryInfo memory info passed in from client
+
+@leave KErrArgument if:
+	  * size is zero
+	  * size is greater than the max block size
+	  * size + address > 0xffffffff
+	  * address is not access size aligned
+	  * size is not a multiple of the access size
+	KErrNotSupported if:
+	  * iAccess is not TAccess::EAccess32
+	  * iEndianess is not TEndianess::EEndLE8
+	KErrUnknown if:
+	  * the max memory block size cannot be determined
+        or one of the other system wide error codes
+*/
+void CSecuritySvrSession::ValidateMemoryInfoL(const TThreadId aThreadId, const TMemoryInfo &aMemoryInfo, const TBool aReadOperation)
+	{
+	//check size is not 0
+	if(aMemoryInfo.iSize == 0)
+		User::Leave(KErrArgument);
+
+	//get the max block size supported
+	TUint32 maxSize = 0;
+	User::LeaveIfError(Server().iKernelDriver.GetMemoryOperationMaxBlockSize(maxSize));
+
+	//check that the block size given is less than the max block size
+	if(aMemoryInfo.iSize > maxSize)
+		User::Leave(KErrArgument);
+
+	//must ensure that address + size <= 0xffffffff as will attempt to
+	//read past 0xffffffff, which wouldn't be good
+	TUint32 maxAddress = (~aMemoryInfo.iSize) + 1;
+	if(aMemoryInfo.iAddress > maxAddress)
+		User::Leave(KErrArgument);
+
+	//check that arguments are supported
+	if(aMemoryInfo.iAccess != EAccess32)
+		User::Leave(KErrNotSupported);
+
+	if(aMemoryInfo.iEndianess != EEndLE8)
+		User::Leave(KErrNotSupported);
+
+	//check that address is multiple of access size
+	TInt addressIndicator = aMemoryInfo.iAddress % aMemoryInfo.iAccess;
+	if(addressIndicator != 0)
+		{
+		User::Leave(KErrArgument);
+		}
+
+	//check that size is multiple of access size
+	TInt sizeIndicator = aMemoryInfo.iSize % aMemoryInfo.iAccess;
+	if(sizeIndicator != 0)
+		User::Leave(KErrArgument);
+	}
+
+/**
+Helper function
+
+Validates that the three buffers relating to reading register data are of
+appropriate sizes, and calculates the number of registers being requested.
+
+@param aMessage message which in offsets 1, 2 and 3 contains descriptors
+@param aNumberOfRegisters if the function returns with KErrNone this will
+       contain the number of registers being requested, guaranteed to be non-zero
+
+@leave KErrArgument if descriptors do not represent the same number of
+       registers, if any of the descriptors have max length of 0, if any of
+       the descriptors have max lengths which are not multiples of their data
+       type's size or if any of the descriptors have max lengths greater than
+       the max block size for memory operations
+       or one of the other system wide error codes if there were problems 
+       in getting the descriptors' lengths.
+*/
+void CSecuritySvrSession::ValidateRegisterBuffersL(const RMessage2& aMessage, TUint32& aNumberOfRegisters)
+	{
+	//get lengths of buffers, if error occurs returned value will be less then zero
+	TInt idsBufferLength = aMessage.GetDesMaxLength(1);
+	if(idsBufferLength < 0)
+		{
+		User::Leave(idsBufferLength);
+		}
+	TInt valuesBufferLength = aMessage.GetDesMaxLength(2);
+	if(valuesBufferLength < 0)
+		{
+		User::Leave(valuesBufferLength);
+		}
+	TInt flagsBufferLength = aMessage.GetDesMaxLength(3);
+	if(flagsBufferLength < 0)
+		{
+		User::Leave(flagsBufferLength);
+		}
+
+	//get the max block size supported
+	TUint32 maxSize = 0;
+	User::LeaveIfError(Server().iKernelDriver.GetMemoryOperationMaxBlockSize(maxSize));
+
+	//check none of the descriptors have size greater than the max block size
+	if((idsBufferLength > maxSize) || (valuesBufferLength > maxSize) || (flagsBufferLength > maxSize))
+		User::Leave(KErrArgument);
+
+	//get sizes of the three types of data the buffers represent arrays of
+	//and validate that the buffer lengths are multiples of the data sizes
+	TUint idSize = sizeof(TRegisterInfo);
+	if(idsBufferLength % idSize != 0)
+		User::Leave(KErrArgument);
+
+	TUint flagSize = sizeof(TUint8);
+	if(flagsBufferLength % flagSize != 0)
+		User::Leave(KErrArgument);
+
+	//perform check on id buffer length
+	if(idsBufferLength == 0)
+		User::Leave(KErrArgument);
+
+	//calculate number of registers being requested
+	aNumberOfRegisters = idsBufferLength / idSize;
+
+	//check flags buffer is of appropriate size
+	if(flagsBufferLength != (aNumberOfRegisters * flagSize))
+		User::Leave(KErrArgument);
+	}
+
+/**
+Establish whether any agents have registered to debug the specified aFileName
+
+@param aFileName originating file name of the target process
+@param aPassive indicates whether to check if there has been active attachment,
+or passive attachment.
+
+@return ETrue if aFileName is being debugged, EFalse otherwise
+
+*/
+TBool CSecuritySvrSession::IsDebugged(const TDesC& aFileName, const TBool aPassive) const
+	{
+	//check whether the target process is being debugged
+	return Server().IsDebugged(aFileName, aPassive);
+	}
+
+/**
+  Helper function which reads a TThreadId object from a client
+
+  @param aMessage the message object containing the reference to the TThreadId
+  @param aIndex the message argument containing the reference
+
+  @return the TThreadId passed in by the client
+  @leave KErrArgument if aIndex is outside of the valid range
+  */
+TThreadId CSecuritySvrSession::ReadTThreadIdL(const RMessagePtr2& aMessage, const TInt aIndex) const
+	{
+	//create a temporary TThreadId to read the data into
+	TThreadId tempThreadId;
+	TPtr8 threadIdPtr((TUint8*)&tempThreadId, sizeof(TThreadId));
+
+	// read the data in from the client
+	aMessage.ReadL(aIndex, threadIdPtr);
+
+	return tempThreadId;
+	}
+
+/**
+  Helper function which reads a TProcessId object from a client
+
+  @param aMessage the message object containing the reference to the TProcessId
+  @param aIndex the message argument containing the reference
+
+  @return the TProcessId passed in by the client
+  @leave KErrArgument if aIndex is outside of the valid range
+  */
+TProcessId CSecuritySvrSession::ReadTProcessIdL(const RMessagePtr2& aMessage, const TInt aIndex) const
+	{
+	//create a temporary TProcessId to read the data into
+	TProcessId tempProcessId;
+	TPtr8 processIdPtr((TUint8*)&tempProcessId, sizeof(TProcessId));
+
+	// read the data in from the client
+	aMessage.ReadL(aIndex, processIdPtr);
+
+	return tempProcessId;
+	}
+
+// End of file - c_security_svr_session.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/src/c_shutdown_timer.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,65 @@
+// 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 the License "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:
+// Provides the debug security server's shutdown timer implementation
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#include <rm_debug_api.h>
+#include "c_shutdown_timer.h"
+#include "rm_debug_logging.h"
+
+/**
+Constructor. Adds the timer to the thread's active scheduler,
+*/
+CShutdownTimer::CShutdownTimer()
+	:CTimer(KActivePriorityShutdown)
+	{
+	LOG_MSG("CShutdownTimer::CShutdownTimer()\n");
+	CActiveScheduler::Add(this);
+	}
+
+/**
+Initialisation of timer
+*/
+void CShutdownTimer::ConstructL()
+	{
+	LOG_MSG("CShutdownTimer::ConstructL()\n");
+	CTimer::ConstructL();
+	}
+
+/**
+Starts the timer which would expire after KShutdownDelay
+*/
+void CShutdownTimer::Start()
+	{
+	LOG_MSG("CShutdownTimer::Start()\n");
+	After(KShutdownDelay);
+	}
+
+/**
+Stops the active scheduler. Stopping the active scheduler effectively closes
+the Debug Security Server
+*/
+void CShutdownTimer::RunL()
+	{
+	LOG_MSG("CShutdownTimer::RunL()\n");
+	CActiveScheduler::Stop();
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debugsrv/runmodedebug/securityserver/src/rm_debug_svr.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,81 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Entry point to debug security server, sets up server/session
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#include <e32base.h>
+#include <e32base_private.h>
+#include <rm_debug_api.h>
+
+#include "c_security_svr_server.h"
+#include "c_security_svr_session.h"
+#include "rm_debug_logging.h"
+
+using namespace Debug;
+
+/**
+Perform all server initialisation, in particular creation of the
+scheduler and server and then run the scheduler
+*/
+void RunServerL()
+	{
+	LOG_MSG( "rm_debug_svr.cpp::RunServerL() : -> new(ELeave) CActiveScheduler\n" );
+	CActiveScheduler* s=new(ELeave) CActiveScheduler;
+
+	LOG_MSG( "rm_debug_svr.cpp::RunServerL() : -> CleanupStack::PushL(s)\n" );
+	CleanupStack::PushL(s);
+
+	LOG_MSG( "rm_debug_svr.cpp::RunServerL() : -> CActiveScheduler::Install()\n" );
+	CActiveScheduler::Install(s);
+
+	LOG_MSG( "rm_debug_svr.cpp::RunServerL() : -> CSecuritySvrServer::NewLC()\n" );
+	CSecuritySvrServer::NewLC();
+
+	LOG_MSG( "rm_debug_svr.cpp::RunServerL() : -> Rendezvous(KErrNone)\n" );
+	// Signal whoever has started us that we have done so.
+	RProcess::Rendezvous(KErrNone);
+	LOG_MSG( "rm_debug_svr.cpp::RunServerL() : <- Rendezvous()\n" );
+
+	LOG_MSG( "rm_debug_svr.cpp::RunServerL() : -> CActiveScheduler::Start()\n" );
+	CActiveScheduler::Start();
+	LOG_MSG( "rm_debug_svr.cpp::RunServerL() <- CActiveScheduler::Start()\n" );
+
+	LOG_MSG( "rm_debug_svr.cpp::RunServerL() : -> CleanupStack::PopAndDestroy()\n" );
+	CleanupStack::PopAndDestroy(2, s);
+	LOG_MSG( "rm_debug_svr.cpp::RunServerL() : <- CleanupStack::PopAndDestroy()\n" );
+	}
+
+/**
+Entry point for debug security server
+*/
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup=CTrapCleanup::New();
+	TInt r = KErrNoMemory;
+	if (cleanup)
+		{
+		TRAP(r,RunServerL());
+		delete cleanup;
+		}
+	__UHEAP_MARKEND;
+	return r;
+	}
--- a/group/bld.inf	Thu Aug 19 11:25:43 2010 +0300
+++ b/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -19,8 +19,6 @@
 */
 
 #include "../osrndtools_plat/group/bld.inf"
-//#include "../stif/group/bld.inf"
 #include "../memspy/group/bld.inf"
-//#include "../hti/group/bld.inf"
 #include "../piprofiler/group/bld.inf"
 #include "../analyzetool/group/bld.inf"
\ No newline at end of file
--- a/layers.sysdef.xml	Thu Aug 19 11:25:43 2010 +0300
+++ b/layers.sysdef.xml	Tue Aug 31 16:45:49 2010 +0300
@@ -7,7 +7,15 @@
   <systemModel>
     <layer name="os_layer">
       <module name="osrndtools">
-        <unit unitID="tools.osrndtools" mrp="" bldFile="&layer_real_source_path;/group" name="osrndtools" />
+      	<component name="osrndtools">
+        	<unit unitID="tools.osrndtools" mrp="" bldFile="&layer_real_source_path;/group" name="osrndtools" />
+        </component>
+        <component name="tracecompiler">
+          <unit unitID="tools.tracecompiler" mrp="" bldFile="&layer_real_source_path;/tracefw/tracecompiler/group" name="tracecompiler" />
+        </component>
+        <component name="runmodedebug">
+          <unit unitID="tools.runmodedebug" mrp="" bldFile="&layer_real_source_path;/debugsrv/runmodedebug/group" name="runmodedebug" />
+        </component>        
       </module>
     </layer>
   </systemModel>
--- a/memspy/CommandLine/Include/MemSpyCommandLine.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/CommandLine/Include/MemSpyCommandLine.h	Tue Aug 31 16:45:49 2010 +0300
@@ -22,6 +22,9 @@
 #include <e32base.h>
 #include <f32file.h>
 #include <badesca.h>
+#include <e32cons.h>
+
+#include "MemSpyCommands.h"
 
 #ifdef _DEBUG
 #   define TRACE( x ) x
@@ -36,21 +39,28 @@
 class RFs;
 class CCommandLineArguments;
 class RMemSpyEngineClientInterface;
+class CConsoleBase;
+class RMemSpySession;
 
-class CMemSpyCommandLine : public CBase
+class CMemSpyCommandLine :  public CActive
     {
 public:
-    static CMemSpyCommandLine* NewLC();
+    //static CMemSpyCommandLine* NewLC();
+	static CMemSpyCommandLine* NewLC( CConsoleBase& aConsole );
     ~CMemSpyCommandLine();
 
 private:
-    CMemSpyCommandLine();
+    //CMemSpyCommandLine();
+    CMemSpyCommandLine( CConsoleBase& aConsole );
     void ConstructL();
 
 public: // API
-    void PerformBatchL( const TDesC& aFileName );
+    //void PerformBatchL( const TDesC& aFileName ); 	//support of the batch files removed 
     void PerformOpL( const CCommandLineArguments& aCommandLine );
     void PerformSingleOpL( const TDesC& aCommand, const CDesCArray& aParameters );
+    //
+    //AO request method
+    void WaitForInput();
 
 private: // Internal methods
     void ConnectToMemSpyL();
@@ -60,10 +70,26 @@
     TInt FindBatchFile( TDes &aFileName );
     TInt FindFile( TDes &aFileName, const TDesC &aDirPath );
 
+private: // Console write methods
+    void RedrawInputPrompt();
+    void RedrawStatusMessage();
+    void RedrawStatusMessage( const TDesC& aMessage );
+    void ProcessCommandBufferL();
+    void RunL(); // from CActive
+    TInt RunError( TInt aError );
+    void DoCancel();
+    
 private: // Data members
     RFs iFsSession;
     RMemSpyEngineClientInterface* iMemSpy;
+    RMemSpySession* iMemSpySession;
     TBool iIsBatch; // For avoiding recursion
+    
+private: // Data members - console - write status messages
+    CConsoleBase& iConsole;
+    TPoint iCommandPromptPos;
+    TPoint iStatusMessagePos;
+    TBuf<KMemSpyMaxInputBufferLength> iCommandBuffer;
     };
 
 
--- a/memspy/CommandLine/Include/MemSpyCommands.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/CommandLine/Include/MemSpyCommands.h	Tue Aug 31 16:45:49 2010 +0300
@@ -18,39 +18,77 @@
 #ifndef MEMSPYCOMMANDS_H
 #define MEMSPYCOMMANDS_H
 
+// Literal constants
+_LIT( KMemSpyCLINewLine, "\r\n" );
+_LIT( KMemSpyCLIName, "MemSpy CommandLineInterpreter" );
+_LIT( KMemSpyCLIInputPrompt, " > %S" );
+_LIT( KMemSpyCLIWildcardCharacter, "*" );
 
-// Literal constants
-_LIT( KMemSpyCmdHeapDump, "CmdHeap_Dump" );
-_LIT( KMemSpyCmdHeapDumpKernel, "CmdHeap_Dump_Kernel" );
-_LIT( KMemSpyCmdHeapCompact, "CmdHeap_Compact" );
-_LIT( KMemSpyCmdSWMTForceUpdate, "CmdSWMT_ForceUpdate" );
-_LIT( KMemSpyCmdSWMTReset, "CmdSWMT_Reset" );
-_LIT( KMemSpyCmdOpenFile, "CmdOpenFile" );
-_LIT( KMemSpyCmdContainer, "CmdContainer" );
-_LIT( KMemSpyCmdBitmapsSave, "CmdBitmaps_Save" );
-_LIT( KMemSpyCmdRamDisableAknIconCache, "CmdRAM_DisableAknIconCache" );
-_LIT( KMemSpyCmdOutputToFile, "CmdOutput_ToFile" );
-_LIT( KMemSpyCmdOutputToTrace, "CmdOutput_ToTrace" );
+// Numerical constants
+const TInt KMemSpyMaxDisplayLengthThreadName = 48;
+const TInt KMemSpyMaxDisplayLengthSizeText = 14;
+const TInt KMemSpyMaxInputBufferLength = 200;
+
+// Key constants (S60)
+const TInt KMemSpyUiS60KeyCodeButtonOk = 2000;
+const TInt KMemSpyUiS60KeyCodeButtonCancel = 2001;
+const TInt KMemSpyUiS60KeyCodeRockerEnter = 63557;
 
+// Status messages
+_LIT( KOutputChangeMessage, "Change output mode opetarion in progress" );
+_LIT( KHeapDumpMessage, "Heap dump opetarion in progress" );
+_LIT( KSWMTMessage, "System Wide Memory Tracking opetarion in progress" );
 
-_LIT( KMemSpyCmdUiSendToBackground, "CmdUI_Background" );
-_LIT( KMemSpyCmdUiBringToForeground, "CmdUI_Foreground" );
+// Help text
+_LIT( KHelpMessage, "=== MemSpy CommandLineInterpreter Help ===\r\n" );
+_LIT( KHelpOutputCommand, "Change output mode to trace: 'memspy output trace'\r\n" );
+_LIT( KHelpOutputToFileCommand, "Change output mode to trace: 'memspy output file'\r\n" );
+_LIT( KHelpHeapDumpCommand, "Heap dump: 'memspy heapdup <all | kernel | user heap filter >'\r\n" );
+_LIT( KHelpSwmtCommand, "SWMT: 'memspy swmt <starttimer <value in seconds> | stop timer | dumpnow > <categories>'\r\n" );
+_LIT( KHelpKillServerCommand, "Kill server: 'memspy killserver'\r\n" );
+_LIT( KHelpCommand, "Press 'c' to continue" );
+
+//new commands
 
-_LIT( KMemSpyCmdUiExit, "CmdUI_Exit" );
+//HELP
+_LIT( KMemSpyCmdHelp1, "-?" );
+_LIT( KMemSpyCmdHelp2, "-h" );
+_LIT( KMemSpyCmdHelp3, "-help" );
+_LIT( KMemSpyCmdHelp4, "--help" );
+
+//OUTPUT
+_LIT( KMemSpyCmdOutput, "output" );
+_LIT( KMemSpyCmdOutputParameterTrace, "trace" );
+_LIT( KMemSpyCmdOutputParameterFile, "file" );
+//<directory> //parameter to be parsed
+
+//HEAP DUMP
+_LIT( KMemSpyCmdHeapDump, "heapdump" );
+_LIT( KMemSpyCmdHeapDumpParameterAll, "all" ); //default
+_LIT( KMemSpyCmdHeapDumpParameterKernel, "kernel" ); //kernel heap dump
 
-_LIT( KMemSpyCmdSWMTTypeHeap,                    "HEAP" );
-_LIT( KMemSpyCmdSWMTTypeChunk,                   "CHNK" );
-_LIT( KMemSpyCmdSWMTTypeCode,                    "CODE" );
-_LIT( KMemSpyCmdSWMTTypeStack,                   "STAK" );
-_LIT( KMemSpyCmdSWMTTypeGlobalData,              "GLOD" );
-_LIT( KMemSpyCmdSWMTTypeRamDrive,                "RAMD" );
-_LIT( KMemSpyCmdSWMTTypeOpenFile,                "FILE" );
-_LIT( KMemSpyCmdSWMTTypeDiskSpace,               "DISK" );
-_LIT( KMemSpyCmdSWMTTypeHandleGeneric,           "HGEN" );
-_LIT( KMemSpyCmdSWMTTypeFbserv,                  "FABS" );
-_LIT( KMemSpyCmdSWMTTypeFileServerCache,         "F32C" );
-_LIT( KMemSpyCmdSWMTTypeSystemMemory,            "SYSM" );
-_LIT( KMemSpyCmdSWMTTypeWindowGroup,             "WNDG" );
-_LIT( KMemSpyCmdSWMTTypeHeapFilter,              "HEAPFilter:" );
+//SWMT
+_LIT( KMemSpyCmdSwmt, "swmt" );
+_LIT( KMemSpyCmdSwmtParameterStarttimer, "starttimer" ); //<value in seconds> optionaly
+_LIT( KMemSpyCmdSwmtParameterStoptimer, "stoptimer" );
+_LIT( KMemSpyCmdSwmtParameterDumpnow, "dumpnow" );
+
+//KILL SERVER
+_LIT( KMemSpyCmdKillServer, "killserver"); //kills the server in case of it is running
 
+//SWMT CATEGORIES (TYPES)
+_LIT( KMemSpyCmdSWMTTypeHeap,                    "heap" );
+_LIT( KMemSpyCmdSWMTTypeChunk,                   "chnk" );
+_LIT( KMemSpyCmdSWMTTypeCode,                    "code" );
+_LIT( KMemSpyCmdSWMTTypeStack,                   "stak" );
+_LIT( KMemSpyCmdSWMTTypeGlobalData,              "glob" );
+_LIT( KMemSpyCmdSWMTTypeRamDrive,                "ramd" );
+_LIT( KMemSpyCmdSWMTTypeOpenFile,                "file" );
+_LIT( KMemSpyCmdSWMTTypeDiskSpace,               "disk" );
+_LIT( KMemSpyCmdSWMTTypeHandleGeneric,           "hgen" );
+_LIT( KMemSpyCmdSWMTTypeFbserv,                  "fabs" );
+_LIT( KMemSpyCmdSWMTTypeFileServerCache,         "f32c" );
+_LIT( KMemSpyCmdSWMTTypeSystemMemory,            "sysm" );
+_LIT( KMemSpyCmdSWMTTypeWindowGroup,             "wndg" );
+_LIT( KMemSpyCmdSWMTTypeAll,					 "all"	); //default value, dumps all categories expect heap dumps	
 #endif
--- a/memspy/CommandLine/Source/MemSpyCommandLine.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/CommandLine/Source/MemSpyCommandLine.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -21,148 +21,52 @@
 #include <bacline.h>
 #include <bautils.h>
 #include <memspyengineclientinterface.h>
+#include <memspysession.h>
 #include <memspy/engine/memspyenginehelpersysmemtrackerconfig.h>
 
 // User includes
 #include "MemSpyCommands.h"
 
-
+/*
 CMemSpyCommandLine::CMemSpyCommandLine()
-    {
+    {	
     }
+*/
 
+CMemSpyCommandLine::CMemSpyCommandLine( CConsoleBase& aConsole )
+	: CActive( EPriorityHigh ), iConsole( aConsole )
+    {	
+	CActiveScheduler::Add( this );
+    }
 
 CMemSpyCommandLine::~CMemSpyCommandLine()
     {
-    if ( iMemSpy )
+	Cancel();
+	
+    if ( iMemSpySession )
         {
-        iMemSpy->Close();
+        iMemSpySession->Close();
         }
-    delete iMemSpy;
+    delete iMemSpySession;
     iFsSession.Close();
     }
 
 
 void CMemSpyCommandLine::ConstructL()
     {
-    User::LeaveIfError( iFsSession.Connect() );
-    iMemSpy = new(ELeave) RMemSpyEngineClientInterface();
-    ConnectToMemSpyL();
+    User::LeaveIfError( iFsSession.Connect() );   
+    iMemSpySession = new(ELeave) RMemSpySession();
+    ConnectToMemSpyL();                    
     }
 
-
-CMemSpyCommandLine* CMemSpyCommandLine::NewLC()
+CMemSpyCommandLine* CMemSpyCommandLine::NewLC( CConsoleBase& aConsole )
     {
-    CMemSpyCommandLine* self = new(ELeave) CMemSpyCommandLine();
+    CMemSpyCommandLine* self = new(ELeave) CMemSpyCommandLine( aConsole );
     CleanupStack::PushL( self );
     self->ConstructL();
     return self;
     }
 
-
-void CMemSpyCommandLine::PerformBatchL( const TDesC& aFileName )
-    {
-    TInt err = KErrNone;
-    RFile file;
-    err = file.Open( iFsSession, aFileName, EFileRead );
-    TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformBatchL() - START - this: 0x%08x, openErr: %d, fileName: %S"), this, err, &aFileName ) );
-    User::LeaveIfError( err );
-
-    CleanupClosePushL( file );
-    CDesCArray* lines = ReadLinesL( file );
-    CleanupStack::PopAndDestroy( &file );
-    CleanupStack::PushL( lines );
-    
-    const TInt count = lines->Count();
-    TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformOpL() - got %d lines", count ) );
-    iIsBatch = ETrue;
-    for( TInt i=0; i<count; i++ )
-        {
-        const TPtrC pLine( (*lines)[ i ] );
-        TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformOpL() - processing line[%03d] \"%S\""), i, &pLine ) );
-    
-        // Must be at least 3 chars big, i.e. '[' and <command> and then ']'
-        if  ( pLine.Length() <= 2 || pLine[ 0 ] != '[' )
-            {
-            TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformOpL() - ignoring line: \"%S\""), &pLine ) );
-            }
-        else if  ( pLine[0] == '[' )
-            {
-            // Try to find end of command...
-            const TInt posOfClosingArgChar = pLine.Locate( ']' );
-            if  ( posOfClosingArgChar >= 2 )
-                {
-                // Get command
-                const TPtrC pCommand( pLine.Mid( 1, posOfClosingArgChar - 1 ) );
-                TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformOpL() - got command: %S"), &pCommand ) );
-
-                // Next, try to get any args
-                CDesCArrayFlat* args = new(ELeave) CDesCArrayFlat( 2 );
-                CleanupStack::PushL( args );
-
-                // There must be a mandatory space between closing ] and start of args...
-                // E.g.:
-                //
-                //  [CMD] ARG
-                //
-                const TInt remainderLength = pLine.Length() - posOfClosingArgChar;
-                if  ( remainderLength > 1 )
-                    {
-                    const TPtrC remainder( pLine.Mid( posOfClosingArgChar + 1 ) );
-                    TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformOpL() - got remainder: %S"), &pLine ) );
-
-                    // Extract arguments separated by tabs or space characters
-                    // and store in arguments array
-                    HBufC* argText = HBufC::NewLC( pLine.Length() + 1 );
-                    TPtr pArgText( argText->Des() );
-                    for( TInt j=0; j<remainder.Length(); j++ )
-                        {
-                        const TChar c( remainder[ j ] );
-                        //
-                        if  ( c == '\t' || c == ' ' )
-                            {
-                            pArgText.Trim();
-                            if  ( pArgText.Length() )
-                                {
-                                TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformOpL() - arg[%02d] %S"), args->Count(), &pArgText ) );
-                                args->AppendL( pArgText );
-                                pArgText.Zero();
-                                }
-                            }
-                        else
-                            {
-                            pArgText.Append( c );
-                            }
-                        }
-
-                    // Save leftovers...
-                    pArgText.Trim();
-                    if  ( pArgText.Length() )
-                        {
-                        TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformOpL() - arg[%02d] %S"), args->Count(), &pArgText ) );
-                        args->AppendL( pArgText );
-                        }
-
-                    CleanupStack::PopAndDestroy( argText );
-                    }
-
-                // Now we can perform the operation!
-                PerformSingleOpL( pCommand, *args );
-
-                CleanupStack::PopAndDestroy( args );
-                }
-            }
-
-        TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformOpL() - processing line: \"%S\""), &pLine ) );
-        }
-
-    iIsBatch = EFalse;
-    
-    CleanupStack::PopAndDestroy( lines );
-    TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformBatchL() - END - this: 0x%08x, fileName: %S"), this, &aFileName ) );
-    }
-
-
 void CMemSpyCommandLine::PerformOpL( const CCommandLineArguments& aCommandLine )
     {
     const TInt count = aCommandLine.Count();
@@ -218,125 +122,187 @@
     batchFile.Append( aCommand );
     
     TInt err = KErrNotSupported;
-    if  ( aCommand.CompareF( KMemSpyCmdSWMTForceUpdate ) == 0 )
-        {
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - SWMT_ForceUpdate", this ) );
-        if ( paramCount > 0 )
-            {
-            TInt categories( 0 );
-            TName threadNameFilter;
-            TRAP( err, ParseSWMTParametersL( aParameters, categories, threadNameFilter ) );            
-            if ( !err )
-                {
-                err = iMemSpy->SystemWideMemoryTrackerCategoriesSet( categories );
-                if ( !err && threadNameFilter.Length() > 0 )
-                    {
-                    err = iMemSpy->SystemWideMemoryTrackerThreadFilterSet( threadNameFilter );
-                    }
-                }
-            }
-        if ( !err )
-            {
-            err = iMemSpy->PerformOperation( EMemSpyClientServerOpSystemWideMemoryTrackingForceUpdate );
-            }
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdSWMTReset ) == 0 )
-        {
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - SWMT_Reset", this ) );
-        err = iMemSpy->PerformOperation( EMemSpyClientServerOpSystemWideMemoryTrackingReset );
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdHeapDumpKernel ) == 0 )
-        {
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Heap_DumpKernel", this ) );
-        err = iMemSpy->PerformOperation( EMemSpyClientServerOpHeapData, KMemSpyClientServerThreadIdKernel );
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdHeapCompact ) == 0 )
-        {
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Heap_Compact", this ) );
-        err = iMemSpy->PerformOperation( EMemSpyClientServerOpHeapInfoCompact );
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdContainer ) == 0 )
-        {
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Container", this ) );
-        err = iMemSpy->PerformOperation( EMemSpyClientServerOpEnumerateKernelContainerAll );
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdBitmapsSave ) == 0 )
-        {
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Bitmaps_Save", this ) );
-        err = iMemSpy->SaveAllBitmaps();
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdRamDisableAknIconCache ) == 0 )
-        {
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Ram_DisableAknIconCache", this ) );
-        err = iMemSpy->DisableAknIconCache();
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdOutputToFile ) == 0 )
-        {
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Output_ToFile", this ) );
-        err = iMemSpy->SwitchOutputModeFile();
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdOutputToTrace ) == 0 )
-        {
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Output_ToTrace", this ) );
-        err = iMemSpy->SwitchOutputModeTrace();
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdUiSendToBackground ) == 0 )
-        {
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - UI_Background", this ) );
-        err = iMemSpy->SendToBackground();
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdUiBringToForeground ) == 0 )
-        {
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - UI_Foreground", this ) );
-        err = iMemSpy->BringToForeground();
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdUiExit ) == 0 )
-        {
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - UI_Exit", this ) );
-        err = iMemSpy->Exit();
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdHeapDump ) == 0 )
-        {
-        if  ( paramCount == 0 )
-            {
-            // Dump heap data for all threads
-            TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Heap_Dump (all threads)", this ) );
-            err = iMemSpy->PerformOperation( EMemSpyClientServerOpHeapData );
-            }
-        else if ( paramCount >= 1 )
-            {
-            // Dump heap data for named thread
-            const TPtrC pThreadName( aParameters[ 0 ] );
-            TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Heap_Dump (%S)"), this, &pThreadName ) );
-            err = iMemSpy->PerformOperation( EMemSpyClientServerOpHeapData, pThreadName );
-            }
-        }
-    else if ( aCommand.CompareF( KMemSpyCmdOpenFile ) == 0 )
-        {
-        if  ( paramCount == 0 )
-            {
-            // Dump heap data for all threads
-            TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - OpenFile (all threads)", this ) );
-            err = iMemSpy->PerformOperation( EMemSpyClientServerOpOpenFiles );
-            }
-        else if ( paramCount >= 1 )
-            {
-            // Dump heap data for named thread
-            const TPtrC pThreadName( aParameters[ 0 ] );
-            TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - OpenFile (%S)"), this, &pThreadName ) );
-            err = iMemSpy->PerformOperation( EMemSpyClientServerOpOpenFiles, pThreadName );
-            }
-        }
-    else if ( !iIsBatch && FindBatchFile( batchFile ) == KErrNone )
-        {
-        TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Batch file: %S"), this, &batchFile ) );
-        PerformBatchL( batchFile );
-        }
-    else
-        {
-        TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Unsupported Command: %S"), this, &aCommand ) );
-        }
+    TInt error = KErrNotSupported;
+    
+    // --- HELP
+    if ( aCommand.CompareF( KMemSpyCmdHelp1) == 0 || 
+    	 aCommand.CompareF( KMemSpyCmdHelp2) == 0 ||
+    	 aCommand.CompareF( KMemSpyCmdHelp3) == 0 ||
+    	 aCommand.CompareF( KMemSpyCmdHelp4) == 0 )
+    	{
+		iConsole.Write( KHelpMessage );
+		iConsole.Write( KMemSpyCLINewLine );		
+		iConsole.Write( KHelpOutputCommand );
+		iConsole.Write( KHelpOutputToFileCommand );
+		iConsole.Write( KHelpHeapDumpCommand );
+		iConsole.Write( KHelpSwmtCommand );
+		iConsole.Write( KHelpKillServerCommand );
+		iConsole.Write( KMemSpyCLINewLine );
+		iConsole.Write( KHelpCommand );
 
+	    // Show input prompt.
+	    iCommandPromptPos = iConsole.CursorPos();
+	    RedrawInputPrompt();
+	    WaitForInput();
+	    
+	    CActiveScheduler::Start();
+    	}
+    // --- OUTPUT
+    //TODO: directory option to be added
+    else if  ( aCommand.CompareF( KMemSpyCmdOutput ) == 0 )	//change output mode   
+    	{    						
+		if( paramCount >= 1 )
+			{
+			if( aParameters[0].CompareF( KMemSpyCmdOutputParameterFile ) == 0 )
+				{
+				if( paramCount == 2 )
+					{
+					TBuf<KMaxFileName> directory;
+					directory.Copy( aParameters[1] );
+					iMemSpySession->SwitchOutputToFileL( directory );
+					}
+				else
+					{
+					iMemSpySession->SwitchOutputToFileL( KNullDesC );
+					}
+				}
+			else if( aParameters[0].CompareF( KMemSpyCmdOutputParameterTrace ) == 0)
+				{
+				TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Output Trace", this ) );
+				iMemSpySession->SwitchOutputToTraceL();
+				}
+			}		           
+    	}    	
+    // --- HEAP DUMP    
+    else if ( aCommand.CompareF( KMemSpyCmdHeapDump) == 0 )    	
+		{		
+		RedrawStatusMessage( KHeapDumpMessage );
+		
+		if( paramCount == 0 ) // no parameter - dump all heap data + kernel heap at the end
+			{		
+		
+			TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Heap_Dump (all threads)", this ) );			
+			// Dump heap data for all threads - Thread agnostic operation					
+			iMemSpySession->OutputHeapData();
+			// Dump kernel heap data
+			iMemSpySession->OutputThreadHeapDataL( KMemSpyClientServerThreadIdKernel );					
+			}
+		else if( paramCount >= 1)
+			{
+			if( aParameters[0].CompareF( KMemSpyCmdHeapDumpParameterAll ) == 0 )
+				{
+				iMemSpySession->OutputHeapData();				
+				iMemSpySession->OutputThreadHeapDataL( KMemSpyClientServerThreadIdKernel );				
+				}
+			else if( aParameters[0].CompareF( KMemSpyCmdHeapDumpParameterKernel ) == 0 )
+				{
+				TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Heap_DumpKernel", this ) );
+				iMemSpySession->OutputThreadHeapDataL( KMemSpyClientServerThreadIdKernel );				
+				}
+			else
+				{				
+				// Dump heap data for named thread - filter
+				const TPtrC pThreadName( aParameters[0] );
+				TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - Heap_Dump (%S)"), this, &pThreadName ) );				
+				iMemSpySession->OutputThreadHeapDataL( pThreadName );
+				}
+  			}
+		}
+    
+    // --- SYSTEM WIDE MEMORY TRACKING    
+    else if( aCommand.CompareF( KMemSpyCmdSwmt ) == 0 )
+    	{    
+		RedrawStatusMessage( KSWMTMessage );
+    		
+		TInt categories( 0 );
+		TName threadNameFilter;
+		
+		if( paramCount == 0 ) //default state -> "dumpnow" command with "all" categories
+			{
+			TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - this: 0x%08x - dumpnow command", this ) );
+			TInt category = TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryAll;
+			iMemSpySession->SetSwmtCategoriesL( category );			
+			iMemSpySession->ForceSwmtUpdateL();			
+			}
+		else if( paramCount >= 1)
+			{
+			const TPtrC pParam( aParameters[0] );
+			if( pParam.CompareF( KMemSpyCmdSwmtParameterStarttimer) == 0 ) // "starttimer" - start tracking
+				{
+				TInt result(0);
+				categories = TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryAll;
+				iMemSpySession->SetSwmtTimerIntervalL( KMemSpySysMemTrackerConfigMinTimerPeriod );
+				
+				if( paramCount >= 2 ) // user gave some optional parameters - <categories> or <value in seconds>
+					{					
+					TLex lex( aParameters[1] );
+				    if ( lex.Val( result ) == KErrNone ) //if 2nd parameter is not number, then parse parameters
+				    	{
+						if( result >= KMemSpySysMemTrackerConfigMinTimerPeriod && result <= KMemSpySysMemTrackerConfigMaxTimerPeriod )
+							{
+							iMemSpySession->SetSwmtTimerIntervalL( result );							;
+							}											
+				    	}				   
+				    TRAP( err, ParseSWMTParametersL( aParameters, categories, threadNameFilter) );
+					}																				
+				
+				//if( !err )
+				//	{
+					/*
+					_LIT( KPressS, "Press 's' to stop the timer " );
+					iConsole.Write( KPressS );
+					
+					iCommandPromptPos = iConsole.CursorPos();					
+					RedrawInputPrompt();					
+					WaitForInput();
+					*/
+					    
+					iMemSpySession->StartSwmtTimerL();
+					
+					//CActiveScheduler::Start();									
+				//	}	
+				}
+			else if( pParam.CompareF( KMemSpyCmdSwmtParameterStoptimer) == 0 ) // "stoptime" - stop tracking
+				{
+				iMemSpySession->StopSwmtTimerL();
+				}
+			else if( pParam.CompareF( KMemSpyCmdSwmtParameterDumpnow ) == 0 ) // "dumpnow" - runs one tracking cycle (CmdSWMT_ForceUpdate before)
+				{
+				categories = TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryAll;
+				if( paramCount >= 2 ) // user gave some optional parameters - <categories>
+					{
+					TRAP( err, ParseSWMTParametersL( aParameters, categories, threadNameFilter) );
+					}				
+																
+				if( !err )
+					{
+					iMemSpySession->SetSwmtCategoriesL( categories );
+					iMemSpySession->ForceSwmtUpdateL();
+					}												
+				}							
+			else //no parameters ("starttimer / stoptimer / dumpnow"), just categories / thread filter
+				 //so dumpnow is used as default with category / thread specified
+				{
+				TRAP( err, ParseSWMTParametersL( aParameters, categories, threadNameFilter) );
+				if( !err )
+					{
+					iMemSpySession->SetSwmtCategoriesL( categories );
+					if( threadNameFilter.Length() > 0 )
+						{
+						iMemSpySession->SetSwmtFilter( threadNameFilter );
+						}
+					}								
+					iMemSpySession->ForceSwmtUpdateL();				
+				}
+			}
+    	}
+    // --- KILL SERVER
+    else if ( aCommand.CompareF( KMemSpyCmdKillServer ) == 0 )
+    	{    
+    	}
+    
+   // RedrawStatusMessage();   
+    
     TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::PerformSingleOpL() - END - err: %d, this: 0x%08x, cmd: %S" ), err, this, &aCommand ) );
 
     // Calculate duration
@@ -364,7 +330,7 @@
     {
     TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::ConnectToMemSpyL() - START - this: 0x%08x", this ) );
 
-    TInt err = iMemSpy->Connect();
+    TInt err = iMemSpySession->Connect();
     TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::ConnectToMemSpyL() - connect #1 err: %d, this: 0x%08x", err, this ) );
 
     if  ( err == KErrNotFound )
@@ -390,47 +356,48 @@
 
     TInt err = KErrGeneral;
     RProcess proc;
-
-    // First try with s60 UI
-    err = proc.Create( KMemSpyProcessName1, KNullDesC );
-    if  ( err == KErrNone )
-        {
-        TFullName fullName;
-        proc.FullName( fullName );
-        TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - Create S60 UI process successfully... - this: 0x%08x, name: %S"), this, &fullName ) );
+    
+    // Try to run server first
+    err = proc.Create( KMemSpyProcessName0, KNullDesC );
+    if ( err == KErrNone )
+    	{
+		TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - Create server process successfully... - this: 0x%08x", this ) );
 
-        TRequestStatus status;
-        proc.Rendezvous( status );
-        proc.Resume();
+		TRequestStatus status;
+		proc.Rendezvous( status );
+		proc.Resume();
+
+		TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - MemSpy resumed, waiting for Rendezvous... - this: 0x%08x", this ) );
 
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - MemSpy resumed, waiting for Rendezvous... - this: 0x%08x", this ) );
-        User::WaitForRequest( status );
-        err = status.Int();
-        proc.Close();
+		User::WaitForRequest( status );
+		err = status.Int();
+		proc.Close();
+
+		TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - Rendezvous complete: %d, this: 0x%08x", err, this ) );
+    	}
 
-        TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - Rendezvous complete: %d, this: 0x%08x", err, this ) );
-        }
-    if  ( err != KErrNone )
-        {
-        // Try console UI
-        err = proc.Create( KMemSpyProcessName2, KNullDesC );
-        if  ( err == KErrNone )
-            {
-            TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - Create Console UI process successfully... - this: 0x%08x", this ) );
-
-            TRequestStatus status;
-            proc.Rendezvous( status );
-            proc.Resume();
-
-            TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - MemSpy resumed, waiting for Rendezvous... - this: 0x%08x", this ) );
-
-            User::WaitForRequest( status );
-            err = status.Int();
-            proc.Close();
-
-            TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - Rendezvous complete: %d, this: 0x%08x", err, this ) );
-            }
-        }
+    // If server is not available, try with s60 UI
+    if ( err != KErrNone )
+    	{
+		err = proc.Create( KMemSpyProcessName1, KNullDesC );
+		if  ( err == KErrNone )
+			{
+			TFullName fullName;
+			proc.FullName( fullName );
+			TRACE( RDebug::Print( _L("[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - Create S60 UI process successfully... - this: 0x%08x, name: %S"), this, &fullName ) );
+	
+			TRequestStatus status;
+			proc.Rendezvous( status );
+			proc.Resume();
+	
+			TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - MemSpy resumed, waiting for Rendezvous... - this: 0x%08x", this ) );
+			User::WaitForRequest( status );
+			err = status.Int();
+			proc.Close();
+	
+			TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - Rendezvous complete: %d, this: 0x%08x", err, this ) );
+			}
+    	}
 
     TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine::LaunchMemSpyL() - final error: %d, this: 0x%08x", err, this ) );
     User::LeaveIfError( err );
@@ -534,11 +501,12 @@
     // In that case other parameters are ignored.
     TLex lex( aParameters[ 0 ] );
     if ( lex.Val( result ) != KErrNone )
-        {
+        {		
         // Parameters were given in text form:
         const TInt count( aParameters.Count() );
         for ( TInt i = 0; i < count ; i++ )
             {
+			lex = aParameters[ i ]; //check if num.
             if ( aParameters[i].CompareF( KMemSpyCmdSWMTTypeHeap ) == 0 )
                 result |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryUserHeap |
                           TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryKernelHeap;
@@ -565,17 +533,31 @@
                 result |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryFileServerCache;
             else if ( aParameters[i].CompareF( KMemSpyCmdSWMTTypeSystemMemory ) == 0 )
                 result |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategorySystemMemory;
-            else if ( aParameters[i].CompareF( KMemSpyCmdSWMTTypeWindowGroup ) == 0 )
-                result |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryWindowGroups;
-            else if ( aParameters[i].Find( KMemSpyCmdSWMTTypeHeapFilter ) == 0 )
-                {
-                aFilter.Copy( aParameters[i].Right( aParameters[i].Length() -11 ) );
+            else if ( aParameters[i].CompareF( KMemSpyCmdSWMTTypeWindowGroup ) == 0 )            	
+                result |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryWindowGroups;            
+            else if ( aParameters[i].CompareF( KMemSpyCmdSWMTTypeAll) == 0 ) //"all" category added
+            	result = TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryAll;
+            else if ( aParameters[i].CompareF( KMemSpyCmdSwmtParameterDumpnow) == 0 || 
+            		aParameters[i].CompareF( KMemSpyCmdSwmtParameterStarttimer) == 0 || 
+            		aParameters[i].CompareF( KMemSpyCmdSwmtParameterStoptimer) == 0 )
+            	{    
+				TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine:: command parameter") );
+            	}
+            else if ( lex.Val( result ) == KErrNone )
+            	{
+				TRACE( RDebug::Printf( "[MemSpyCmdLine] CMemSpyCommandLine:: number - timer period") );
+            	}
+            else// if ( aParameters[i].Find( KMemSpyCmdSWMTTypeHeapFilter ) == 0 )
+                {				
+                aFilter.Copy( aParameters[i].Right( aParameters[i].Length() -11 ) );              
                 }
-            else
-                User::Leave( KErrNotSupported );
+          /*  else
+            	{
+                //User::Leave( KErrNotSupported );            	            
+            	}*/
             }
         }
-    else if ( aParameters.Count() > 1 && aParameters[1].Find( KMemSpyCmdSWMTTypeHeapFilter ) == 0 )
+    else if ( aParameters.Count() > 1 )//&& aParameters[1].Find( KMemSpyCmdSWMTTypeHeapFilter ) == 0 )
         {
         aFilter.Copy( aParameters[1].Right( aParameters[1].Length() -11 ) );
         }
@@ -607,3 +589,110 @@
     return err;
     }
 
+
+//CLI status messages methods
+void CMemSpyCommandLine::RedrawInputPrompt()
+    {
+    iConsole.SetCursorPosAbs( iCommandPromptPos );
+    iConsole.ClearToEndOfLine();
+    iConsole.Printf( KMemSpyCLIInputPrompt, &iCommandBuffer );
+    }
+
+
+void CMemSpyCommandLine::RedrawStatusMessage()
+    {
+    RedrawStatusMessage( KNullDesC );
+    }
+
+
+void CMemSpyCommandLine::RedrawStatusMessage( const TDesC& aMessage )
+    {
+    iConsole.SetCursorPosAbs( iStatusMessagePos );
+    iConsole.ClearToEndOfLine();
+    iConsole.Write( aMessage );
+    iConsole.Write( KMemSpyCLINewLine );
+    }
+
+void CMemSpyCommandLine::WaitForInput()
+    {
+    ASSERT( !IsActive() );
+    iConsole.Read( iStatus );
+    SetActive();
+    }
+
+void CMemSpyCommandLine::DoCancel()
+    {
+    iConsole.ReadCancel();
+    }
+
+void CMemSpyCommandLine::RunL()
+    {
+    TKeyCode key = iConsole.KeyCode();
+    //
+    if  ( key == EKeyEnter || key == KMemSpyUiS60KeyCodeButtonOk || key == KMemSpyUiS60KeyCodeRockerEnter )
+        {
+        TRAP_IGNORE( ProcessCommandBufferL() );
+        }
+    else
+        {
+        TChar character( key );
+        if  ( character.IsPrint() )
+            {
+            if  ( iCommandBuffer.Length() < iCommandBuffer.MaxLength() )
+                {
+                iCommandBuffer.Append( TChar( key ) );
+                }
+
+            RedrawInputPrompt();
+            }
+        }
+
+    WaitForInput();
+    }
+
+TInt CMemSpyCommandLine::RunError( TInt aError )
+	{	
+	return KErrNone;
+	}
+
+void CMemSpyCommandLine::ProcessCommandBufferL()
+    {
+    iCommandBuffer.Trim();
+    //
+#ifdef _DEBUG
+    RDebug::Print( _L("[MCon] CMemSpyConsoleMenu::ProcessCommandBufferL() - cmd: [%S]"), &iCommandBuffer );
+#endif
+    //
+    TBool validCommand = EFalse;
+    if  ( iCommandBuffer.Length() == 1 )
+        {
+        // Reset if not recognised...
+        validCommand = ETrue;
+
+        const TChar cmd = iCommandBuffer[ 0 ]; 
+        switch( cmd )
+            {
+        	case 's':
+        	case 'S':
+        		{
+        		iMemSpy->PerformOperation( EMemSpyClientServerOpSystemWideMemoryTrackingTimerStop );
+        		
+        		CActiveScheduler::Stop();
+        		return;
+        		}
+        	case 'c':
+        	case 'C':
+        		CActiveScheduler::Stop();
+        		return;            
+        	default:
+        		validCommand = EFalse;
+        		break;
+            }
+        }    
+    if  ( !validCommand )
+        {
+        _LIT( KInvalidEntry, "*** ERROR - Invalid Command ***" );
+        RedrawStatusMessage( KInvalidEntry );
+        RedrawInputPrompt();
+        }
+    }
--- a/memspy/CommandLine/Source/MemSpyCommandLineMain.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/CommandLine/Source/MemSpyCommandLineMain.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -25,7 +25,7 @@
 
 // User includes
 #include "MemSpyCommandLine.h"
-
+#include "MemSpyCommands.h"
 
 // ---------------------------------------------------------------------------
 // DoMainL()
@@ -38,21 +38,27 @@
     CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
     CActiveScheduler::Install( scheduler );
     CleanupStack::PushL( scheduler );
-
+    
     // Get command line 
     CCommandLineArguments* args = CCommandLineArguments::NewLC();
-
+    
+    //--
+    CConsoleBase* console = Console::NewL( KMemSpyCLIName, TSize( KConsFullScreen, KConsFullScreen ) );
+    CleanupStack::PushL( console );
+    //--
+    
     // Command line manager
-    CMemSpyCommandLine* commandLineMgr = CMemSpyCommandLine::NewLC();
+    CMemSpyCommandLine* commandLineMgr = CMemSpyCommandLine::NewLC( *console );
 
     // Play nicely with external processes
     RProcess::Rendezvous( KErrNone );
 
     // Perform op
-    commandLineMgr->PerformOpL( *args );
-
+    commandLineMgr->PerformOpL( *args );  
+        
     // Tidy up
-    CleanupStack::PopAndDestroy( 3, scheduler ); // scheduler, args, commandLineMgr
+    //CleanupStack::PopAndDestroy( 3, scheduler ); // scheduler, args, commandLineMgr
+    CleanupStack::PopAndDestroy( 4 ); // scheduler, args,  console, commandLineMgr
     }
    
 
--- a/memspy/CommandLine/group/MemSpyCommandLine.mmp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/CommandLine/group/MemSpyCommandLine.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -25,7 +25,7 @@
 VENDORID		VID_DEFAULT
 SMPSAFE
 
-CAPABILITY			none
+CAPABILITY		WriteDeviceData
 
 SOURCEPATH      ../Source
 SOURCE          MemSpyCommandLine.cpp
@@ -37,6 +37,12 @@
 
 OS_LAYER_SYSTEMINCLUDE
 
-LIBRARY					euser.lib efsrv.lib bafl.lib 
+APP_LAYER_SYSTEMINCLUDE
+
+LIBRARY         MemSpyClient.lib
+
+LIBRARY					euser.lib 
+LIBRARY 				efsrv.lib 
+LIBRARY 				bafl.lib 
 
 
--- a/memspy/Console/Include/ConsoleMenu.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Console/Include/ConsoleMenu.h	Tue Aug 31 16:45:49 2010 +0300
@@ -26,22 +26,22 @@
 // Engine includes
 #include <memspy/engine/memspyengine.h>
 #include <memspy/engine/memspyengineobserver.h>
-
+#include <memspysession.h>
 // User includes
 #include "ConsoleConstants.h"
 
 // Classes referenced
 class CConsoleBase;
-
+class RMemSpySession;
 
 class CMemSpyConsoleMenu : public CActive, public MMemSpyEngineObserver
     {
 public:
-    static CMemSpyConsoleMenu* NewLC( CMemSpyEngine& aEngine, CConsoleBase& aConsole );
+    static CMemSpyConsoleMenu* NewLC( RMemSpySession& aSession, CConsoleBase& aConsole );
     ~CMemSpyConsoleMenu();
 
 private:
-    CMemSpyConsoleMenu( CMemSpyEngine& aEngine, CConsoleBase& aConsole );
+    CMemSpyConsoleMenu( RMemSpySession& aEngine, CConsoleBase& aConsole );
     void ConstructL();
 
 public: // API
@@ -74,8 +74,10 @@
     void InitiateMemSpyClientServerOperationL( TInt aOpCode );
 
 private: // Data members
-    CMemSpyEngine& iEngine;
+    RMemSpySession& iSession;
     CConsoleBase& iConsole;
+    
+    TMemSpyOutputType iOutputType;
     //
     TBuf<KMemSpyMaxInputBufferLength> iCommandBuffer;
     TPoint iCommandPromptPos;
--- a/memspy/Console/Source/ConsoleDWOperation.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Console/Source/ConsoleDWOperation.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -56,7 +56,7 @@
 #endif
 
     iWaiter = new(ELeave) CActiveSchedulerWait();
-    iOperation = CMemSpyDeviceWideOperations::NewL( iEngine, *this, aOperation );
+    //iOperation = CMemSpyDeviceWideOperations::NewL( iEngine, *this, aOperation );
 
 #ifdef _DEBUG
     RDebug::Printf("[MCon] CMemSpyDeviceWideOperationWaiter::ExecuteL() - starting scheduler wait..." );
--- a/memspy/Console/Source/ConsoleMain.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Console/Source/ConsoleMain.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -26,6 +26,7 @@
 
 // Engine includes
 #include <memspy/engine/memspyengine.h>
+#include <memspysession.h>
 
 // User includes
 #include "ConsoleMenu.h"
@@ -54,11 +55,12 @@
 	CleanupStack::PushL( console );
 
     // Engine
-    CMemSpyEngine* engine = CMemSpyEngine::NewL( fsSession );
-    CleanupStack::PushL( engine );
+    RMemSpySession session;
+    User::LeaveIfError(session.Connect());
+    CleanupClosePushL(session);
 
     // Menu & event handler AO
-    CMemSpyConsoleMenu::NewLC( *engine, *console );
+    CMemSpyConsoleMenu::NewLC( session, *console );
 
     // Play nicely with external processes
     RProcess::Rendezvous( KErrNone );
--- a/memspy/Console/Source/ConsoleMenu.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Console/Source/ConsoleMenu.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -39,18 +39,17 @@
 #include "ConsoleDWOperation.h"
 
 
-CMemSpyConsoleMenu::CMemSpyConsoleMenu( CMemSpyEngine& aEngine, CConsoleBase& aConsole )
-:   CActive( EPriorityHigh ), iEngine( aEngine ), iConsole( aConsole )
+CMemSpyConsoleMenu::CMemSpyConsoleMenu( RMemSpySession& aSession, CConsoleBase& aConsole )
+:   CActive( EPriorityHigh ), iSession( aSession ), iConsole( aConsole ), iOutputType(EOutputTypeDebug)
     {
     CActiveScheduler::Add( this );
-    iEngine.SetObserver( this );
+    // TODO: iEngine.SetObserver( this );
     }
 
 
 CMemSpyConsoleMenu::~CMemSpyConsoleMenu()
     {
     Cancel();
-    iEngine.SetObserver( NULL );
     }
 
 
@@ -61,9 +60,9 @@
     }
 
 
-CMemSpyConsoleMenu* CMemSpyConsoleMenu::NewLC( CMemSpyEngine& aEngine, CConsoleBase& aConsole )
+CMemSpyConsoleMenu* CMemSpyConsoleMenu::NewLC( RMemSpySession& aSession, CConsoleBase& aConsole )
     {
-    CMemSpyConsoleMenu* self = new(ELeave) CMemSpyConsoleMenu( aEngine, aConsole );
+    CMemSpyConsoleMenu* self = new(ELeave) CMemSpyConsoleMenu( aSession, aConsole );
     CleanupStack::PushL( self );
     self->ConstructL();
     return self;
@@ -76,7 +75,7 @@
    
     // First line - sink type (defaults to file)
     _LIT( KLine1, "1 or T. Toggle output mode between file or trace [%S]" );
-    if  ( iEngine.SinkType() == ESinkTypeDebug )
+    if  ( iOutputType == EOutputTypeDebug )
         {
         _LIT( KLine1Trace, "Trace" );
         iConsole.Printf( KLine1, &KLine1Trace );
@@ -204,14 +203,7 @@
 
 void CMemSpyConsoleMenu::OnCmdSinkTypeToggleL()
     {
-    if  ( iEngine.SinkType() == ESinkTypeDebug )
-        {
-        iEngine.InstallSinkL( ESinkTypeFile );
-        }
-    else
-        {
-        iEngine.InstallSinkL( ESinkTypeDebug );
-        }
+	iOutputType = iOutputType == EOutputTypeFile ? EOutputTypeDebug : EOutputTypeFile;
     }
 
 
@@ -224,7 +216,7 @@
     _LIT( KMsg, "Ouputting Kernel data..." );
     RedrawStatusMessage( KMsg );
 
-    iEngine.HelperHeap().OutputHeapDataKernelL();
+    iSession.OutputKernelHeapDataL( iOutputType );
 
     RedrawStatusMessage( KNullDesC );
     }
@@ -239,14 +231,7 @@
     _LIT( KMsg, "Ouputting Kernel Object listing..." );
     RedrawStatusMessage( KMsg );
     //
-    CMemSpyEngineHelperKernelContainers& kernelContainerManager = iEngine.HelperKernelContainers();
-    CMemSpyEngineGenericKernelObjectContainer* model = kernelContainerManager.ObjectsAllL();
-    CleanupStack::PushL( model );
-    //
-    CMemSpyEngineOutputSink& sink = iEngine.Sink();
-    model->OutputL( sink );
-    //
-    CleanupStack::PopAndDestroy( model );
+    iSession.OutputKernelObjectsL( iOutputType );
 
     RedrawStatusMessage( KNullDesC );
     }
@@ -258,7 +243,7 @@
     RDebug::Printf( "[MCon] CMemSpyConsoleMenu::OnCmdCSVListingStackL() - START" );
 #endif
 
-    iEngine.HelperStack().OutputStackInfoForDeviceL();
+    iSession.OutputCompactStackInfoL( iOutputType );
     }
 
 
@@ -268,7 +253,7 @@
     RDebug::Printf( "[MCon] CMemSpyConsoleMenu::OnCmdCSVListingHeapL() - START" );
 #endif
 
-    iEngine.HelperHeap().OutputHeapInfoForDeviceL();
+    iSession.OutputCompactHeapInfoL( iOutputType );
     }
 
 
@@ -296,44 +281,34 @@
         TPtr pCmdBuf( cmdBuf->Des() );
         pCmdBuf.Copy( iCommandBuffer );
         pCmdBuf.Append( KMemSpyConsoleWildcardCharacter );
-        //
-        CMemSpyEngineObjectContainer& container = iEngine.Container();
-        const TInt count = container.Count();
-        TFullName fullThreadName;
+        
+        TInt err;
+        TProcessId procId;
+        TRAP(err, procId = iSession.GetProcessIdByNameL(pCmdBuf));
         //
-        TInt index = 0;
-#ifdef _DEBUG
-        RDebug::Printf( "[MCon] CMemSpyConsoleMenu::OnCmdHeapDataUserL() - procCount: %d", count );
-#endif
-
-        while( index < count )
-            {
-            CMemSpyProcess& process = container.At( index );
-            const TPtrC processName( process.Name() );
-#ifdef _DEBUG
-            RDebug::Print( _L("[MCon] CMemSpyConsoleMenu::OnCmdHeapDataUserL() - procName: 0x%08x %S"), &process, &processName );
-#endif
-
-            //
-            if  ( processName.MatchF( pCmdBuf ) >= 0 )
-                {
-                _LIT( KProcessingRequest, "** Dumping Heap Data for thread: %S" );
-                const TInt threadCount = process.Count();
-                for( TInt i=0; i<threadCount; i++ )
+        if (err == KErrNone) 
+        	{
+        	RArray<CMemSpyApiThread*> threads;
+        	
+        	TRAP(err, iSession.GetThreadsL(procId, threads));
+        	if (err == KErrNone)
+        		{
+				_LIT( KProcessingRequest, "** Dumping Heap Data for thread: %S" );     	
+				TFullName fullThreadName;
+				
+                for( TInt i=0; i<threads.Count(); i++ )
                     {
-                    CMemSpyThread& thread = process.At( i );
+                    CMemSpyApiThread* thread = threads[i];
                     //
-                    fullThreadName = thread.FullName();
+                    fullThreadName = thread->Name();
                     iConsole.Printf( KProcessingRequest, &fullThreadName );
                     iConsole.Write( KMemSpyConsoleNewLine );
                     //
-                    TRAP_IGNORE( iEngine.HelperHeap().OutputHeapDataUserL( thread ) );
+                    TRAP_IGNORE( iSession.OutputThreadHeapDataL(iOutputType, thread->Id()) );
+                    
+                    delete thread;
                     }
-
-                break;
                 }
-            
-            ++index;
             }
 
         CleanupStack::PopAndDestroy( cmdBuf );
@@ -369,38 +344,36 @@
         TPtr pCmdBuf( cmdBuf->Des() );
         pCmdBuf.Copy( iCommandBuffer );
         pCmdBuf.Append( KMemSpyConsoleWildcardCharacter );
-        //
-        CMemSpyEngineObjectContainer& container = iEngine.Container();
-        const TInt count = container.Count();
-        TFullName fullThreadName;
-        //
-        TInt index = 0;
-        while( index < count )
-            {
-            CMemSpyProcess& process = container.At( index );
-            const TPtrC processName( process.Name() );
-            //
-            if  ( processName.MatchF( pCmdBuf ) >= 0 )
-                {
-                _LIT( KProcessingRequest, "** Dumping Heap Cell List for thread: %S" );
-                const TInt threadCount = process.Count();
-                for( TInt i=0; i<threadCount; i++ )
-                    {
-                    CMemSpyThread& thread = process.At( i );
-                    //
-                    fullThreadName = thread.FullName();
-                    iConsole.Printf( KProcessingRequest, &fullThreadName );
-                    iConsole.Write( KMemSpyConsoleNewLine );
-                    //
-                    TRAP_IGNORE( iEngine.HelperHeap().OutputCellListingUserL( thread ) );
-                    }
-
-                break;
-                }
-            
-            ++index;
-            }
-
+        
+        TInt err;
+		TProcessId procId;
+		TRAP(err, procId = iSession.GetProcessIdByNameL(pCmdBuf));
+		//
+		if (err == KErrNone) 
+			{
+			RArray<CMemSpyApiThread*> threads;
+			
+			TRAP(err, iSession.GetThreadsL(procId, threads));
+			if (err == KErrNone)
+				{
+				_LIT( KProcessingRequest, "** Dumping Heap Cell List for thread: %S" );     	
+				TFullName fullThreadName;
+				
+				for( TInt i=0; i<threads.Count(); i++ )
+					{
+					CMemSpyApiThread* thread = threads[i];
+					//
+					fullThreadName = thread->Name();
+					iConsole.Printf( KProcessingRequest, &fullThreadName );
+					iConsole.Write( KMemSpyConsoleNewLine );
+					//
+					TRAP_IGNORE( iSession.OutputThreadCellListL(iOutputType, thread->Id()) );
+					
+					delete thread;
+					}
+				}
+			}
+        
         CleanupStack::PopAndDestroy( cmdBuf );
         DrawMenuL();
         }
@@ -604,71 +577,72 @@
 
 void CMemSpyConsoleMenu::InitiateMemSpyClientServerOperationL( TInt aOpCode )
     {
-#ifdef _DEBUG
-    RDebug::Printf( "[MCon] CMemSpyConsoleMenu::InitiateMemSpyClientServerOperationL() - START - aOpCode: %d, iRunningDeviceWideOperation: %d", aOpCode, iRunningDeviceWideOperation );
-#endif
-    //
-    if ( aOpCode == EMemSpyClientServerOpExit )
-        {
-        // Exit console app UI
-        CActiveScheduler::Stop();
-        }
-    else
-        {
-        CMemSpyDeviceWideOperations::TOperation op = CMemSpyDeviceWideOperations::EPerEntityGeneralSummary;
-        switch( aOpCode )
-            {
-        case EMemSpyClientServerOpSummaryInfo:
-            op = CMemSpyDeviceWideOperations::EPerEntityGeneralSummary;
-            break;
-        case EMemSpyClientServerOpSummaryInfoDetailed:
-            op = CMemSpyDeviceWideOperations::EPerEntityGeneralDetailed;
-            break;
-        //
-        case EMemSpyClientServerOpHeapInfo:
-            op = CMemSpyDeviceWideOperations::EPerEntityHeapInfo;
-            break;
-        case EMemSpyClientServerOpHeapCellListing:
-            op = CMemSpyDeviceWideOperations::EPerEntityHeapCellListing;
-            break;
-        case EMemSpyClientServerOpHeapData:
-            op = CMemSpyDeviceWideOperations::EPerEntityHeapData;
-            break;
-        //
-        case EMemSpyClientServerOpStackInfo:
-            op = CMemSpyDeviceWideOperations::EPerEntityStackInfo;
-            break;
-        case EMemSpyClientServerOpStackDataUser:
-            op = CMemSpyDeviceWideOperations::EPerEntityStackDataUser;
-            break;
-        case EMemSpyClientServerOpStackDataKernel:
-            op = CMemSpyDeviceWideOperations::EPerEntityStackDataKernel;
-            break;
-        
-        // These are not supported by the console UI
-        default:
-        case EMemSpyClientServerOpBitmapsSave:
-        case EMemSpyClientServerOpSendToBackground:
-        case EMemSpyClientServerOpBringToForeground:
-            User::Leave( KErrNotSupported );
-            break;
-            }
-
-        if  ( iRunningDeviceWideOperation )
-            {
-            User::Leave( KErrInUse );
-            }
-        else
-            {
-            iRunningDeviceWideOperation = ETrue;
-            TRAP_IGNORE( CMemSpyDeviceWideOperationWaiter::ExecuteLD( iEngine, op ) );
-            iRunningDeviceWideOperation = EFalse;
-            }
-        }
-
-#ifdef _DEBUG
-    RDebug::Printf( "[MCon] CMemSpyConsoleMenu::InitiateMemSpyClientServerOperationL() - END - aOpCode: %d", aOpCode );
-#endif
+	// TODO: ....
+//#ifdef _DEBUG
+//    RDebug::Printf( "[MCon] CMemSpyConsoleMenu::InitiateMemSpyClientServerOperationL() - START - aOpCode: %d, iRunningDeviceWideOperation: %d", aOpCode, iRunningDeviceWideOperation );
+//#endif
+//    //
+//    if ( aOpCode == EMemSpyClientServerOpExit )
+//        {
+//        // Exit console app UI
+//        CActiveScheduler::Stop();
+//        }
+//    else
+//        {
+//        CMemSpyDeviceWideOperations::TOperation op = CMemSpyDeviceWideOperations::EPerEntityGeneralSummary;
+//        switch( aOpCode )
+//            {
+//        case EMemSpyClientServerOpSummaryInfo:
+//            op = CMemSpyDeviceWideOperations::EPerEntityGeneralSummary;
+//            break;
+//        case EMemSpyClientServerOpSummaryInfoDetailed:
+//            op = CMemSpyDeviceWideOperations::EPerEntityGeneralDetailed;
+//            break;
+//        //
+//        case EMemSpyClientServerOpHeapInfo:
+//            op = CMemSpyDeviceWideOperations::EPerEntityHeapInfo;
+//            break;
+//        case EMemSpyClientServerOpHeapCellListing:
+//            op = CMemSpyDeviceWideOperations::EPerEntityHeapCellListing;
+//            break;
+//        case EMemSpyClientServerOpHeapData:
+//            op = CMemSpyDeviceWideOperations::EPerEntityHeapData;
+//            break;
+//        //
+//        case EMemSpyClientServerOpStackInfo:
+//            op = CMemSpyDeviceWideOperations::EPerEntityStackInfo;
+//            break;
+//        case EMemSpyClientServerOpStackDataUser:
+//            op = CMemSpyDeviceWideOperations::EPerEntityStackDataUser;
+//            break;
+//        case EMemSpyClientServerOpStackDataKernel:
+//            op = CMemSpyDeviceWideOperations::EPerEntityStackDataKernel;
+//            break;
+//        
+//        // These are not supported by the console UI
+//        default:
+//        case EMemSpyClientServerOpBitmapsSave:
+//        case EMemSpyClientServerOpSendToBackground:
+//        case EMemSpyClientServerOpBringToForeground:
+//            User::Leave( KErrNotSupported );
+//            break;
+//            }
+//
+//        if  ( iRunningDeviceWideOperation )
+//            {
+//            User::Leave( KErrInUse );
+//            }
+//        else
+//            {
+//            iRunningDeviceWideOperation = ETrue;
+//            TRAP_IGNORE( CMemSpyDeviceWideOperationWaiter::ExecuteLD( iEngine, op ) );
+//            iRunningDeviceWideOperation = EFalse;
+//            }
+//        }
+//
+//#ifdef _DEBUG
+//    RDebug::Printf( "[MCon] CMemSpyConsoleMenu::InitiateMemSpyClientServerOperationL() - END - aOpCode: %d", aOpCode );
+//#endif
     }
 
 
--- a/memspy/Console/group/MemSpyConsole.mmp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Console/group/MemSpyConsole.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -25,8 +25,8 @@
 
 #include		"../../group/MemSpyCapabilities.mmh"
 
-EPOCSTACKSIZE   0x4000
-EPOCHEAPSIZE	0x100000 0x4000000
+//EPOCSTACKSIZE   0x4000
+//EPOCHEAPSIZE	0x100000 0x4000000
 
 
 SOURCEPATH      ../Source
@@ -41,6 +41,5 @@
 LIBRARY         euser.lib
 LIBRARY         efsrv.lib 
 
-LIBRARY         memspydriverclient.lib
-LIBRARY         memspyengine.lib 
-
+LIBRARY		MemSpyClient.lib
+LIBRARY     MemSpyEngine.lib
\ No newline at end of file
--- a/memspy/Console/group/bld.inf	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Console/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -23,4 +23,4 @@
 
 
 PRJ_MMPFILES
-MemSpyConsole.mmp
+//MemSpyConsole.mmp
--- a/memspy/Driver/BWINS/memspydriverclientu.def	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/BWINS/memspydriverclientu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -67,4 +67,5 @@
 	?WalkHeapReadCellData@RMemSpyDriverClient@@QAEHPAXAAVTDes8@@H@Z @ 66 NONAME ; int RMemSpyDriverClient::WalkHeapReadCellData(void *, class TDes8 &, int)
 	?GetCondVarSuspendedThreads@RMemSpyDriverClient@@QAEHPAXPAPAXAAH@Z @ 67 NONAME ; int RMemSpyDriverClient::GetCondVarSuspendedThreads(void *, void * *, int &)
 	?GetCondVarSuspendedThreadInfo@RMemSpyDriverClient@@QAEHPAXAAVTMemSpyDriverCondVarSuspendedThreadInfo@@@Z @ 68 NONAME ; int RMemSpyDriverClient::GetCondVarSuspendedThreadInfo(void *, class TMemSpyDriverCondVarSuspendedThreadInfo &)
+	?GetHeapInfoUser@RMemSpyDriverClient@@QAEHAAVTMemSpyHeapInfo@@IAAV?$RArray@VTMemSpyDriverFreeCell@@@@H@Z @ 69 NONAME ; int RMemSpyDriverClient::GetHeapInfoUser(class TMemSpyHeapInfo &, unsigned int, class RArray<class TMemSpyDriverFreeCell> &, int)
 
--- a/memspy/Driver/Kernel/Include/MemSpyDriverHeap.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Include/MemSpyDriverHeap.h	Tue Aug 31 16:45:49 2010 +0300
@@ -28,104 +28,39 @@
 #include "MemSpyDriverObjectsInternal.h"
 
 // Constants
+// We shouldn't be using any of these any more! -Tomsci
 const TUint KRHeapObjectSize = 0x74;
 const TUint KRAllocatorAndRHeapMemberDataOffset = 4; // 4 bytes past start of allocator address, i.e. skipping the vtable
 const TUint KRHeapMemberDataSize = KRHeapObjectSize - KRAllocatorAndRHeapMemberDataOffset;
 
 // Classes referenced
 class DMemSpyDriverOSAdaption;
-
+namespace LtkUtils
+	{
+	class RAllocatorHelper;
+	}
 
 /**
  * Essentially a mirror of RAllocator and RHeap's layout.
  */
 class RMemSpyDriverRHeapBase
 	{
-public:
-	struct SCell
-        {
-        TInt len; 
-        SCell* next;
-        };
-
-    struct SDebugCell
-        {
-        TInt len;
-        TInt nestingLevel;
-        TInt allocCount;
-        };
-
-    struct _s_align {char c; double d;};
-
-    struct SHeapCellInfo { RHeap* iHeap; TInt iTotalAlloc;	TInt iTotalAllocSize; TInt iTotalFree; TInt iLevelAlloc; SDebugCell* iStranded; };
-	
-    enum {ECellAlignment = sizeof(_s_align)-sizeof(double)};
-	enum {EFreeCellSize = sizeof(SCell)};
-	enum TDebugOp {EWalk=128};
-	enum TCellType
-		{EGoodAllocatedCell, EGoodFreeCell, EBadAllocatedCellSize, EBadAllocatedCellAddress,
-		EBadFreeCellAddress, EBadFreeCellSize};
-	
-    enum TDebugHeapId {EUser=0, EKernel=1};
-
 protected:
     RMemSpyDriverRHeapBase();
 
-public: // Inlines
-    inline TUint8* Base() const { return iBase; }
-    inline TInt Size() const { return iTop - iBase; }
-    inline TInt MaxLength() const { return iMaxLength; }
-
 public: // API
     void PrintInfo();
-    void CopyObjectDataTo( TMemSpyHeapObjectDataRHeap& aData );
+	LtkUtils::RAllocatorHelper* Helper();
+	TMemSpyHeapInfo::THeapImplementationType GetTypeFromHelper() const;
 
 public: // Virtual API
     virtual void Reset();
-    virtual void AssociateWithKernelChunk( DChunk* aChunk, TLinAddr aAddress, TUint32 aMappingAttributes ) = 0;
-    virtual void DisassociateWithKernelChunk() = 0;
+	virtual void Close();
     virtual DChunk& Chunk() = 0;
     virtual const DChunk& Chunk() const = 0;
-    virtual TLinAddr ChunkKernelAddress() const = 0;
-    virtual TBool ChunkIsInitialised() const = 0;
-    virtual TUint ClientToKernelDelta() const = 0;
-    virtual void GetHeapSpecificInfo( TMemSpyHeapInfo& /*aInfo*/ ) const { }
 
-public: // Utilities
-    TBool CheckCell( TAny* aCellAddress, TInt aLength ) const;
-    static TInt AllocatedCellHeaderSize( TBool aDebugLibrary );
-    static TInt FreeCellHeaderSize();
-    static TInt CellHeaderSize( const TMemSpyDriverInternalWalkHeapParamsCell& aCell, TBool aDebugEUser );
-
-public: // From RAllocator
-	TInt iAccessCount;
-	TInt iHandleCount;
-	TInt* iHandles;
-	TUint32 iFlags;
-	TInt iCellCount;
-	TInt iTotalAllocSize;
-
-public: // From RHeap
-	TInt iMinLength;
-	TInt iMaxLength;
-	TInt iOffset;
-	TInt iGrowBy;
-	TInt iChunkHandle;
-	RFastLock iLock;
-	TUint8* iBase;
-	TUint8* iTop;
-	TInt iAlign;
-	TInt iMinCell;
-	TInt iPageSize;
-	SCell iFree;
-	TInt iNestingLevel;
-	TInt iAllocCount;
-    RAllocator::TAllocFail iFailType;
-	TInt iFailRate;
-	TBool iFailed;
-	TInt iFailAllocCount;
-	TInt iRand;
-	TAny* iTestData;
+protected:
+	LtkUtils::RAllocatorHelper* iHelper;
     };
 
 
@@ -137,17 +72,12 @@
     RMemSpyDriverRHeapReadFromCopy( DMemSpyDriverOSAdaption& aOSAdaption );
 
 public: // New API
-    TInt ReadFromUserAllocator( DThread& aThread );
+    void AssociateWithKernelChunk( DChunk* aChunk, TLinAddr aAddress, TUint32 aMappingAttributes );
 
 public: // From RMemSpyDriverRHeapBase
     void Reset();
-    void AssociateWithKernelChunk( DChunk* aChunk, TLinAddr aAddress, TUint32 aMappingAttributes );
-    void DisassociateWithKernelChunk();
     DChunk& Chunk();
     const DChunk& Chunk() const;
-    TLinAddr ChunkKernelAddress() const;
-    TBool ChunkIsInitialised() const;
-    TUint ClientToKernelDelta() const;
 
 protected:
     inline DMemSpyDriverOSAdaption& OSAdaption() { return iOSAdaption; }
@@ -162,7 +92,7 @@
 
     // Calculated delta between client's address space values and actual kernel
     // address of the heap chunk.
-    TUint iClientToKernelDelta;
+    //TUint iClientToKernelDelta;
     };
 
 
@@ -171,13 +101,21 @@
 
 
 
-class RMemSpyDriverRHeapUser : public RMemSpyDriverRHeapReadFromCopy
+class RMemSpyDriverRHeapUser : public RMemSpyDriverRHeapBase
 	{
 public:
     RMemSpyDriverRHeapUser( DMemSpyDriverOSAdaption& aOSAdaption );
+	TInt OpenUserHeap(DThread& aThread, TBool aEuserUdeb);
 
-public: // New API
-    TInt ReadFromUserAllocator( DThread& aThread );
+	DChunk& Chunk() { return *iChunk; }
+	const DChunk& Chunk() const { return *iChunk; }
+
+private:
+    inline DMemSpyDriverOSAdaption& OSAdaption() { return iOSAdaption; }
+
+private:
+    DMemSpyDriverOSAdaption& iOSAdaption;
+	DChunk* iChunk;
     };
 
 
@@ -191,8 +129,8 @@
     void SetKernelHeap( RHeapK& aKernelHeap );
 
 public: // From RMemSpyDriverRHeapBase
-    void DisassociateWithKernelChunk();
-    void GetHeapSpecificInfo( TMemSpyHeapInfo& aInfo ) const;
+    //void DisassociateWithKernelChunk();
+	void Close();
 
 private:
     RHeapK* iKernelHeap;
@@ -204,50 +142,19 @@
     {
 public:
     RMemSpyDriverRHeapKernelInPlace();
+	TInt OpenKernelHeap();
     
-public: // API
-    void FailNext();
-    void SetKernelHeap( RHeapK& aKernelHeap );
 
 public: // From RMemSpyDriverRHeapBase
-    void Reset();
-    void AssociateWithKernelChunk( DChunk* aChunk, TLinAddr aAddress, TUint32 aMappingAttributes );
-    void DisassociateWithKernelChunk();
+    void Close();
+
     DChunk& Chunk();
     const DChunk& Chunk() const;
-    TLinAddr ChunkKernelAddress() const;
-    TBool ChunkIsInitialised() const;
-    TUint ClientToKernelDelta() const;
-    void GetHeapSpecificInfo( TMemSpyHeapInfo& aInfo ) const;
 
-private: // Internal methods
-    void CopyMembersFromKernelHeap();
-
-private: // Internal class
-
-    /**
-     * Used when opening the kernel heap
-     */
-#ifndef __SYMBIAN_KERNEL_HYBRID_HEAP__
-    class RHeapKExtended : public RHeapK
-        {
-    public:
-        inline void FailNext()
-            {
-            SetFailType( RAllocator::EFailNext );
-            SetFailRate( 1 );
-            ResetFailed();
-            ResetFailAllocCount();
-            }
-        inline void SetFailType( TAllocFail aType ) { iFailType = aType; }
-        inline void SetFailRate( TInt aRate ) { iFailRate = aRate; }
-        inline void ResetFailed() { iFailed = EFalse; }
-        inline void ResetFailAllocCount() { iFailAllocCount = 0; }
-        };
-#endif
+	// Only important member data is the base class's RAllocatorHelper
+	// We do cache the chunk though
 private:
-    RHeapK* iKernelHeap;
-    DChunk* iChunk;
+	DChunk* iChunk;
     };
 
 	
--- a/memspy/Driver/Kernel/Include/MemSpyDriverHeapStatistics.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Include/MemSpyDriverHeapStatistics.h	Tue Aug 31 16:45:49 2010 +0300
@@ -69,7 +69,8 @@
     TUint iLargestCellAddressFreePrevious;
 
     // The overhead associated with a free cell (header length)
-    TUint iFreeCellOverheadHeaderLength;
+    //TUint iFreeCellOverheadHeaderLength;
+	TUint iReserved1;
 
     // The slace space at the end of the heap
     TUint iSlackSpace;
@@ -93,7 +94,8 @@
     TLinAddr iLargestCellAddressAlloc;
    
     // The overhead associated with an allocated cell (header length)
-    TUint iAllocCellOverheadHeaderLength;
+    //TUint iAllocCellOverheadHeaderLength;
+	TUint iReserved2;
 
 public: // Common
 
--- a/memspy/Driver/Kernel/Include/MemSpyDriverHeapWalker.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Include/MemSpyDriverHeapWalker.h	Tue Aug 31 16:45:49 2010 +0300
@@ -29,32 +29,23 @@
 #include "MemSpyDriverHeap.h"
 #include "MemSpyDriverHeapStatistics.h"
 
+#include "heaputils.h"
+using namespace LtkUtils;
 
 // Heap walker observer interface - can be used to make a record of each cell
 class MMemSpyHeapWalkerObserver
     {
 public:
-    virtual TBool HandleHeapCell( TInt aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber ) = 0;
+    virtual TBool HandleHeapCell(TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber) = 0;
     virtual void HandleHeapWalkInit() = 0;
     };
 
 
-
-// A null observer that is used to collect basic statistics
-class TMemSpyHeapWalkerNullObserver : public MMemSpyHeapWalkerObserver
-    {
-public:
-    TBool HandleHeapCell( TInt /*aCellType*/, TAny* /*aCellAddress*/, TInt /*aLength*/, TInt /*aNestingLevel*/, TInt /*aAllocNumber*/ ) { return ETrue; }
-    void HandleHeapWalkInit() { }
-    };
-
-
 // Heap walker - allows in-place walking of any heap
 class RMemSpyDriverHeapWalker
     {
 public:
-    RMemSpyDriverHeapWalker( RMemSpyDriverRHeapBase& aHeap, TBool aDebugAllocator );
-    RMemSpyDriverHeapWalker( RMemSpyDriverRHeapBase& aHeap, TBool aDebugAllocator, MMemSpyHeapWalkerObserver& aObserver );
+	RMemSpyDriverHeapWalker(RMemSpyDriverRHeapBase& aHeap, MMemSpyHeapWalkerObserver* aObserver=NULL);
 		
 public: // API
     TInt Traverse();
@@ -63,12 +54,9 @@
     inline void SetPrintDebug() { iPrintDebug = ETrue; }
     inline const TMemSpyHeapWalkStatistics& Stats() const { return iStats; }
 
-public: // Utility functions
-    static TAny* KernelAddress( TAny* aUserAddress, TUint aDelta );
-    static TAny* UserAddress( TAny* aKernelAddress, TUint aDelta );
-    static RMemSpyDriverRHeapBase::SCell* CellByUserAddress( TAny* aAddress, TUint aDelta );
-
 private: // Internal methods
+	static TBool CellCallback(RAllocatorHelper& aHelper, TAny* aContext, RAllocatorHelper::TExtendedCellType aCellType, TLinAddr aCellAddress, TInt aLength);
+	TBool DoCellCallback(RAllocatorHelper& aHelper, RAllocatorHelper::TExtendedCellType aCellType, TLinAddr aCellAddress, TInt aLength);
     TBool NotifyCell( TMemSpyDriverCellType aType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel = -1, TInt aAllocNumber = -1 );
     //
     void UpdateStats( TMemSpyDriverCellType aType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber );
@@ -76,14 +64,10 @@
     void FinaliseStats();
     void PrintStats();
     //
-    TAny* KernelAddress( TAny* aUserAddress ) const;
-    TAny* UserAddress( TAny* aKernelAddress ) const;
-    //
     inline TBool PrintDebug() const { return iPrintDebug; }
 
 private:
     RMemSpyDriverRHeapBase& iHeap;
-    TBool iIsDebugAllocator;
     TBool iPrintDebug;
     MMemSpyHeapWalkerObserver* iObserver;
     TMemSpyHeapWalkStatistics iStats;
--- a/memspy/Driver/Kernel/Include/MemSpyDriverInspectedProcess.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Include/MemSpyDriverInspectedProcess.h	Tue Aug 31 16:45:49 2010 +0300
@@ -138,6 +138,8 @@
     void ResetPendingChanges();
     void PrintChunkInfo( DChunk& aChunk ) const;
     TBool IsChunkRelevantToOurProcess( DChunk& aChunk ) const;
+	void Lock() const;
+	void Unlock() const;
 
 public: // Queue link for process manager
 	SDblQueLink iPMLink;
--- a/memspy/Driver/Kernel/Include/MemSpyDriverLog.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Include/MemSpyDriverLog.h	Tue Aug 31 16:45:49 2010 +0300
@@ -119,5 +119,6 @@
 #   define TRACE_CHUNK( x )
 #endif
 
+#define LOG(args...) TRACE(Kern::Printf(args))
 
 #endif
--- a/memspy/Driver/Kernel/Include/MemSpyDriverOSAdaption.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Include/MemSpyDriverOSAdaption.h	Tue Aug 31 16:45:49 2010 +0300
@@ -106,7 +106,7 @@
     TUint GetId( DProcess& aObject ) const;
     MemSpyObjectIx* GetHandles( DProcess& aObject ) const;
     TExitType GetExitType( DProcess& aObject ) const;
-    DThread* GetFirstThread( DProcess& aObject ) const;
+    DThread* OpenFirstThread( DProcess& aObject ) const;
     TUint32 GetSID( DProcess& aObject ) const;
     TUint GetSecurityZone( DProcess& aObject ) const;
     SSecurityInfo& GetSecurityInfo( DProcess& aObject ) const;
@@ -122,6 +122,7 @@
     TUint8* GetAddressOfOwningProcess( DProcess& aObject ) const;
     TUint8* GetAddressOfDataBssStackChunk( DProcess& aObject ) const;
     TBool IsHandleIndexValid( DProcess& aObject ) const;
+	TBool IsKernProcess(DProcess& aProcess) const;
 
 private: // Data members
     };
--- a/memspy/Driver/Kernel/Include/MemSpyDriverObjectIx.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Include/MemSpyDriverObjectIx.h	Tue Aug 31 16:45:49 2010 +0300
@@ -126,8 +126,8 @@
 	// common operations
     RMemSpyObjectIx();
 
-    static void Wait();
-	static void Signal();
+    //static void Wait();
+	//static void Signal();
 
     inline TInt Count()
 		{ return iCount; }
@@ -137,7 +137,7 @@
 public:
 	// uncommon operations
 	DObject* operator[](TInt aIndex);
-	TInt At(DObject* aObject);
+	TBool Find(DObject* aObject);
 
 private:
 	TRWSpinLock		iRWL;
@@ -171,11 +171,11 @@
 public:
 	DObject* At(TInt aHandle,TInt aUniqueID);
 	DObject* At(TInt aHandle);
-	TInt At(DObject* aObject);
+	TBool Find(DObject* aObject);
 	TInt Count(DObject* aObject);
 	DObject* operator[](TInt aIndex);
-	static void Wait( DMemSpyObjectIx* aObjectIndex );
-	static void Signal( DMemSpyObjectIx* aObjectIndex );
+	//static void Wait( DMemSpyObjectIx* aObjectIndex );
+	//static void Signal( DMemSpyObjectIx* aObjectIndex );
 	inline TInt Count();
 	inline TInt ActiveCount();
 
@@ -206,24 +206,24 @@
 #if MCL_ROBJECTIX_DUPLICATION
 
     #define MemSpyObjectIx                                          RMemSpyObjectIx
-    #define MemSpyObjectIx_Wait( IX )                               RMemSpyObjectIx::Wait()
-    #define MemSpyObjectIx_Signal( IX )                             RMemSpyObjectIx::Signal()
+    //#define MemSpyObjectIx_Wait( IX )                               RMemSpyObjectIx::Wait()
+    //#define MemSpyObjectIx_Signal( IX )                             RMemSpyObjectIx::Signal()
     #define MemSpyObjectIx_GetHandlePointer_Thread( DTHREAD )       reinterpret_cast< MemSpyObjectIx* >( &DTHREAD.iHandles )
     #define MemSpyObjectIx_GetHandlePointer_Process( DPROCESS )     reinterpret_cast< MemSpyObjectIx* >( &DPROCESS.iHandles )
 
 #elif MCL_DOBJECTIX_DUPLICATION
 
     #define MemSpyObjectIx                                          DMemSpyObjectIx
-    #define MemSpyObjectIx_Wait( IX )                               DMemSpyObjectIx::Wait( IX )
-    #define MemSpyObjectIx_Signal( IX )                             DMemSpyObjectIx::Signal( IX )
+    //#define MemSpyObjectIx_Wait( IX )                               DMemSpyObjectIx::Wait( IX )
+    //#define MemSpyObjectIx_Signal( IX )                             DMemSpyObjectIx::Signal( IX )
     #define MemSpyObjectIx_GetHandlePointer_Thread( DTHREAD )       reinterpret_cast< MemSpyObjectIx* >( DTHREAD.iHandles )
     #define MemSpyObjectIx_GetHandlePointer_Process( DPROCESS )     reinterpret_cast< MemSpyObjectIx* >( DPROCESS.iHandles )
 
 #else
 
     #define MemSpyObjectIx                  DObjectIx
-    #define MemSpyObjectIx_Wait( IX )       
-    #define MemSpyObjectIx_Signal( IX )     
+    //#define MemSpyObjectIx_Wait( IX )       
+    //#define MemSpyObjectIx_Signal( IX )     
     #define MemSpyObjectIx_IsValid_Thread( DTHREAD )    ( DTHREAD.iHandles != NULL )
     #define MemSpyObjectIx_IsValid_Process( DPROCESS )  ( DPROCESS.iHandles != NULL )
     #define MemSpyObjectIx_GetHandlePointer_Thread( DTHREAD )       reinterpret_cast< MemSpyObjectIx* >( DTHREAD.iHandles )
@@ -231,4 +231,7 @@
 
 #endif
 
+#define MemSpyObjectIx_HandleLookupLock()							NKern::LockSystem()
+#define MemSpyObjectIx_HandleLookupUnlock()							NKern::UnlockSystem()
+
 #endif
--- a/memspy/Driver/Kernel/Include/SubChannels/MemSpyDriverLogChanContainerBase.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Include/SubChannels/MemSpyDriverLogChanContainerBase.h	Tue Aug 31 16:45:49 2010 +0300
@@ -42,8 +42,8 @@
 protected: // Internal methods
     static TObjectType ObjectTypeFromMemSpyContainerType( TMemSpyDriverContainerType aType );
 
-    /** Returns with System Locked */
-    DObject* CheckIfObjectIsInContainer( TMemSpyDriverContainerType aContainerType, DObject* aSearchFor, TBool aQuick = EFalse );
+	// Must be in critical section to call
+	DObject* CheckedOpen(TMemSpyDriverContainerType aContainerType, DObject* aObject, TBool aQuick=EFalse);
 
 protected: // Internal methods
     void ResetTempHandles();
--- a/memspy/Driver/Kernel/Include/SubChannels/MemSpyDriverLogChanHeapBase.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Include/SubChannels/MemSpyDriverLogChanHeapBase.h	Tue Aug 31 16:45:49 2010 +0300
@@ -61,33 +61,20 @@
 protected: // Capability checks for heap access
     TDrmMatchType IsDrmThread( DThread& aThread );
 
-private: // From MHeapWalkerObserver
+protected: // From MHeapWalkerObserver
     void HandleHeapWalkInit();
-    TBool HandleHeapCell( TInt aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber );
+    TBool HandleHeapCell( TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber );
 
 protected: // Heap utility functions
     TInt OpenKernelHeap( RHeapK*& aHeap, DChunk*& aChunk, TDes8* aClientHeapChunkName = NULL );
-    TInt OpenKernelHeap( RMemSpyDriverRHeapKernelInPlace& aHeap, TDes8* aClientHeapChunkName = NULL );
     TInt OpenKernelHeap( RMemSpyDriverRHeapKernelFromCopy& aHeap, TDes8* aClientHeapChunkName = NULL );
-    TInt OpenUserHeap( DThread& aClientThread, TUint aExpectedHeapVTable, RMemSpyDriverRHeapUser& aHeap, DChunk*& aUserHeapChunk, TDes8* aClientHeapChunkName = NULL );
-    TBool GetUserHeapHandle( DThread& aThread, RMemSpyDriverRHeapUser& aHeap, TUint aExpectedVTable );
-    TBool IsDebugKernel();
-    TBool IsDebugKernel( RMemSpyDriverRHeapKernelInPlace& aHeap );
-    TInt GetHeapInfoKernel( RMemSpyDriverRHeapBase& aHeap, TBool aIsDebugAllocator, const TDesC8& aChunkName, TMemSpyHeapInfo* aHeapInfo, TDes8* aTransferBuffer );
+    TInt GetHeapInfoKernel(RMemSpyDriverRHeapBase& aHeap, TMemSpyHeapInfo* aHeapInfo, TDes8* aTransferBuffer);
     void PrintHeapInfo( const TMemSpyHeapInfo& aInfo );
 
-protected: // Free cells
-    void ReleaseFreeCells();
-    TInt PrepareFreeCellTransferBuffer();
-	TInt FetchFreeCells( TDes8* aBufferSink );
-    TInt CalculateFreeCellBufferSize() const;
-
 private: // Data members
-	RArray< TMemSpyDriverFreeCell > iFreeCells;
 
     // Points to stack-based object whilst walking in progress
     RMemSpyMemStreamWriter* iStackStream;
-    RMemSpyMemStreamWriter* iHeapStream;
     TInt iFreeCellCount;
 	};
 
--- a/memspy/Driver/Kernel/Include/SubChannels/MemSpyDriverLogChanHeapInfo.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Include/SubChannels/MemSpyDriverLogChanHeapInfo.h	Tue Aug 31 16:45:49 2010 +0300
@@ -53,13 +53,22 @@
 private: // Channel operation handlers
     TInt GetHeapInfoUser( TMemSpyDriverInternalHeapRequestParameters* aParams );
     TInt GetHeapInfoKernel( TMemSpyDriverInternalHeapRequestParameters* aParams, TDes8* aTransferBuffer );
-    TInt GetIsDebugKernel( TBool* aIsDebugKernel );
+    TInt GetIsDebugKernel(TAny* aIsDebugKernel);
+
+private: // From MHeapWalkerObserver
+    void HandleHeapWalkInit();
+    TBool HandleHeapCell( TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber );
 
 private: // Internal methods
-    TUint32 CalculateFreeCellBufferSize() const;
+	void ReleaseCellList();
+    TInt PrepareCellListTransferBuffer();
+	TInt FetchCellList(TDes8* aBufferSink);
+    TInt CalculateCellListBufferSize() const;
 
 private: // Data members
     TMemSpyDriverInternalHeapRequestParameters iHeapInfoParams;
+	RArray<TMemSpyDriverCell> iCellList;
+    RMemSpyMemStreamWriter* iHeapStream;
 	};
 
 
--- a/memspy/Driver/Kernel/Include/SubChannels/MemSpyDriverLogChanHeapWalk.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Include/SubChannels/MemSpyDriverLogChanHeapWalk.h	Tue Aug 31 16:45:49 2010 +0300
@@ -61,7 +61,7 @@
     const TMemSpyDriverInternalWalkHeapParamsCell* CellInfoForSpecificAddress( TAny* aAddress ) const;
 
 private: // Heap walker callback
-    TBool WalkerHandleHeapCell( TInt aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber );
+    TBool WalkerHandleHeapCell(TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber );
 
 private:
     TBool iHeapWalkInitialised;
@@ -85,7 +85,7 @@
 
 public: // From MHeapWalkerObserver
     void HandleHeapWalkInit() { }
-    TBool HandleHeapCell( TInt aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber )
+    TBool HandleHeapCell(TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber )
         {
         return iChannel.WalkerHandleHeapCell( aCellType, aCellAddress, aLength, aNestingLevel, aAllocNumber );
         }
--- a/memspy/Driver/Kernel/Source/MemSpyDriverEventMonitor.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/MemSpyDriverEventMonitor.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -170,6 +170,7 @@
 TUint DMemSpyEventMonitor::HandleEvent( TKernelEvent aType, TAny* a1, TAny* /*a2*/ )
 	{ 
 	// TRACE_EM( Kern::Printf("DMemSpyEventMonitor::HandleEvent() - PRE WAIT"));
+	NKern::ThreadEnterCS();
 	Kern::MutexWait(*iLock);
 	// TRACE_EM( Kern::Printf("DMemSpyEventMonitor::HandleEvent() - POST WAIT"));
 
@@ -250,6 +251,7 @@
 
 	// TRACE_EM( Kern::Printf("DMemSpyEventMonitor::HandleEvent() - PRE SIGNAL "));
 	Kern::MutexSignal( *iLock );
+	NKern::ThreadLeaveCS();
 	// TRACE_EM( Kern::Printf("DMemSpyEventMonitor::HandleEvent() - POST SIGNAL "));
 
 	// Allow other handlers to see this event
--- a/memspy/Driver/Kernel/Source/MemSpyDriverHeap.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/MemSpyDriverHeap.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -23,129 +23,60 @@
 // User includes
 #include "MemSpyDriverOSAdaption.h"
 #include "MemSpyDriverUtils.h"
+#include "heaputils.h"
 
-// Defines
-#define __NEXT_CELL(p)				((RMemSpyDriverRHeapBase::SCell*)(((TUint8*)p)+p->len))
-#define __NEXT_CELL2(p,l)			((RMemSpyDriverRHeapBase::SCell*)(((TUint8*)p)+l))
 
 
 RMemSpyDriverRHeapBase::RMemSpyDriverRHeapBase()
+	: iHelper(NULL)
     {
     Reset();
     }
 
+LtkUtils::RAllocatorHelper* RMemSpyDriverRHeapBase::Helper()
+	{
+	return iHelper;
+	}
+
+TMemSpyHeapInfo::THeapImplementationType RMemSpyDriverRHeapBase::GetTypeFromHelper() const
+	{
+	if (iHelper)
+		{
+		LtkUtils::RAllocatorHelper::TType type = iHelper->GetType();
+		switch (type)
+			{
+			case LtkUtils::RAllocatorHelper::ETypeRHeap:
+				return TMemSpyHeapInfo::ETypeRHeap;
+			case LtkUtils::RAllocatorHelper::ETypeRHybridHeap:
+				return TMemSpyHeapInfo::ETypeRHybridHeap;
+			case LtkUtils::RAllocatorHelper::ETypeUnknown:
+			default:
+				return TMemSpyHeapInfo::ETypeUnknown;
+			}
+		}
+	return TMemSpyHeapInfo::ETypeUnknown;
+	}
 
 void RMemSpyDriverRHeapBase::Reset()
     {
-	iAccessCount = 0;
-	iHandleCount = 0;
-	iHandles = NULL;
-	iFlags = 0;
-	iCellCount = 0;
-	iTotalAllocSize = 0;
-    
-    iMinLength = 0;
-	iMaxLength = 0;
-	iOffset = 0;
-	iGrowBy = 0;
-	iChunkHandle = 0;
-	// iLock needs no initialisation due to default ctor
-	iBase = NULL;
-	iTop = NULL;
-	iAlign = 0;
-	iMinCell = 0;
-	iPageSize = 0;
-	iFree.len = 0;
-	iFree.next = NULL;
-	iNestingLevel = 0;
-	iAllocCount = 0;
-    iFailType = RAllocator::EReset;
-	iFailRate = 0;
-	iFailed = EFalse;
-	iFailAllocCount = 0;
-	iRand = 0;
-	iTestData = NULL;
-    }
-
-
-TBool RMemSpyDriverRHeapBase::CheckCell( TAny* aCellAddress, TInt aLength ) const
-	{
-	const TLinAddr m = TLinAddr(iAlign - 1);
-    TRACE_HEAP( Kern::Printf("RMemSpyDriverRHeapBase::CheckCell() - cell: 0x%08x, len: %8d, iAlign: %d, m: %d", aCellAddress, aLength, iAlign, m) );
-
-    TBool isValid = ETrue;
-    //
-    if ( isValid && (aLength & m) )
-        {
-    	TRACE_HEAP( Kern::Printf("RMemSpyDriverRHeapBase::CheckCell() - ERROR - length is odd: %d, iAlign: %d, m: %d", aLength, iAlign, m) );
-        isValid = EFalse;
-        }
-    if ( isValid && aLength < iMinCell )
-        {
-    	TRACE_HEAP( Kern::Printf("RMemSpyDriverRHeapBase::CheckCell() - ERROR - length: %d, is less than min cell size (%d)", aLength, iMinCell) );
-        isValid = EFalse;
-        }
-    if ( isValid && (TUint8*)aCellAddress < iBase )
-        {
-    	TRACE_HEAP( Kern::Printf("RMemSpyDriverRHeapBase::CheckCell() - ERROR - cell address: 0x%08x, is before start address: 0x%08x", (TUint8*) aCellAddress, iBase) );
-        isValid = EFalse;
-        }
-
-    if  ( isValid )
-        {
-        const TUint8* nextCell = (TUint8*)__NEXT_CELL2(aCellAddress, aLength);
-        if  ( nextCell > iTop )
-            {
-        	TRACE_HEAP( Kern::Printf("RMemSpyDriverRHeapBase::CheckCell() - ERROR - nextCell: 0x%08x is after the top of the heap: 0x%08x", nextCell, iTop) );
-            isValid = EFalse;
-            }
-        }
-    //
-    return isValid;
+	Close();
 	}
 
-
-TInt RMemSpyDriverRHeapBase::AllocatedCellHeaderSize( TBool aDebugLibrary )
-    {
-    // Allocated cells are only 4 bytes in UREL, but 12 bytes in UDEB.
-    TInt size = sizeof(SCell*);
-    //
-    if  ( aDebugLibrary )
-        {
-        size = sizeof(SDebugCell);
-        }
-    //
-    return size;
+void RMemSpyDriverRHeapBase::Close()
+	{
+	if (iHelper)
+		{
+	    NKern::ThreadEnterCS();
+		iHelper->Close();
+		delete iHelper;
+		iHelper = NULL;
+		NKern::ThreadLeaveCS();
+		}
     }
 
-
-TInt RMemSpyDriverRHeapBase::FreeCellHeaderSize()
-    {
-    // Free cells remain the same size in UREL and UDEB builds.
-    const TInt size = sizeof(SCell);
-    return size; 
-    }
-
-
-TInt RMemSpyDriverRHeapBase::CellHeaderSize( const TMemSpyDriverInternalWalkHeapParamsCell& aCell, TBool aDebugLibrary )
-    {
-    TInt size = 0;
-    //
-    if  ( aCell.iCellType == EMemSpyDriverGoodAllocatedCell )
-        {
-        size = AllocatedCellHeaderSize( aDebugLibrary );
-        }
-    else if ( aCell.iCellType == EMemSpyDriverGoodFreeCell ) 
-        {
-        size = FreeCellHeaderSize();
-        }
-    //
-    return size;
-    }
-
-
 void RMemSpyDriverRHeapBase::PrintInfo()
     {
+	/* TOMSCI TODO
 #if defined(TRACE_TYPE_KERNELHEAP) || defined(TRACE_TYPE_USERHEAP)
     Kern::Printf(" " );
     Kern::Printf("RMemSpyDriverRHeapBase::PrintInfo - RAllocator - iAccessCount:    0x%08x", iAccessCount );
@@ -173,70 +104,11 @@
     Kern::Printf(" " );
     Kern::Printf(" " );
 #endif
-    }
-
-
-void RMemSpyDriverRHeapBase::CopyObjectDataTo( TMemSpyHeapObjectDataRHeap& aData )
-    {
-    TRACE_HEAP( Kern::Printf("RMemSpyDriverRHeapBase::CopyObjectDataTo() - START" ) );
-
-    TUint8* sourceAddress = reinterpret_cast< TUint8* >( this );
-    sourceAddress += KRAllocatorAndRHeapMemberDataOffset;
-    memcpy( &aData, sourceAddress, KRHeapObjectSize );
-
-    TRACE_HEAP( Kern::Printf("RMemSpyDriverRHeapBase::CopyObjectDataTo() - END") );
+	*/
     }
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 RMemSpyDriverRHeapReadFromCopy::RMemSpyDriverRHeapReadFromCopy( DMemSpyDriverOSAdaption& aOSAdaption )
-:   iOSAdaption( aOSAdaption ), iChunk( NULL ), iChunkAddress( 0 ), iChunkMappingAttributes( 0 ), iClientToKernelDelta( 0 )
+:   iOSAdaption( aOSAdaption ), iChunk( NULL ), iChunkAddress( 0 ), iChunkMappingAttributes( 0 ) /*, iClientToKernelDelta( 0 )*/
     {
     }
 
@@ -248,7 +120,7 @@
     iChunk = NULL;
     iChunkAddress = 0;
     iChunkMappingAttributes = 0;
-    iClientToKernelDelta = 0;
+    //iClientToKernelDelta = 0;
     }
 
 
@@ -263,13 +135,13 @@
     // Calculate start of real heap data (skipping over embedded RHeap object)
     // Since we must operate with kernel-side addressing into our cloned heap chunk,
     // we must use aAddress (the kernel address of the chunk) rather than aChunk->iBase
-    iClientToKernelDelta = ( (TUint8*) aAddress ) - ( Base() - KRHeapObjectSize );
+    //TOMSCI iClientToKernelDelta = ( (TUint8*) aAddress ) - ( Base() - KRHeapObjectSize );
 
     TRACE_HEAP( Kern::Printf("RMemSpyDriverRHeapReadFromCopy::AssociateWithKernelChunk() - END - delta between client's user-side base address (base: 0x%08x), kernel-side base address (base: 0x%08x), and kernel-side chunk (base: 0x%08x) is: 0x%08x", Base(), aChunk->iBase, aAddress, iClientToKernelDelta) );
     }
 
 
-void RMemSpyDriverRHeapReadFromCopy::DisassociateWithKernelChunk()
+/*void RMemSpyDriverRHeapReadFromCopy::DisassociateWithKernelChunk()
     {
     TRACE_HEAP( Kern::Printf("RMemSpyDriverRHeapReadFromCopy::DisassociateWithKernelChunk() - START - iChunk: 0x%08x", iChunk ) );
 
@@ -283,7 +155,7 @@
 
     TRACE_HEAP( Kern::Printf("RMemSpyDriverRHeapReadFromCopy::DisassociateWithKernelChunk() - END") );
     }
-
+*/
 
 DChunk& RMemSpyDriverRHeapReadFromCopy::Chunk()
     {
@@ -297,7 +169,7 @@
     }
 
 
-TLinAddr RMemSpyDriverRHeapReadFromCopy::ChunkKernelAddress() const
+/*TLinAddr RMemSpyDriverRHeapReadFromCopy::ChunkKernelAddress() const
     {
     return iChunkAddress;
     }
@@ -308,118 +180,49 @@
     return iChunk != NULL;
     }
 
-
 TUint RMemSpyDriverRHeapReadFromCopy::ClientToKernelDelta() const
     {
     return iClientToKernelDelta;
     }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+*/
 
 
 
 
 
 RMemSpyDriverRHeapUser::RMemSpyDriverRHeapUser( DMemSpyDriverOSAdaption& aOSAdaption )
-:   RMemSpyDriverRHeapReadFromCopy( aOSAdaption )
+	: RMemSpyDriverRHeapBase(), iOSAdaption(aOSAdaption)
     {
     }
 
 
-TInt RMemSpyDriverRHeapUser::ReadFromUserAllocator( DThread& aThread )
-    {
-    TBuf8<KRHeapMemberDataSize> memberData;
-    memberData.SetMax();
-
-    NKern::ThreadEnterCS();
-    NKern::LockSystem();
-    RAllocator* allocator = OSAdaption().DThread().GetAllocator( aThread );
-    NKern::UnlockSystem();
-  	NKern::ThreadLeaveCS();
-
-    TUint8* memberDataAddress = (TUint8*) allocator + KRAllocatorAndRHeapMemberDataOffset;
-	TRACE_HEAP( Kern::Printf("RMemSpyDriverRHeapUser::ReadFromUserAllocator() - START - allocator addr: 0x%08x, therefore going to read %d bytes from address 0x%08x within client thread (0x%08x + %4d bytes)", allocator, KRHeapMemberDataSize, memberDataAddress, allocator, KRAllocatorAndRHeapMemberDataOffset ) );
-
-    const TInt error = Kern::ThreadRawRead( &aThread, memberDataAddress, (TAny*) memberData.Ptr(), KRHeapMemberDataSize );
-    TRACE_DATA( MemSpyDriverUtils::DataDump("%lS", memberData.Ptr(), KRHeapMemberDataSize, KRHeapMemberDataSize ) );
-
-    if  ( error == KErrNone )
-        {
-        TUint8* destinationAddress = reinterpret_cast< TUint8* >( this );
-
-        // Skip over our vTable too...
-        destinationAddress += KRAllocatorAndRHeapMemberDataOffset;
-
-        // Now copy data into this object
-        TPtr8 self( destinationAddress, KRHeapMemberDataSize, KRHeapMemberDataSize );
-        self.Copy( memberData );
-
-        PrintInfo();
-        }
-    else
-        {
-        }
-
-	TRACE_HEAP( Kern::Printf("RMemSpyDriverRHeapUser::ReadFromUserAllocator() - END - read error: %d", error ) );
-    return error;
-    }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+TInt RMemSpyDriverRHeapUser::OpenUserHeap(DThread& aThread, TBool aEuserUdeb)
+	{
+	TLinAddr allocatorAddr = (TLinAddr)OSAdaption().DThread().GetAllocator(aThread);
+	NKern::ThreadEnterCS();
+	LtkUtils::RKernelSideAllocatorHelper* helper = new LtkUtils::RKernelSideAllocatorHelper;
+	if (!helper)
+		{
+		NKern::ThreadLeaveCS();
+		return KErrNoMemory;
+		}
+	TInt err = helper->OpenUserHeap(OSAdaption().DThread().GetId(aThread), allocatorAddr, aEuserUdeb);
+	if (!err)
+		{
+		iChunk = helper->OpenUnderlyingChunk();
+		if (!iChunk) err = KErrNotFound;
+		}
+	if (err)
+		{
+		delete helper;
+		}
+	else
+		{
+		iHelper = helper;
+		}
+	NKern::ThreadLeaveCS();
+	return err;
+	}
 
 RMemSpyDriverRHeapKernelFromCopy::RMemSpyDriverRHeapKernelFromCopy( DMemSpyDriverOSAdaption& aOSAdaption )
 :   RMemSpyDriverRHeapReadFromCopy( aOSAdaption )
@@ -448,6 +251,7 @@
     }
 
 
+/*
 void RMemSpyDriverRHeapKernelFromCopy::DisassociateWithKernelChunk()
     {
     TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelFromCopy::DisassociateWithKernelChunk() - START - iKernelHeap: 0x%08x", iKernelHeap ));
@@ -455,93 +259,55 @@
     RMemSpyDriverRHeapReadFromCopy::DisassociateWithKernelChunk();
     TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelFromCopy::DisassociateWithKernelChunk() - END") );
     }
-
+*/
 
-void RMemSpyDriverRHeapKernelFromCopy::GetHeapSpecificInfo( TMemSpyHeapInfo& aInfo ) const
-    {
-    TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelFromCopy::GetHeapSpecificInfo() - START - iKernelHeap: 0x%08x", iKernelHeap ));
-    //
-    if  ( iKernelHeap )
-        {
-        const TUint32* pHeap = reinterpret_cast< TUint32* >( iKernelHeap );
-        //
-        TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
-        TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
-        rHeapMetaData.SetVTable( *pHeap );
-        rHeapMetaData.SetClassSize( KRHeapObjectSize );
-        //
-        TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelFromCopy::GetHeapSpecificInfo() - RHeapK vtable is: 0x%08x", *pHeap ));
-        }
-    //
-    TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelFromCopy::GetHeapSpecificInfo() - END") );
-    }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+void RMemSpyDriverRHeapKernelFromCopy::Close()
+	{
+	//TOMSCI TODO close the chunk
+	}
 
 RMemSpyDriverRHeapKernelInPlace::RMemSpyDriverRHeapKernelInPlace()
-:   iKernelHeap( NULL ), iChunk( NULL )
+	: iChunk(NULL)
     {
     }
 
-
-void RMemSpyDriverRHeapKernelInPlace::SetKernelHeap( RHeapK& aKernelHeap )
-    {
-    iKernelHeap = &aKernelHeap;
-    CopyMembersFromKernelHeap();
-    }
-
+TInt RMemSpyDriverRHeapKernelInPlace::OpenKernelHeap()
+	{
+	NKern::ThreadEnterCS();
+	LtkUtils::RAllocatorHelper* helper = new LtkUtils::RAllocatorHelper;
+	if (!helper)
+		{
+		NKern::ThreadLeaveCS();
+		return KErrNoMemory;
+		}
+	TInt err = helper->OpenKernelHeap();
+	if (!err)
+		{
+		iChunk = helper->OpenUnderlyingChunk();
+		if (!iChunk) err = KErrNotFound;
+		}
 
-void RMemSpyDriverRHeapKernelInPlace::FailNext()
-    {
-#ifndef __SYMBIAN_KERNEL_HYBRID_HEAP__
-    RMemSpyDriverRHeapKernelInPlace::RHeapKExtended* heap = reinterpret_cast< RMemSpyDriverRHeapKernelInPlace::RHeapKExtended* >( iKernelHeap );
-    heap->FailNext();
-#endif
-    }
+	if (err)
+		{
+		delete helper;
+		}
+	else
+		{
+		iHelper = helper;
+		}
+	NKern::ThreadLeaveCS();
+	return err;
+	}
 
-
-void RMemSpyDriverRHeapKernelInPlace::Reset()
+void RMemSpyDriverRHeapKernelInPlace::Close()
     {
-    RMemSpyDriverRHeapBase::Reset();
-	//
-    iChunk = NULL;
-    }
-
-
-void RMemSpyDriverRHeapKernelInPlace::AssociateWithKernelChunk( DChunk* aChunk, TLinAddr /*aAddress*/, TUint32 /*aMappingAttributes*/ )
-    {
-    TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelInPlace::AssociateWithKernelChunk() - START - aChunk: %O, aChunk base: 0x%08x", aChunk, aChunk->iBase ) );
-    iChunk = aChunk;
+	NKern::ThreadEnterCS();
+	iChunk->Close(NULL);
+	iChunk = NULL;
+	RMemSpyDriverRHeapBase::Close();
+	NKern::ThreadLeaveCS();
     }
 
-
-void RMemSpyDriverRHeapKernelInPlace::DisassociateWithKernelChunk()
-    {
-    TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelInPlace::DisassociateWithKernelChunk() - START - iChunk: 0x%08x", iChunk ));
-    iChunk = NULL;
-    iKernelHeap = NULL;
-    TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelInPlace::DisassociateWithKernelChunk() - END") );
-    }
-
-
 DChunk& RMemSpyDriverRHeapKernelInPlace::Chunk()
     {
     return *iChunk;
@@ -553,68 +319,3 @@
     return *iChunk;
     }
 
-
-TLinAddr RMemSpyDriverRHeapKernelInPlace::ChunkKernelAddress() const
-    {
-    const TLinAddr ret = reinterpret_cast< TLinAddr >( iChunk->iBase );
-    return ret;
-    }
-
-
-TBool RMemSpyDriverRHeapKernelInPlace::ChunkIsInitialised() const
-    {
-    return iChunk != NULL;
-    }
-
-
-TUint RMemSpyDriverRHeapKernelInPlace::ClientToKernelDelta() const
-    {
-    // We're operating in kernel address space, there is no delta.
-    return 0;
-    }
-
-
-void RMemSpyDriverRHeapKernelInPlace::CopyMembersFromKernelHeap()
-    {
-    TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelInPlace::CopyMembersFromKernelHeap() - START" ) );
-
-    // Perform a copy operation in order to populate base class with a duplicate of the kernel's heap info.
-    RHeapK* kernelHeap = iKernelHeap;
-
-    // Source address
-    TUint8* sourceAddress = (TUint8*) kernelHeap + KRAllocatorAndRHeapMemberDataOffset;
-    TUint8* destinationAddress = (TUint8*) this + KRAllocatorAndRHeapMemberDataOffset;
-
-    // Copy 
-    memcpy( destinationAddress, sourceAddress, KRHeapMemberDataSize );
-
-    // And print info in debug builds for verification...
-    PrintInfo();
-
-    TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelInPlace::CopyMembersFromKernelHeap() - END" ) );
-    }
-
-
-void RMemSpyDriverRHeapKernelInPlace::GetHeapSpecificInfo( TMemSpyHeapInfo& aInfo ) const
-    {
-    TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelInPlace::GetHeapSpecificInfo() - START - iKernelHeap: 0x%08x", iKernelHeap ));
-    //
-    if  ( iKernelHeap )
-        {
-        const TUint32* pHeap = reinterpret_cast< TUint32* >( iKernelHeap );
-        //
-        TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
-        TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
-        rHeapMetaData.SetVTable( *pHeap );
-        rHeapMetaData.SetClassSize( KRHeapObjectSize );
-        //
-        TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelInPlace::GetHeapSpecificInfo() - RHeapK vtable is: 0x%08x", *pHeap ));
-        }
-    //
-    TRACE_KH( Kern::Printf("RMemSpyDriverRHeapKernelInPlace::GetHeapSpecificInfo() - END") );
-    }
-
-
-
-
-
--- a/memspy/Driver/Kernel/Source/MemSpyDriverHeapWalker.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/MemSpyDriverHeapWalker.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -21,22 +21,14 @@
 #include "MemSpyDriverUtils.h"
 
 // Defines
-#define __NEXT_CELL(p)				((RMemSpyDriverRHeapBase::SCell*)(((TUint8*)p)+p->len))
 #define PRINTDEBUG( a ) { if ( PrintDebug() ) a; }
 
 
-RMemSpyDriverHeapWalker::RMemSpyDriverHeapWalker( RMemSpyDriverRHeapBase& aHeap, TBool aDebugAllocator )
-:   iHeap( aHeap ), iIsDebugAllocator( aDebugAllocator ), iPrintDebug( EFalse ), iObserver( NULL )
-    {
-    InitialiseStats();
-    }
-
-
-RMemSpyDriverHeapWalker::RMemSpyDriverHeapWalker( RMemSpyDriverRHeapBase& aHeap, TBool aDebugAllocator, MMemSpyHeapWalkerObserver& aObserver )
-:   iHeap( aHeap ), iIsDebugAllocator( aDebugAllocator ), iPrintDebug( EFalse ), iObserver( &aObserver )
-    {
-    InitialiseStats();
-    }
+RMemSpyDriverHeapWalker::RMemSpyDriverHeapWalker(RMemSpyDriverRHeapBase& aHeap, MMemSpyHeapWalkerObserver* aObserver)
+	: iHeap(aHeap), iPrintDebug(EFalse), iObserver(aObserver)
+	{
+	InitialiseStats();
+	}
 
 
 TInt RMemSpyDriverHeapWalker::Traverse()
@@ -44,7 +36,7 @@
 // Walk the heap calling the info function.
 //
 	{
-    PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - START - delta: 0x%08x", iHeap.ClientToKernelDelta() ));
+    PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - START"));
     InitialiseStats();
     if  ( iObserver )
         {
@@ -53,135 +45,64 @@
         }
 
     PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - heap walk init complete" ));
-    TAny* heapBase = KernelAddress( iHeap.iBase );
-    TAny* heapTop = KernelAddress( iHeap.iTop );
-	PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - kernel-side chunk address: 0x%08x, chunkBase: 0x%08x, heapBase: 0x%08x, heapTop: 0x%08x", iHeap.ChunkKernelAddress(), iHeap.Chunk().iBase, heapBase, heapTop));
-
-    TRACE_DATA( MemSpyDriverUtils::DataDump("%lS", (TUint8*) iHeap.ChunkKernelAddress(), iHeap.Chunk().iSize, iHeap.Chunk().iSize ) );
-   
-	TInt nestingLevel = 0;
-	TInt allocationNumber = 0;
-	//
-	RMemSpyDriverRHeapBase::SCell* pC = (RMemSpyDriverRHeapBase::SCell*) heapBase;		// allocated cells
-	RMemSpyDriverRHeapBase::SCell* pF = &iHeap.iFree;				            // free cells
-	PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - before while loop entry - pC: 0x%08x, pF: 0x%08x, heapBase: 0x%08x, heapTop: 0x%08x", pC, pF, heapBase, heapTop));
-    //
-    while( ( pF == &iHeap.iFree ) || ( pF >= heapBase && pF < heapTop ) )
-		{
-        pF = (RMemSpyDriverRHeapBase::SCell*) KernelAddress( pF->next );				// next free cell
-	    PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - pC: 0x%08x, pF: 0x%08x, heapBase: 0x%08x, heapTop: 0x%08x", pC, pF, heapBase, heapTop));
-
-        if  ( pF )
-        	{
-            PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - freeCell:       0x%08x", pF ));
 
-            if  ( pF >= heapBase && pF < heapTop )
-                {
-                PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - freeCell->next: 0x%08x", pF->next ));
-                PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - freeCell->len:  0x%08x", pF->len ));
-                }
-            else
-                {
-                PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - FATAL ERROR - freeCell:  0x%08x is outside heap bounds!", pF ));
-                }
+	TInt err = iHeap.Helper()->Walk(&CellCallback, this);
+    FinaliseStats();
+    //PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - END - pF: 0x%08x, pC: 0x%08x, heapBase: 0x%08x, heapTop: 0x%08x", pF, pC, heapBase, heapTop));
+	return err;
+	}
 
-            PRINTDEBUG( Kern::Printf(" "));
-            }
-		
-        if  (!pF)
-            {
-            PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - next free cell address is NULL"));
-			pF = (RMemSpyDriverRHeapBase::SCell*) heapTop;		// to make size checking work
-            }
-		else if (  (TUint8*) pF < heapBase || (TUint8*) pF >= heapTop || (KernelAddress( pF->next ) && KernelAddress( pF->next ) <= pF ) )
-			{
-			// free cell pointer off the end or going backwards
-            PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - EBadFreeCellAddress: 0x%08x", pF ));
-            NotifyCell( EMemSpyDriverBadFreeCellAddress, UserAddress(pF), 0 );
-			return KErrAbort;
-			}
-		else
-			{
-			TInt l = pF->len;
-			if ( l< iHeap.iMinCell || (l & (iHeap.iAlign-1)))
-				{
-				// free cell length invalid
-                PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - EBadFreeCellSize: 0x%08x", pF ));
-		        NotifyCell( EMemSpyDriverBadFreeCellSize, UserAddress(pF), l );
-			    return KErrAbort;
-				}
-			}
+TBool RMemSpyDriverHeapWalker::CellCallback(RAllocatorHelper& aHelper, TAny* aContext, RAllocatorHelper::TExtendedCellType aCellType, TLinAddr aCellAddress, TInt aLength)
+	{
+	return static_cast<RMemSpyDriverHeapWalker*>(aContext)->DoCellCallback(aHelper, aCellType, aCellAddress, aLength);
+	}
 
-        while ( pC != pF )				// walk allocated cells up to next free cell
-			{
-    	    if  ( pC )
-        	    {
-                // The 'next' cell field is only applicable if the cell is a 'free' cell, hence we only print the cell's
-                // address, its length, and its _calculated_ next cell (based upon address + length). Calc length is done
-                // a bit later on...
-                PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - allocCell:       0x%08x", pC ));
-                PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - allocCell->len:  0x%08x", pC->len ));
-                PRINTDEBUG( Kern::Printf(" "));
-                }
-            
-            TInt l = pC->len;
-			if (l<iHeap.iMinCell || (l & (iHeap.iAlign-1)))
-				{
-				// allocated cell length invalid
-                PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - EBadAllocatedCellSize: 0x%08x", pC ));
-		        NotifyCell( EMemSpyDriverBadAllocatedCellSize, UserAddress(pC), l );
-			    return KErrAbort;
-				}
-
-            // ALLOCATED CELL
-            if  ( iIsDebugAllocator )
-                {
-                RMemSpyDriverRHeapBase::SDebugCell* debugCell = (RMemSpyDriverRHeapBase::SDebugCell*) pC;
-                nestingLevel = debugCell->nestingLevel;
-                allocationNumber = debugCell->allocCount;
-                }
-
-            PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - EGoodAllocatedCell: 0x%08x", pC ));
-	        if  ( NotifyCell( EMemSpyDriverGoodAllocatedCell, UserAddress(pC), l, nestingLevel, allocationNumber ) == EFalse )
-                {
-                PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - END1 - KErrAbort on NotifyCell..."));
-			    return KErrAbort;
-                }
-
-			RMemSpyDriverRHeapBase::SCell* pN = (RMemSpyDriverRHeapBase::SCell*) __NEXT_CELL( pC );
-            PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - allocCell next:  0x%08x", pN ));
-			if (pN > pF)
-				{
-				// cell overlaps next free cell
-                PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - EBadAllocatedCellAddress: 0x%08x", pC ));
-		        NotifyCell( EMemSpyDriverBadAllocatedCellAddress, UserAddress(pC), l );
-			    return KErrAbort;
-				}
-
-            pC = pN;
-			}
-
-        PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - freeCell before exit check is: 0x%08x", pF ));
-        if  ((TUint8*) pF >= heapTop )
-            {
-            PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - freeCell reached top of heap -> done"));
-			break;		// reached end of heap
-            }
-		
-        pC = (RMemSpyDriverRHeapBase::SCell*) __NEXT_CELL(pF);	// step to next allocated cell
-
-        // FREE CELL
-        PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - EGoodFreeCell: 0x%08x", pF ));
-        if  ( NotifyCell( EMemSpyDriverGoodFreeCell, UserAddress(pF), pF->len ) == EFalse )
-            {
-            PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - END2 - KErrAbort on NotifyCell..."));
-			return KErrAbort;
-            }
+TBool RMemSpyDriverHeapWalker::DoCellCallback(RAllocatorHelper& aHelper, RAllocatorHelper::TExtendedCellType aCellType, TLinAddr aCellAddress, TInt aLength)
+	{
+	TAny* cellAddress = (TAny*)aCellAddress;
+	TMemSpyDriverCellType memspyCellType = (TMemSpyDriverCellType)aCellType; // We make sure these use the same values
+	switch (aCellType)
+		{
+		case RAllocatorHelper::EHeapBadFreeCellAddress:
+			PRINTDEBUG(Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - EBadFreeCellAddress: 0x%08x", cellAddress));
+			NotifyCell(memspyCellType, cellAddress, 0);
+			return EFalse;
+		case RAllocatorHelper::EHeapBadFreeCellSize:
+			PRINTDEBUG(Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - EBadFreeCellSize: 0x%08x", cellAddress));
+			NotifyCell(memspyCellType, cellAddress, aLength);
+			return EFalse;
+		case RAllocatorHelper::EHeapBadAllocatedCellSize:
+			PRINTDEBUG(Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - EBadAllocatedCellSize: 0x%08x", cellAddress));
+			NotifyCell(memspyCellType, cellAddress, aLength);
+			return EFalse;
+		case RAllocatorHelper::EHeapBadAllocatedCellAddress:
+			PRINTDEBUG(Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - EBadAllocatedCellAddress: 0x%08x", cellAddress));
+			NotifyCell(memspyCellType, cellAddress, aLength);
+			return EFalse;
+		default:
+			break;
 		}
 
-    FinaliseStats();
-    PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - END - pF: 0x%08x, pC: 0x%08x, heapBase: 0x%08x, heapTop: 0x%08x", pF, pC, heapBase, heapTop));
-    return KErrNone;
+	if (aCellType & RAllocatorHelper::EAllocationMask)
+		{
+		PRINTDEBUG(Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - EGoodAllocatedCell: 0x%08x", cellAddress));
+		TInt nestingLevel = -1;
+		aHelper.GetCellNestingLevel(cellAddress, nestingLevel);
+		TInt allocCount = aHelper.AllocCountForCell(cellAddress);
+		if (allocCount < 0) allocCount = -1; // This is what NotifyCell expects
+		return NotifyCell(memspyCellType, cellAddress, aLength, nestingLevel, allocCount);
+		}
+	else if (aCellType & RAllocatorHelper::EFreeMask)
+		{
+		PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::Traverse() - EGoodFreeCell: 0x%08x", cellAddress));
+		return NotifyCell(memspyCellType, cellAddress, aLength);
+		}
+	else if (aCellType & RAllocatorHelper::EBadnessMask)
+		{
+		NotifyCell(memspyCellType, cellAddress, aLength);
+		return EFalse;
+		}
+	return ETrue; // For any new types that get added
 	}
 
 
@@ -219,9 +140,7 @@
     alloc.SetLargestCellAddress( (TAny*) iStats.iLargestCellAddressAlloc );
     alloc.SetLargestCellSize( iStats.iLargestCellSizeAlloc );
 
-    // Copy common info
-    TMemSpyHeapStatisticsRHeapCommon& common = aStats.StatsCommon();
-    common.SetTotalCellCount( iStats.iNumberOfWalkedCells );
+	aStats.iCommittedFreeSpace = iHeap.Helper()->CommittedFreeSpace();
 
 	PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::CopyStatsTo() - END"));
     }
@@ -233,56 +152,6 @@
     iObserver = aObserver;
     }
 
-
-TAny* RMemSpyDriverHeapWalker::KernelAddress( TAny* aUserAddress, TUint aDelta )
-    {
-    TAny* ret = NULL;
-    //
-    if  ( aUserAddress )
-        {
-	    TRACE_HEAP( Kern::Printf("RMemSpyDriverHeapWalker::KernelAddress() - aUserAddress: 0x%08x", aUserAddress));
-        ret = (TUint8*) aUserAddress + aDelta;
-        }
-    //
-	TRACE_HEAP( Kern::Printf("RMemSpyDriverHeapWalker::KernelAddress() - ret: 0x%08x", ret));
-    return ret;
-    }
-
- 
-TAny* RMemSpyDriverHeapWalker::UserAddress( TAny* aKernelAddress, TUint aDelta )
-    {
-    TAny* ret = NULL;
-    //
-    if  ( aKernelAddress )
-        {
-	    TRACE_HEAP( Kern::Printf("RMemSpyDriverHeapWalker::UserAddress() - aKernelAddress: 0x%08x", aKernelAddress));
-        ret = (TUint8*) aKernelAddress - aDelta;
-        }
-    //
-	TRACE_HEAP( Kern::Printf("RMemSpyDriverHeapWalker::UserAddress() - ret: 0x%08x", ret));
-    return ret;
-    }
-
-
-TAny* RMemSpyDriverHeapWalker::KernelAddress( TAny* aUserAddress) const
-    {
-    return KernelAddress( aUserAddress, iHeap.ClientToKernelDelta() );
-    }
-
-
-TAny* RMemSpyDriverHeapWalker::UserAddress( TAny* aKernelAddress ) const
-    {
-    return UserAddress( aKernelAddress, iHeap.ClientToKernelDelta() );
-    }
-
-
-RMemSpyDriverRHeapBase::SCell* RMemSpyDriverHeapWalker::CellByUserAddress( TAny* aAddress, TUint aDelta )
-    {
-    RMemSpyDriverRHeapBase::SCell* ret = (RMemSpyDriverRHeapBase::SCell*) KernelAddress( aAddress, aDelta );
-    return ret;
-    }
-
-
 TBool RMemSpyDriverHeapWalker::NotifyCell( TMemSpyDriverCellType aType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber )
     {
     // Update stats first
@@ -301,32 +170,9 @@
 
 void RMemSpyDriverHeapWalker::UpdateStats( TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber )
     {
-    switch( aCellType )
-        {
-    case EMemSpyDriverGoodAllocatedCell:
-        PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::UpdateStats - EGoodAllocatedCell       - 0x%08x, len: %8d, nestingLev: %8d, allocNum: %8d", aCellAddress, aLength, aNestingLevel, aAllocNumber ));
-        break;
-    case EMemSpyDriverGoodFreeCell:
-        PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::UpdateStats - EGoodFreeCell            - 0x%08x, len: %8d, nestingLev: %8d, allocNum: %8d", aCellAddress, aLength, aNestingLevel, aAllocNumber ));
-        break;
-    case EMemSpyDriverBadAllocatedCellSize:
-        Kern::Printf("RMemSpyDriverHeapWalker::UpdateStats - EBadAllocatedCellSize    - 0x%08x, len: %8d, nestingLev: %8d, allocNum: %8d", aCellAddress, aLength, aNestingLevel, aAllocNumber );
-        break;
-    case EMemSpyDriverBadAllocatedCellAddress:
-        Kern::Printf("RMemSpyDriverHeapWalker::UpdateStats - EBadAllocatedCellAddress - 0x%08x, len: %8d, nestingLev: %8d, allocNum: %8d", aCellAddress, aLength, aNestingLevel, aAllocNumber );
-        break;
-    case EMemSpyDriverBadFreeCellAddress:
-        Kern::Printf("RMemSpyDriverHeapWalker::UpdateStats - EBadFreeCellAddress      - 0x%08x, len: %8d, nestingLev: %8d, allocNum: %8d", aCellAddress, aLength, aNestingLevel, aAllocNumber );
-        break;
-    case EMemSpyDriverBadFreeCellSize:
-        Kern::Printf("RMemSpyDriverHeapWalker::UpdateStats - EBadFreeCellSize         - 0x%08x, len: %8d, nestingLev: %8d, allocNum: %8d", aCellAddress, aLength, aNestingLevel, aAllocNumber );
-        break;
-    default:
-        Kern::Printf("RMemSpyDriverHeapWalker::UpdateStats - UHANDLED TYPE!           - 0x%08x, len: %8d, nestingLev: %8d, allocNum: %8d, type: %d", aCellAddress, aLength, aNestingLevel, aAllocNumber, aCellType );
-        break;
-        }
+    PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::UpdateStats - type: %d address: 0x%08x, len: %8d, nestingLev: %8d, allocNum: %8d", aCellType, aCellAddress, aLength, aNestingLevel, aAllocNumber ));
 
-    if  ( aCellType == EMemSpyDriverGoodFreeCell )
+    if (aCellType & EMemSpyDriverFreeCellMask)
         {
         // Update checksum
         iStats.iFreeCellCRC = iStats.iFreeCellCRC ^ reinterpret_cast<TUint32>( aCellAddress );
@@ -355,7 +201,7 @@
             iStats.iFirstFreeCellAddress = (TLinAddr) aCellAddress;
             }
         }
-    else if ( aCellType == EMemSpyDriverGoodAllocatedCell )
+    else if (aCellType & EMemSpyDriverAllocatedCellMask)
         {
         // Track cell counts and length
         ++iStats.iAllocCellCount;
@@ -372,14 +218,10 @@
             iStats.iLargestCellAddressAlloc = (TLinAddr) aCellAddress;
             }
         }
-    else
-        {
-        iStats.iLastFreeCellLength = aLength;
-        }
 
     iStats.iLastCellType = aCellType;
     iStats.iLastCellAddress = (TLinAddr) aCellAddress;
-    iStats.iLastCellWasFreeCell = ( aCellType == EMemSpyDriverGoodFreeCell );
+    iStats.iLastCellWasFreeCell = (aCellType & EMemSpyDriverFreeCellMask);
     ++iStats.iNumberOfWalkedCells;
     }
 
@@ -390,7 +232,7 @@
     iStats.iNumberOfWalkedCells = 0;
     iStats.iFirstFreeCellAddress = 0;
     iStats.iFirstFreeCellLength = 0;
-    iStats.iLastCellType = EMemSpyDriverGoodAllocatedCell;
+    iStats.iLastCellType = EMemSpyDriverAllocatedCellMask;
     iStats.iLastCellWasFreeCell = EFalse;
     iStats.iLastFreeCellLength = 0;
     iStats.iTotalFreeSpace = 0;
@@ -406,10 +248,6 @@
     iStats.iLargestCellAddressFreePrevious = 0;
     iStats.iSpackSpaceCellAddress = 0;
     iStats.iLastCellAddress = 0;
-
-    // These two can be identified up front
-    iStats.iFreeCellOverheadHeaderLength = RMemSpyDriverRHeapBase::FreeCellHeaderSize();
-    iStats.iAllocCellOverheadHeaderLength = RMemSpyDriverRHeapBase::AllocatedCellHeaderSize( iIsDebugAllocator );
     }
 
 
@@ -447,4 +285,3 @@
     PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::PrintStats - iLargestCellAddressAlloc     : 0x%08x", iStats.iLargestCellAddressAlloc ) );
     PRINTDEBUG( Kern::Printf("RMemSpyDriverHeapWalker::PrintStats - iFreeCellCRC                 : 0x%08x", iStats.iFreeCellCRC ) );
     }
-
--- a/memspy/Driver/Kernel/Source/MemSpyDriverInspectedProcess.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/MemSpyDriverInspectedProcess.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -78,6 +78,7 @@
 
 TInt DMemSpyInspectedProcess::Open( DProcess* aProcess )
     {
+	__ASSERT_CRITICAL;
     TRACE( Kern::Printf("DMemSpyInspectedProcess::Open() - START - this: 0x%08x, aProcess: 0x%08x (%O)", this, aProcess, aProcess ));
 
     TInt error = KErrNone;
@@ -128,7 +129,7 @@
 
 TInt DMemSpyInspectedProcess::NotifyOnChange( DThread* aThread, TRequestStatus* aRequestStatus, TMemSpyDriverProcessInspectionInfo* aInfo )
     {
-	Kern::MutexWait( *iLock );
+	Lock();
 
     TInt err = KErrInUse;
     const TBool notificationQueued = NotifyOnChangeQueued();
@@ -158,9 +159,7 @@
 			CompleteClientsRequest( KErrNone, &cachedChange->iInfo );
 			
 			// Discard cached entry
-            NKern::ThreadEnterCS();
 			delete cachedChange;
-            NKern::ThreadLeaveCS();
 			}
         else if ( iAmDead )
             {
@@ -174,14 +173,14 @@
 	//
     TRACE( Kern::Printf("DMemSpyInspectedProcess::NotifyOnChange() - END - this: 0x%08x, err: %d", this, err ) );
 
-	Kern::MutexSignal( *iLock );
+	Unlock();
     return err;
     }
 
 
 TInt DMemSpyInspectedProcess::NotifyOnChangeCancel()
     {
-	Kern::MutexWait( *iLock );
+	Lock();
     TRACE( Kern::Printf("DMemSpyInspectedProcess::NotifyOnChangeCancel() - START - this: 0x%08x, queued: %d, iChangeObserverThread: 0x%08x, iChangeObserverRS: 0x%08x", this, NotifyOnChangeQueued(), iChangeObserverThread, iChangeObserverRS ) );
     //
     if  ( NotifyOnChangeQueued() )
@@ -194,7 +193,7 @@
         }
 	//
     TRACE( Kern::Printf("DMemSpyInspectedProcess::NotifyOnChangeCancel() - END - this: 0x%08x", this ) );
-	Kern::MutexSignal( *iLock );
+	Unlock();
 
     return KErrNone;
     }
@@ -204,9 +203,9 @@
     {
     TRACE( Kern::Printf("DMemSpyInspectedProcess::NotifyOnChangeQueued() - START - this: 0x%08x", this ) );
     //
-	Kern::MutexWait( *iLock );
+	Lock();
     const TBool queued = ( iChangeObserverRS != NULL );
-	Kern::MutexSignal( *iLock );
+	Unlock();
     //
     TRACE( Kern::Printf("DMemSpyInspectedProcess::NotifyOnChangeQueued() - END - this: 0x%08x, queued: %d", this, queued ) );
     return queued;
@@ -449,10 +448,9 @@
     const TUint procId = iDevice.OSAdaption().DProcess().GetId( aProcess );
     if  ( procId == iProcessId )
         {
-	    Kern::MutexWait( *iLock );
+	    Lock();
 
         TRACE( Kern::Printf("DMemSpyInspectedProcess::EMHandleProcessUpdated() - START - this: 0x%08x, iProcess: 0x%08x (%O)", this, iProcess, iProcess ) );
-	    NKern::ThreadEnterCS();
 
         // Mark all tracked chunks as dirty whilst we work out
         // what is and isn't mapped into the process
@@ -476,10 +474,9 @@
             CompleteClientsRequest( KErrNone, &iInfoCurrent );
             }
 
-        NKern::ThreadLeaveCS();
         TRACE( Kern::Printf("DMemSpyInspectedProcess::EMHandleProcessUpdated() - END - this: 0x%08x", this ) );
 
-        Kern::MutexSignal( *iLock );
+        Unlock();
         }
     }
 
@@ -491,10 +488,9 @@
 
     if  ( pid == iProcessId )
         {
-	    Kern::MutexWait( *iLock );
+	    Lock();
 
         TRACE( Kern::Printf("DMemSpyInspectedProcess::EMHandleProcessRemoved() - START - this: 0x%08x", this ) );
-	    NKern::ThreadEnterCS();
 
         // We will implement a multi phased approach to the process being removed.
         //
@@ -529,10 +525,9 @@
         // Stop listening to events since we've drained everything now...
         iAmDead = ETrue;
 
-        NKern::ThreadLeaveCS();
         TRACE( Kern::Printf("DMemSpyInspectedProcess::EMHandleProcessRemoved() - END - this: 0x%08x", this ) );
 
-        Kern::MutexSignal( *iLock );
+        Unlock();
         }
     }
 
@@ -600,7 +595,7 @@
 
 void DMemSpyInspectedProcess::EMHandleThreadChanged( DThread& /*aThread*/ )
     {
-	Kern::MutexWait( *iLock );
+	Lock();
 
     TRACE( Kern::Printf("DMemSpyInspectedProcess::EMHandleThreadChanged() - START - this: 0x%08x", this ) );
 
@@ -608,7 +603,6 @@
     // We must be careful to only access the members of aThread that still
     // exist as if it is being destroyed, the object may be in an intermediate
     // state.
-	NKern::ThreadEnterCS();
 
     // All we are really interested in is recalculating the stack usage
     // for the process... 
@@ -617,19 +611,17 @@
     // Always inform observer about new results.
     CompleteClientsRequest( KErrNone, &iInfoCurrent );
 
-    NKern::ThreadLeaveCS();
     TRACE( Kern::Printf("DMemSpyInspectedProcess::EMHandleThreadChanged() - END - this: 0x%08x", this ) );
 
-    Kern::MutexSignal( *iLock );
+    Unlock();
     }
 
 
 void DMemSpyInspectedProcess::EMHandleChunkAdd( DChunk& aChunk )
     {
-	Kern::MutexWait( *iLock );
+	Lock();
 
     TRACE( Kern::Printf("DMemSpyInspectedProcess::EMHandleChunkAdd() - START - this: 0x%08x, aChunk: 0x%08x (%O)", this, &aChunk, &aChunk ) );
-	NKern::ThreadEnterCS();
 
     // Is this chunk related to our process somehow?
     if  ( IsChunkRelevantToOurProcess( aChunk ) )
@@ -656,19 +648,17 @@
             }
         }
 
-    NKern::ThreadLeaveCS();
     TRACE( Kern::Printf("DMemSpyInspectedProcess::EMHandleChunkAdd() - END - this: 0x%08x", this ) );
 
-    Kern::MutexSignal( *iLock );
+    Unlock();
     }
 
 
 void DMemSpyInspectedProcess::EMHandleChunkUpdated( DChunk& aChunk )
     {
-	Kern::MutexWait( *iLock );
+	Lock();
 
     TRACE( Kern::Printf("DMemSpyInspectedProcess::EMHandleChunkUpdated() - START - this: 0x%08x, aChunk: 0x%08x [S: %8d] (%O)", this, &aChunk, aChunk.Size(), &aChunk ) );
-	NKern::ThreadEnterCS();
 
     // Is this chunk mapped into our process?
     TMemSpyTrackedChunk* trackedEntry = TrackedChunkByHandle( &aChunk );
@@ -712,19 +702,17 @@
             }
         }
 
-    NKern::ThreadLeaveCS();
     TRACE( Kern::Printf("DMemSpyInspectedProcess::EMHandleChunkUpdated() - END - this: 0x%08x", this ) );
 
-    Kern::MutexSignal( *iLock );
+    Unlock();
     }
 
 
 void DMemSpyInspectedProcess::EMHandleChunkDeleted( DChunk& aChunk )
     {
-	Kern::MutexWait( *iLock );
+	Lock();
 
     TRACE( Kern::Printf("DMemSpyInspectedProcess::EMHandleChunkDeleted() - START - this: 0x%08x", this ) );
-	NKern::ThreadEnterCS();
 
     // Is this chunk mapped into our process?
     TMemSpyTrackedChunk* trackedEntry = TrackedChunkByHandle( &aChunk );
@@ -742,10 +730,9 @@
             }
         }
 
-    NKern::ThreadLeaveCS();
     TRACE( Kern::Printf("DMemSpyInspectedProcess::EMHandleChunkDeleted() - END - this: 0x%08x", this ) );
 
-    Kern::MutexSignal( *iLock );
+    Unlock();
     }
 
 
@@ -884,6 +871,7 @@
         TRACE( Kern::Printf("DMemSpyInspectedProcess::IsHeapChunk() - firstThread: 0x%08x (%O)", firstThread, firstThread ) );
         if  ( firstThread != NULL )
             {
+			NKern::ThreadEnterCS();
             TInt err = firstThread->Open();
             TRACE( Kern::Printf("DMemSpyInspectedProcess::IsHeapChunk() - firstThread open result: %d", err ) );
 
@@ -912,6 +900,7 @@
                 TRACE( Kern::Printf("DMemSpyInspectedProcess::IsHeapChunk() - closing first thread..." ) );
             	Kern::SafeClose( (DObject*&) firstThread, NULL );
                 }
+			NKern::ThreadLeaveCS();
             }
         }
     //
@@ -1116,6 +1105,7 @@
 
 void DMemSpyInspectedProcess::FindChunks( DProcess& aProcess )
     {
+	__ASSERT_CRITICAL;
     TRACE( Kern::Printf("DMemSpyInspectedProcess::FindChunks() - START - this: 0x%08x", this ) );
   
     DMemSpyDriverOSAdaptionDChunk& chunkAdaption = iDevice.OSAdaption().DChunk();
@@ -1125,9 +1115,11 @@
     if  ( processAdaption.IsHandleIndexValid( aProcess ) )
         {
 	    MemSpyObjectIx* processHandles = processAdaption.GetHandles( aProcess );
-        MemSpyObjectIx_Wait( processHandles );
+		
+		MemSpyObjectIx_HandleLookupLock();
+        const TInt count = processHandles->Count();
+		MemSpyObjectIx_HandleLookupUnlock();
 
-        const TInt count = processHandles->Count();
         TRACE( Kern::Printf("DMemSpyInspectedProcess::FindChunks() - got: %d handles...", count ) );
 
 	    for( TInt i=0; i<count; i++ )
@@ -1135,9 +1127,11 @@
             TRACE( Kern::Printf("DMemSpyInspectedProcess::FindChunks() - checking handle index: %2d", i ) );
 
     	    // Get a handle from the process container...
-            NKern::LockSystem();
+            MemSpyObjectIx_HandleLookupLock();
+			if (i >= processHandles->Count()) break; // Count may have changed in the meantime
     	    DObject* object = (*processHandles)[ i ];
-            NKern::UnlockSystem();
+			if (object && object->Open() != KErrNone) object = NULL;
+			MemSpyObjectIx_HandleLookupUnlock();
 
             const TObjectType objectType = ( object ? chunkAdaption.GetObjectType( *object ) : EObjectTypeAny );
             TRACE( Kern::Printf("DMemSpyInspectedProcess::FindChunks() - object: 0x%08x, type: %2d (%O)", object, objectType, object ) );
@@ -1179,9 +1173,8 @@
                         }
                     }
                 }
+			if (object) object->Close(NULL);
     	    }
-
-        MemSpyObjectIx_Signal( processHandles );
         }
 
     TRACE( Kern::Printf("DMemSpyInspectedProcess::FindChunks() - END - this: 0x%08x", this ) );
@@ -1235,6 +1228,17 @@
     }
 
 
+void DMemSpyInspectedProcess::Lock() const
+	{
+	NKern::ThreadEnterCS();
+	Kern::MutexWait(*iLock);
+	}
+
+void DMemSpyInspectedProcess::Unlock() const
+	{
+	Kern::MutexSignal(*iLock);
+	NKern::ThreadLeaveCS();
+	}
 
 
 
--- a/memspy/Driver/Kernel/Source/MemSpyDriverLogicalChannel.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/MemSpyDriverLogicalChannel.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -51,10 +51,10 @@
 
     NKern::ThreadEnterCS();
     SubChannelsDestroy();
-    NKern::ThreadLeaveCS();
 
     TRACE( Kern::Printf("DMemSpyDriverLogicalChannel::~DMemSpyDriverLogicalChannel() - closing client thread..."));
     Kern::SafeClose( (DObject*&) iClientThread, NULL );
+    NKern::ThreadLeaveCS();
 
     TRACE( Kern::Printf("DMemSpyDriverLogicalChannel::~DMemSpyDriverLogicalChannel() - calling device to cleanup..."));
     MemSpyDevice().Cleanup();
--- a/memspy/Driver/Kernel/Source/MemSpyDriverOSAdaption.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/MemSpyDriverOSAdaption.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -22,20 +22,10 @@
 #include <nk_plat.h>
 
 #ifdef __MARM__
-
 #include <arm.h>
-// Necessary when accessing data members by steam via offsets in order
-// to prevent potential unaligned data aborts
+#endif
 
-#ifdef __CC_ARM
-#define UNALIGNED_DATA_MEMBER __packed
-#endif /* __CC_ARM */
-
-#endif /* __MARM__ */
-
-#ifndef UNALIGNED_DATA_MEMBER
-#define UNALIGNED_DATA_MEMBER
-#endif
+// I've removed UNALIGNED_DATA_MEMBER in preference for just using memcpy to get round the potential unaligned access. -TomS
 
 // User includes
 #include "MemSpyDriverLog.h"
@@ -164,10 +154,9 @@
     {
     DThread* dThread = &aObject;
     TUint32 pTarget = reinterpret_cast<TUint32>( dThread ) + iOffset_ExitType;
-    UNALIGNED_DATA_MEMBER TExitType* pRet = reinterpret_cast< TExitType* >( pTarget );
-    TRACE( Kern::Printf( "DMemSpyDriverOSAdaptionDThread::GetExitType() - aObject: 0x%08x, ret: 0x%08x", &aObject, pRet ) );
-    TRACE( Kern::Printf( "DMemSpyDriverOSAdaptionDThread::GetExitType() - value: %d", *pRet ) );
-    return *pRet;
+	TUint8 exitType = *reinterpret_cast<TUint8*>(pTarget);
+    TRACE( Kern::Printf( "DMemSpyDriverOSAdaptionDThread::GetExitType() - aObject: 0x%08x, ret: %d", &aObject, (TInt)exitType ) );
+    return (TExitType)exitType;
     }
 
 
@@ -175,10 +164,11 @@
     {
     DThread* dThread = &aObject;
     TUint32 pTarget = reinterpret_cast<TUint32>( dThread ) + iOffset_SupervisorStackBase;
-    UNALIGNED_DATA_MEMBER TUint32* pRet = reinterpret_cast< TUint32* >( pTarget );
-    TRACE( Kern::Printf( "DMemSpyDriverOSAdaptionDThread::GetSupervisorStackBase() - aObject: 0x%08x, ret: 0x%08x", &aObject, pRet ) );
-    TRACE( Kern::Printf( "DMemSpyDriverOSAdaptionDThread::GetSupervisorStackBase() - 0x%08x: %d", *pRet ) );
-    return *pRet;
+
+	TUint32 ret;
+	memcpy(&ret, (const TAny*)pTarget, sizeof(TUint32));
+    TRACE( Kern::Printf( "DMemSpyDriverOSAdaptionDThread::GetSupervisorStackBase() - aObject: 0x%08x, ret: 0x%08x", &aObject, ret ) );
+    return ret;
     }
 
 
@@ -186,10 +176,11 @@
     {
     DThread* dThread = &aObject;
     TUint32 pTarget = reinterpret_cast<TUint32>( dThread ) + iOffset_SupervisorStackSize;
-    UNALIGNED_DATA_MEMBER TInt* pRet = reinterpret_cast< TInt* >( pTarget );
-    TRACE( Kern::Printf( "DMemSpyDriverOSAdaptionDThread::GetSupervisorStackSize() - aObject: 0x%08x, ret: 0x%08x", &aObject, pRet ) );
-    TRACE( Kern::Printf( "DMemSpyDriverOSAdaptionDThread::GetSupervisorStackSize() - value: %d", *pRet ) );
-    return *pRet;
+	
+	TInt ret;
+	memcpy(&ret, (const TAny*)pTarget, sizeof(TInt));
+    TRACE( Kern::Printf( "DMemSpyDriverOSAdaptionDThread::GetSupervisorStackSize() - aObject: 0x%08x, ret: %d", &aObject, ret ) );
+    return ret;
     }
 
 
@@ -448,9 +439,23 @@
     }
 
 
-DThread* DMemSpyDriverOSAdaptionDProcess::GetFirstThread( DProcess& aObject ) const
+DThread* DMemSpyDriverOSAdaptionDProcess::OpenFirstThread( DProcess& aProcess ) const
     {
-    return aObject.FirstThread();
+	// It appears that the system lock needs to be held while manipulating the iThreadQ
+	DThread* result = NULL;
+	NKern::LockSystem();
+	// We don't use DProcess::FirstThread() as that doesn't appear to do any checking of whether the list is empty, ie if there are no threads at all
+	SDblQueLink* threadLink = aProcess.iThreadQ.First();
+	if (threadLink != NULL && threadLink != &aProcess.iThreadQ.iA)
+		{
+		result = _LOFF(threadLink,DThread,iProcessLink);
+		if (result->Open() != KErrNone)
+			{
+			result = NULL;
+			}
+		}
+	NKern::UnlockSystem();
+    return result;
     }
 
 
@@ -545,6 +550,11 @@
     return (TUint8*)aObject.iDataBssStackChunk;
     }
 
+TBool DMemSpyDriverOSAdaptionDProcess::IsKernProcess(DProcess& aProcess) const
+	{
+	// The kernel process always has pid 1
+	return GetId(aProcess) == 1;
+	}
 
 
 
@@ -566,9 +576,32 @@
     }
 
 
-TUint8* DMemSpyDriverOSAdaptionDChunk::GetBase( DChunk& aObject ) const
+TUint8* DMemSpyDriverOSAdaptionDChunk::GetBase( DChunk& aChunk ) const
     {
-    return aObject.Base();
+    TUint8* base = aChunk.Base();
+	if (base == 0)
+		{
+		// Under flexible memory model, DChunk::Base() will return NULL (for non-fixed chunks anyway, and that means most of them)
+		// A more useful thing to return is the base address in the owning process
+		DProcess* proc = GetOwningProcess(aChunk);
+		NKern::ThreadEnterCS();
+		if (proc && proc->Open() == KErrNone)
+			{
+			// Probably shouldn't call ChunkUserBase for a non-user-owned chunk
+			if (!OSAdaption().DProcess().IsKernProcess(*proc))
+				{
+				DThread* firstThread = OSAdaption().DProcess().OpenFirstThread(*proc);
+				if (firstThread)
+					{
+					base = Kern::ChunkUserBase(&aChunk, firstThread);
+					firstThread->Close(NULL);
+					}
+				}
+			proc->Close(NULL);
+			}
+		NKern::ThreadLeaveCS();
+		}
+	return base; 
     }
 
 
--- a/memspy/Driver/Kernel/Source/MemSpyDriverObjectIx.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/MemSpyDriverObjectIx.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -55,6 +55,30 @@
 	{ Kern::Fault("DOBJECT",aPanic); }
 	
 
+TBool MemSpyObjectIx::Find(DObject* aObj)
+	{
+	//Check preconditions(debug build only)
+	__ASSERT_CRITICAL;
+	__ASSERT_NO_FAST_MUTEX;
+
+	// I don't like the implementation of At() that was here before, it wasn't safe at all without HandleMutex. So I'm replacing it with a simpler
+	// version based on operator[] that only does what we need and does it safely.
+
+	TBool found = EFalse;
+	MemSpyObjectIx_HandleLookupLock();
+	const TInt count = Count();
+	for (TInt i = 0; i < count; i++)
+		{
+		if ((*this)[i] == aObj)
+			{
+			found = ETrue;
+			break;
+			}
+		}
+	MemSpyObjectIx_HandleLookupUnlock();
+	return found;
+	}
+
 #if MCL_ROBJECTIX_DUPLICATION
 
 #define asserta(x)	do { if (!(x)) { __crash(); } } while(0)
@@ -65,17 +89,18 @@
     }
 
 
+/*
 void RMemSpyObjectIx::Wait()
 	{
-//	Kern::MutexWait(*HandleMutex);
+	Kern::MutexWait(*HandleMutex);
 	} // RObjectIx::Wait
 
 
 void RMemSpyObjectIx::Signal()
 	{
-//	Kern::MutexSignal(*HandleMutex);
+	Kern::MutexSignal(*HandleMutex);
 	} // RObjectIx::Signal
-
+*/
 
 DObject* RMemSpyObjectIx::operator[](TInt aIndex)
 	{
@@ -89,73 +114,19 @@
 	} // RObjectIx::operator[]
 
 
-TInt RMemSpyObjectIx::At(DObject* aObj)
-	{
-	//Check preconditions(debug build only)
-	__ASSERT_CRITICAL;
-	__ASSERT_NO_FAST_MUTEX;
-	//__ASSERT_MUTEX(HandleMutex);
-
-	if (iState==ETerminated)
-		{
-		return KErrNotFound;
-		}
-
-	TInt h = KErrNotFound;
-	AcquireWriteLock();
-	iState = (TUint8)ESearching;		// enable monitoring of new handles
-	iModList.iMonitor.iObj = aObj;		// object to check for
-	iModList.iMonitor.iBoundary = 0;	// will change if aObj is added to a slot before this point
-	TInt pos = 0;
-	while (pos<iCount && iActiveCount)	// stop if index empty
-		{
-		TInt limit = pos + EMaxLockedIter;
-		if (limit>iCount)
-			{
-			limit = iCount;
-			}
-		while (pos<limit)
-			{
-			SSlot* slot = iSlots + pos;
-			if (Occupant(slot) == aObj)
-				{
-				// found it, finish
-				h = MakeHandle(pos, slot->iUsed.iAttr);
-				break;
-				}
-			pos++;
-			}
-		if (h>0)
-			{
-			break;	// found it, finish
-			}
-		iModList.iMonitor.iBoundary = pos;	// will change if aObj is added to a slot already checked
-		ReleaseWriteLock();	// let other threads in
-		AcquireWriteLock();
-		pos = iModList.iMonitor.iBoundary;	// next position to check
-		}
-	iState = (TUint8)ENormal;
-	ReleaseWriteLock();
-	return h;
-	} // RObjectIx::At
-
-
-
-
-
-
 #elif MCL_DOBJECTIX_DUPLICATION
 
-void DMemSpyObjectIx::Wait( DMemSpyObjectIx* /*aObjectIndex*/ )
+/*
+void DMemSpyObjectIx::Wait( DMemSpyObjectIx* aObjectIndex )
 	{
 //	Kern::MutexWait(*aObjectIndex->HandleMutex);
 	}
 
-void DMemSpyObjectIx::Signal( DMemSpyObjectIx* /*aObjectIndex*/ )
+void DMemSpyObjectIx::Signal( DMemSpyObjectIx* aObjectIndex )
 	{
 //	Kern::MutexSignal(*aObjectIndex->HandleMutex);
 	}
-
+*/
 
 /** Counts the number of times an object appears in this index.
 
@@ -237,42 +208,6 @@
 	return pS->obj;
 	}
 
-
-
-/**	Looks up an object in the index by object pointer.
-
-	Returns a handle to the object.
-
-	@param	aObj	Pointer to the object to look up.
-	
-	@return	Handle to object (always >0);
-	        KErrNotFound, if object not present in index.
-
-    @pre    Calling thread must be in a critical section.
-    @pre    No fast mutex can be held.
-	@pre	Call in a thread context.
-	@pre	DObject::HandleMutex held.
- */
-TInt DMemSpyObjectIx::At(DObject* aObj)
-	{
-	//Check preconditions(debug build only)
-	__ASSERT_CRITICAL;
-	__ASSERT_NO_FAST_MUTEX;
-
-	if (iCount)
-		{
-		SDObjectIxRec* pS=iObjects;
-		SDObjectIxRec* pE=pS+iCount;
-		TInt i=0;
-		while(pS<pE && pS->obj!=aObj)
-			pS++, i++;
-		if (pS<pE)
-			return(makeHandle(i,pS->str.instance));
-		}
-	return KErrNotFound;
-	}
-
-
 /** Finds the object at a specific position in the index array.
 
 	@param	aIndex	Index into array.
--- a/memspy/Driver/Kernel/Source/MemSpyDriverStreamWriter.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/MemSpyDriverStreamWriter.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -69,7 +69,7 @@
         }
     else
         {
-        TRACE( Kern::Printf( "RMemSpyMemStreamWriter::WriteInt32() - asked to write: 0x%08x from fn: 0x%08x BUT AM FULL", aValue, __return_address() ) );
+        //TRACE( Kern::Printf( "RMemSpyMemStreamWriter::WriteInt32() - asked to write: 0x%08x from fn: 0x%08x BUT AM FULL", aValue, __return_address() ) );
         }
     //
     return ret;
@@ -89,7 +89,7 @@
         }
     else
         {
-        TRACE( Kern::Printf( "RMemSpyMemStreamWriter::WriteUint32() - asked to write: 0x%08x from fn: 0x%08x BUT AM FULL", aValue, __return_address() ) );
+        //TRACE( Kern::Printf( "RMemSpyMemStreamWriter::WriteUint32() - asked to write: 0x%08x from fn: 0x%08x BUT AM FULL", aValue, __return_address() ) );
         }
     //
     return ret;
--- a/memspy/Driver/Kernel/Source/MemSpyDriverSuspensionManager.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/MemSpyDriverSuspensionManager.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -427,10 +427,8 @@
     //
 	if ( iTempObj )
         {
-		NKern::LockSystem();
 		r = iTempObj->Open();
 	    TRACE( Kern::Printf("DMemSpySuspensionManager::OpenTempObject() - open returned: %d", r ));
-		NKern::UnlockSystem();
 		//
         if  ( r == KErrNone )
             {
@@ -499,14 +497,9 @@
 	__ASSERT_DEBUG( iTempObj, MemSpyDriverUtils::Fault( __LINE__ ) );
     if  ( iTempObj )
         {
-	    NKern::ThreadEnterCS();
-        
-        TRACE( Kern::Printf("DMemSpySuspensionManager::CloseTempObject() - in CS..." ));
+		NKern::ThreadEnterCS();
 	    Kern::SafeClose( iTempObj, NULL );
-        TRACE( Kern::Printf("DMemSpySuspensionManager::CloseTempObject() - done safe close..." ));
-	    NKern::ThreadLeaveCS();
-
-        TRACE( Kern::Printf("DMemSpySuspensionManager::CloseTempObject() - left CS" ));
+		NKern::ThreadLeaveCS();
         }
 
     TRACE( Kern::Printf("DMemSpySuspensionManager::CloseTempObject() - END" ));
--- a/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanBase.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanBase.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -143,10 +143,8 @@
     //
 	if ( iTempObj )
         {
-		NKern::LockSystem();
 		r = iTempObj->Open();
 	    TRACE( Kern::Printf("DMemSpyDriverLogChanBase::OpenTempObject() - open returned: %d", r ));
-		NKern::UnlockSystem();
 		//
         if  ( r == KErrNone )
             {
--- a/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanChunks.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanChunks.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -164,15 +164,18 @@
 
 	    // Iterate through each handle in the process
 	    MemSpyObjectIx* processHandles = processAdaption.GetHandles( *process );
-        MemSpyObjectIx_Wait( processHandles );
+		MemSpyObjectIx_HandleLookupLock();
+        const TInt processHandleCount = processHandles->Count();
+		MemSpyObjectIx_HandleLookupUnlock();
 
-        const TInt processHandleCount = processHandles->Count();
 	    for( TInt processHandleIndex = 0; processHandleIndex<processHandleCount && r == KErrNone && currentWriteIndex < maxCount; processHandleIndex++ )
     	    {
     	    // Get a handle from the process container...
-            NKern::LockSystem();
+            MemSpyObjectIx_HandleLookupLock();
+			if (processHandleIndex >= processHandles->Count()) break; // Count may have changed in the meantime
     	    DObject* object = (*processHandles)[ processHandleIndex ];
-            NKern::UnlockSystem();
+			if (object && object->Open() != KErrNone) object = NULL;
+			MemSpyObjectIx_HandleLookupUnlock();
             
             if  ( object )
                 {
@@ -187,11 +190,10 @@
                         ++currentWriteIndex;
                         }
                     }
+				object->Close(NULL);
                 }
     	    }
 
-        MemSpyObjectIx_Signal( processHandles );
-
         // If we were asked for process-related chunks, also check the chunk container
         // for entries which we don't have handles to, but do refer to our process
         // Need a listing of all chunks in the system. Let client filter duplicates.
@@ -276,34 +278,36 @@
 	NKern::ThreadEnterCS();
 
     container->Wait();
-    NKern::LockSystem();
     const TInt count = container->Count();
-    NKern::UnlockSystem();
 
     DChunk* foundChunk = NULL;
     
     for(TInt i=0; i<count; i++)
         {
-        NKern::LockSystem();
         DChunk* chunk = (DChunk*) (*container)[i];
-        NKern::UnlockSystem();
-        //
         if  ( chunk == params.iHandle )
             {
             foundChunk = chunk;
             TRACE( PrintChunkInfo( *chunk ) );
+			r = foundChunk->Open();
             break;
             }
         }
 
     container->Signal();
-	NKern::ThreadLeaveCS();
 
     if  ( foundChunk == NULL )
         {
     	Kern::Printf("DMemSpyDriverLogChanChunks::GetChunkInfo() - END - KErrNotFound - couldnt find chunk");
+		NKern::ThreadLeaveCS();
         return KErrNotFound;
         }
+	if (r)
+		{
+		Kern::Printf("DMemSpyDriverLogChanChunks::GetChunkInfo() - END - %d - Failed to open chunk", r);
+		NKern::ThreadLeaveCS();
+		return r;
+		}
 
     // Prepare return data
     DMemSpyDriverOSAdaptionDChunk& chunkAdaption = OSAdaption().DChunk();
@@ -335,6 +339,10 @@
     // Get type & attribs
     params.iType = IdentifyChunkType( *foundChunk );
     params.iAttributes = chunkAdaption.GetAttributes( *foundChunk );
+
+	// Finished with foundChunk
+	foundChunk->Close(NULL);
+	NKern::ThreadLeaveCS();
     
     // Write back to client
     r = Kern::ThreadRawWrite( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverInternalChunkInfoParams) );
@@ -470,40 +478,36 @@
 
     if  ( process && size >= 4 )
         {
+		NKern::ThreadEnterCS();
         // Chunks are mapped into entire process so any thread within the process is enough...
-        DThread* firstThread = processAdaption.GetFirstThread( *process );
+        DThread* firstThread = processAdaption.OpenFirstThread( *process );
         TRACE( Kern::Printf("DMemSpyDriverLogChanChunks::IsHeapChunk() - firstThread: 0x%08x (%O)", firstThread, firstThread ) );
         if  ( firstThread != NULL )
             {
-            TInt err = firstThread->Open();
-            TRACE( Kern::Printf("DMemSpyDriverLogChanChunks::IsHeapChunk() - firstThread open result: %d", err ) );
-
+            TBuf8<4> allocatorVTableBuffer;
+            TInt err = Kern::ThreadRawRead( firstThread, base, (TUint8*) allocatorVTableBuffer.Ptr(), allocatorVTableBuffer.MaxLength() );
+            TRACE( Kern::Printf("DMemSpyDriverLogChanChunks::IsHeapChunk - read result of vtable data from requested thread is: %d", err ));
+            //
             if  ( err == KErrNone )
                 {
-                TBuf8<4> allocatorVTableBuffer;
-                err = Kern::ThreadRawRead( firstThread, base, (TUint8*) allocatorVTableBuffer.Ptr(), allocatorVTableBuffer.MaxLength() );
-                TRACE( Kern::Printf("DMemSpyDriverLogChanChunks::IsHeapChunk - read result of vtable data from requested thread is: %d", err ));
-                //
-                if  ( err == KErrNone )
-                    {
-                    TRACE( MemSpyDriverUtils::DataDump("possible chunk vtable data - %lS", allocatorVTableBuffer.Ptr(), allocatorVTableBuffer.MaxLength(), allocatorVTableBuffer.MaxLength() ) );
-                    allocatorVTableBuffer.SetLength( allocatorVTableBuffer.MaxLength() );
-                    
-                    const TUint32 vtable =   allocatorVTableBuffer[0] +
-                                            (allocatorVTableBuffer[1] << 8) + 
-                                            (allocatorVTableBuffer[2] << 16) + 
-                                            (allocatorVTableBuffer[3] << 24);
-                    TRACE( Kern::Printf("DMemSpyDriverLogChanChunks::IsHeapChunk - [possible] vTable within chunk is: 0x%08x", vtable) );
+                TRACE( MemSpyDriverUtils::DataDump("possible chunk vtable data - %lS", allocatorVTableBuffer.Ptr(), allocatorVTableBuffer.MaxLength(), allocatorVTableBuffer.MaxLength() ) );
+                allocatorVTableBuffer.SetLength( allocatorVTableBuffer.MaxLength() );
+                
+                const TUint32 vtable =   allocatorVTableBuffer[0] +
+                                        (allocatorVTableBuffer[1] << 8) + 
+                                        (allocatorVTableBuffer[2] << 16) + 
+                                        (allocatorVTableBuffer[3] << 24);
+                TRACE( Kern::Printf("DMemSpyDriverLogChanChunks::IsHeapChunk - [possible] vTable within chunk is: 0x%08x", vtable) );
 
-                    // Check the v-table to work out if it really is an RHeap
-                    isHeap = ( vtable == rHeapVTable );
-                    TRACE( Kern::Printf("DMemSpyDriverLogChanChunks::IsHeapChunk() - isHeap: %d", isHeap ) );
-                    }
+                // Check the v-table to work out if it really is an RHeap
+                isHeap = ( vtable == rHeapVTable );
+                TRACE( Kern::Printf("DMemSpyDriverLogChanChunks::IsHeapChunk() - isHeap: %d", isHeap ) );
+                }
 
-                TRACE( Kern::Printf("DMemSpyDriverLogChanChunks::IsHeapChunk() - closing first thread..." ) );
-            	Kern::SafeClose( (DObject*&) firstThread, NULL );
-                }
+            TRACE( Kern::Printf("DMemSpyDriverLogChanChunks::IsHeapChunk() - closing first thread..." ) );
+            Kern::SafeClose( (DObject*&) firstThread, NULL );
             }
+		NKern::ThreadLeaveCS();
         }
 
     /* We only want RHeap's at the moment
--- a/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanClientServer.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanClientServer.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -96,8 +96,8 @@
     NKern::ThreadEnterCS();
 
     DObject* serverHandle = (DObject*) params.iServerHandle;
-    serverHandle = CheckIfObjectIsInContainer( EMemSpyDriverContainerTypeServer, serverHandle );
-    if  ( serverHandle == NULL )
+    DServer* server = static_cast<DServer*>(CheckedOpen(EMemSpyDriverContainerTypeServer, serverHandle));
+    if (server == NULL)
         {
     	Kern::Printf("DMemSpyDriverLogChanClientServer::GetServerSessionHandles() - END - server not found");
         NKern::ThreadLeaveCS();
@@ -106,47 +106,29 @@
 
 	ResetTempHandles();
 
-    DServer* server = (DServer*) serverHandle;
-    NKern::LockSystem();
-
-    r = server->Open();
-    if  ( r == KErrNone )
+    NKern::LockSystem(); // Iterating session queue requires system lock
+    // Iterate through this server's sessions, writing back session pointer (handle)
+    // to client
+    SDblQue& serverQueue = serverAdaption.GetSessionQueue( *server );
+    SDblQueLink* anchor = &serverQueue.iA;
+    SDblQueLink* link = serverQueue.First();
+    while( link != anchor )
         {
-        // Iterate through this server's sessions, writing back session pointer (handle)
-        // to client
-        SDblQue& serverQueue = serverAdaption.GetSessionQueue( *server );
-        SDblQueLink* anchor = &serverQueue.iA;
-        SDblQueLink* link = serverQueue.First();
-        while( link != anchor )
-        	{
-			DSession* session = serverAdaption.GetSession( link );
+		DSession* session = serverAdaption.GetSession( link );
 
-            // Found a match in the specified container. Write the object's handle (aka the object address)
-            // back to the client address space
-            if  ( session )
-                {
-                AddTempHandle( session );
-                }
-
-            // Get next item
-            link = link->iNext;
+        // Found a match in the specified container. Write the object's handle (aka the object address)
+        // back to the client address space
+        if  ( session )
+            {
+            AddTempHandle( session );
             }
 
-        NKern::ThreadEnterCS();
-        TRACE( Kern::Printf("DMemSpyDriverLogChanClientServer::GetServerSessionHandles() - in CS..." ));
-        //
-	    Kern::SafeClose( (DObject*&) server, NULL );
-        TRACE( Kern::Printf("DMemSpyDriverLogChanClientServer::GetServerSessionHandles() - done safe close..." ));
-        //
-	    NKern::ThreadLeaveCS();
-        TRACE( Kern::Printf("DMemSpyDriverLogChanClientServer::GetServerSessionHandles() - left CS" ));
+        // Get next item
+        link = link->iNext;
         }
-    else
-        {
-    	Kern::Printf("DMemSpyDriverLogChanClientServer::GetServerSessionHandles - error: %d opening server", r);
-        }
-
     NKern::UnlockSystem();
+	server->Close(NULL);
+	NKern::ThreadLeaveCS();
 
     // This variable holds the number of handles that we have already
 	// written to the client-side.
@@ -176,7 +158,6 @@
             }
         }
 
-	NKern::ThreadLeaveCS();
 
 	TRACE( Kern::Printf("DMemSpyDriverLogChanClientServer::GetServerSessionHandles() - END - r: %d", r));
 	return r;
@@ -199,74 +180,48 @@
 
 	NKern::ThreadEnterCS();
 
-    DObject* sessionHandle = (DObject*) aSessionHandle;
-    sessionHandle = CheckIfObjectIsInContainer( EMemSpyDriverContainerTypeSession, sessionHandle );
-    if  ( sessionHandle == NULL )
+    DSession* session = (DSession*)CheckedOpen(EMemSpyDriverContainerTypeSession, (DObject*)aSessionHandle);
+    if (session == NULL )
         {
     	Kern::Printf("DMemSpyDriverLogChanClientServer::GetServerSessionInfo() - END - session not found");
         NKern::ThreadLeaveCS();
         return KErrNotFound;
         }
 
-    DSession* session = (DSession*) sessionHandle;
     session->FullName( params.iName );
 
-    NKern::LockSystem();
-    r = session->Open();
-    if  ( r == KErrNone )
+    // Get owner type and id
+    DObject* sessionOwner = sessionAdaption.GetOwner( *session );
+    if  ( sessionOwner )
         {
-        // Get owner type and id
-        DObject* sessionOwner = sessionAdaption.GetOwner( *session );
-        if  ( sessionOwner )
+        const TObjectType objectType = sessionAdaption.GetObjectType( *sessionOwner );
+        if  ( objectType == EProcess )
             {
-            const TObjectType objectType = sessionAdaption.GetObjectType( *sessionOwner );
-            if  ( objectType == EProcess )
-                {
-                DProcess* sessionProcess = (DProcess*) sessionOwner;
-                //
-                params.iOwnerId = processAdaption.GetId( *sessionProcess );
-                params.iOwnerType = TMemSpyDriverServerSessionInfo::EOwnerProcess;
-                }
-            else if ( objectType == EThread )
-                {
-                DThread* sessionThread = (DThread*) sessionOwner;
-                //
-                params.iOwnerId = threadAdaption.GetId( *sessionThread );
-                params.iOwnerType = TMemSpyDriverServerSessionInfo::EOwnerThread;
-                }
+            DProcess* sessionProcess = (DProcess*) sessionOwner;
+            //
+            params.iOwnerId = processAdaption.GetId( *sessionProcess );
+            params.iOwnerType = TMemSpyDriverServerSessionInfo::EOwnerProcess;
             }
-        else
+        else if ( objectType == EThread )
             {
-            params.iOwnerId = -1;
-            params.iOwnerType = TMemSpyDriverServerSessionInfo::EOwnerNone;
+            DThread* sessionThread = (DThread*) sessionOwner;
+            //
+            params.iOwnerId = threadAdaption.GetId( *sessionThread );
+            params.iOwnerType = TMemSpyDriverServerSessionInfo::EOwnerThread;
             }
-
-        // Other attributes
-        params.iSessionType = sessionAdaption.GetSessionType( *session );
-        params.iAddress = (TUint8*)session;
-
-        NKern::ThreadEnterCS();
-        TRACE( Kern::Printf("DMemSpyDriverLogChanClientServer::GetServerSessionInfo() - in CS..." ));
-        //
-	    Kern::SafeClose( (DObject*&) session, NULL );
-        TRACE( Kern::Printf("DMemSpyDriverLogChanClientServer::GetServerSessionInfo() - done safe close..." ));
-        //
-	    NKern::ThreadLeaveCS();
-        TRACE( Kern::Printf("DMemSpyDriverLogChanClientServer::GetServerSessionInfo() - left CS" ));
         }
     else
         {
-    	Kern::Printf("DMemSpyDriverLogChanClientServer::GetServerSessionInfo - error: %d opening server", r);
+        params.iOwnerId = -1;
+        params.iOwnerType = TMemSpyDriverServerSessionInfo::EOwnerNone;
         }
 
-    NKern::UnlockSystem();
-
-    if  ( r == KErrNone )
-        {
-        r = Kern::ThreadRawWrite( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverServerSessionInfo) );
-        }
-
+    // Other attributes
+    params.iSessionType = sessionAdaption.GetSessionType( *session );
+    params.iAddress = (TUint8*)session;
+	session->Close(NULL);
 	NKern::ThreadLeaveCS();
+    r = Kern::ThreadRawWrite( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverServerSessionInfo) );
 
 	TRACE( Kern::Printf("DMemSpyDriverLogChanClientServer::GetServerSessionInfo() - END - r: %d", r));
 	return r;
--- a/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanContainerBase.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanContainerBase.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -49,58 +49,44 @@
 
 
 
-
-
-
-DObject* DMemSpyDriverLogChanContainerBase::CheckIfObjectIsInContainer( TMemSpyDriverContainerType aContainerType, DObject* aSearchFor, TBool aQuick )
-    {
-	__ASSERT_DEBUG( aSearchFor != NULL, MemSpyDriverUtils::Fault( __LINE__ ) );
-    const TObjectType expectedType = ObjectTypeFromMemSpyContainerType( aContainerType );
-    TRACE( Kern::Printf("DMemSpyDriverLogChanContainerBase::CheckIfObjectIsInContainer - START - aSearchFor: 0x%08x, expectedType: %d", aSearchFor, expectedType ));
+DObject* DMemSpyDriverLogChanContainerBase::CheckedOpen(TMemSpyDriverContainerType aContainerType, DObject* aObject, TBool aQuick)
+	{
+	__ASSERT_CRITICAL;
+	__ASSERT_DEBUG(aObject != NULL, MemSpyDriverUtils::Fault( __LINE__ ));
+    const TObjectType expectedType = ObjectTypeFromMemSpyContainerType(aContainerType);
 
-    DObject* ret = NULL;
-    
-    // Quick mode means we just check container ids and we trust that the object
-    // will exist.
-    if ( aQuick )
+    // Quick mode means we just check container ids and we trust that the object will exist.
+	// [TomS: not entirely convinced we can ever be certain of that]
+    TInt err = KErrNotFound;
+    if (aQuick)
         {
-        const TObjectType objectType = OSAdaption().DThread().GetObjectType( *aSearchFor );
-        TRACE( Kern::Printf("DMemSpyDriverLogChanContainerBase::CheckIfObjectIsInContainer - aSearchFor.iContainerID: %d", objectType ) );
-        if  ( objectType == expectedType )
+		LOG("quick CheckedOpen of %08x", aObject);
+        const TObjectType objectType = OSAdaption().DThread().GetObjectType(*aObject);
+        if (objectType == expectedType)
             {
-            ret = aSearchFor;
+            err = aObject->Open();
             }
         }
-    else
-        {
-        // Full check to see if the specified object is part of the container
-        DObjectCon* container = Kern::Containers()[ expectedType ];
+	else
+		{
+        DObjectCon* container = Kern::Containers()[expectedType];
         container->Wait();
-        NKern::LockSystem();
-
         const TInt count = container->Count();
-        for(TInt i=0; i<count; i++)
+        for (TInt i = 0; i < count; i++)
             {
-            DObject* object = (*container)[ i ];
-
-            // Do the two match?
-            if  ( object == aSearchFor )
+            DObject* object = (*container)[i];
+            if (object == aObject)
                 {
-                TRACE( Kern::Printf("    found match: %O", object));
-
-                ret = object;
-                break;
-                }
-            }
+                err = aObject->Open();
+				break;
+				}
+			}
+		container->Signal();
+		}
 
-        NKern::UnlockSystem();
-        container->Signal();
-        }
-
-    TRACE( Kern::Printf("DMemSpyDriverLogChanContainerBase::CheckIfObjectIsInContainer - END - ret: 0x%08x", ret ));
-    TRACE( Kern::Printf(" ") );
-    return ret;
-    }
+	LOG("CheckedOpen(%d, 0x%08x, quick=%d) returned error %d", aContainerType, aObject, aQuick, err);
+	return (err == KErrNone) ? aObject : NULL;
+	}
 
 
 
--- a/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanContainers.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanContainers.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -146,7 +146,6 @@
 
         DObjectCon* container = Kern::Containers()[type];
         container->Wait();
-        NKern::LockSystem();
 
         const TInt count = container->Count();
         for(TInt i=0; i<count; i++)
@@ -158,9 +157,7 @@
                 }
             }
 
-        NKern::UnlockSystem();
         container->Signal();
-
     	NKern::ThreadLeaveCS();
         }
     else
@@ -214,34 +211,30 @@
 
                 // Iterate through each handle in the thread/process and add it to the temp handles container if
                 // the handle is of the correct type.
-                MemSpyObjectIx_Wait( handles );
 
-	            TInt handleCount = handles->Count();
+				MemSpyObjectIx_HandleLookupLock();
+				const TInt handleCount = handles->Count();
+				MemSpyObjectIx_HandleLookupUnlock();
                 TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetContainerHandles - %d handles in index...", handleCount ));
 
                 for( TInt handleIndex=0; handleIndex<handleCount; handleIndex++ )
     	            {
     	            // Get a handle from the container...
-                    NKern::LockSystem();
-    	            DObject* objectToSearchFor = (*handles)[ handleIndex ];
-                    NKern::UnlockSystem();
+					MemSpyObjectIx_HandleLookupLock();
+					if (handleIndex >= handles->Count()) break; // Count may have changed in the meantime
+    				DObject* objectToSearchFor = (*handles)[ handleIndex ];
+					if (objectToSearchFor && objectToSearchFor->Open() != KErrNone) objectToSearchFor = NULL;
+					MemSpyObjectIx_HandleLookupUnlock();
         
-                    if  ( objectToSearchFor != NULL )
+                    if (objectToSearchFor && OSAdaption().DThread().GetObjectType(*objectToSearchFor) == ObjectTypeFromMemSpyContainerType(params.iContainer))
                         {
-                        // Check to see if this object is of the specified type. We can use quick mode
-                        // because we know the object is valid since it's registered as a handle of the
-                        // thread/process.
-                        DObject* matchResult = CheckIfObjectIsInContainer( params.iContainer, objectToSearchFor, ETrue );
-                        if  ( matchResult )
-                            {
-                            // Found a match in the specified container. Write the object's handle (aka the object address)
-                            // back to the client address space
-                            AddTempHandle( matchResult );
-                            }
+                        // Found a match in the specified container. Write the object's handle (aka the object address)
+                        // back to the client address space
+                        AddTempHandle( objectToSearchFor );
                         }
+					if (objectToSearchFor) objectToSearchFor->Close(NULL);
     	            }
 
-                MemSpyObjectIx_Signal( handles );
                 NKern::ThreadLeaveCS();
                 }
 
@@ -307,30 +300,21 @@
 
     // First, locate the specific DObject in question. Cast the handle, but don't use the object...
     DObject* handleAsObject = (DObject*) params.iHandle;
-    handleAsObject = CheckIfObjectIsInContainer( params.iType, handleAsObject );
+    handleAsObject = CheckedOpen(params.iType, handleAsObject);
     if  ( handleAsObject != NULL )
         {
         // We found the right object. First get generic info.
         handleAsObject->FullName( params.iName );
         handleAsObject->Name( params.iNameDetail );
         
-        NKern::LockSystem();
-        r = handleAsObject->Open();
-        NKern::UnlockSystem();
-        //
-        if  ( r == KErrNone )
-            {
-            // Using threadAddaption to fetch generic info.
-            // Implementations of following get functions are actually in DMemSpyDriverOSAdaptionDObject
-            // so it does not matter what adaption to use for generic info.
-            DMemSpyDriverOSAdaptionDThread& threadAddaption = OSAdaption().DThread();
-            params.iAccessCount = threadAddaption.GetAccessCount( *handleAsObject );
-            params.iUniqueID = threadAddaption.GetUniqueID( *handleAsObject );
-            params.iProtection = threadAddaption.GetProtection( *handleAsObject );
-            params.iAddressOfKernelOwner = threadAddaption.GetAddressOfKernelOwner( *handleAsObject );
-            //
-            handleAsObject->Close( NULL );
-            }
+        // Using threadAddaption to fetch generic info.
+        // Implementations of following get functions are actually in DMemSpyDriverOSAdaptionDObject
+        // so it does not matter what adaption to use for generic info.
+        DMemSpyDriverOSAdaptionDThread& threadAddaption = OSAdaption().DThread();
+        params.iAccessCount = threadAddaption.GetAccessCount( *handleAsObject );
+        params.iUniqueID = threadAddaption.GetUniqueID( *handleAsObject );
+        params.iProtection = threadAddaption.GetProtection( *handleAsObject );
+        params.iAddressOfKernelOwner = threadAddaption.GetAddressOfKernelOwner( *handleAsObject );
         
         // Get type-specific info.
         if  ( params.iType == EMemSpyDriverContainerTypeThread )
@@ -338,76 +322,49 @@
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - EMemSpyDriverContainerTypeThread" ));
 
             DThread* object = (DThread*) handleAsObject;
-	        NKern::LockSystem();
-            r = object->Open();
-    	    NKern::UnlockSystem();
+            DMemSpyDriverOSAdaptionDThread& threadAdaption = OSAdaption().DThread();
             //
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDThread& threadAdaption = OSAdaption().DThread();
-                //
-                params.iId = threadAdaption.GetId( *object );
-                params.iPriority = threadAdaption.GetPriority( *object );
-                params.iAddressOfOwningProcess = threadAdaption.GetAddressOfOwningProcess( *object );
-                threadAdaption.GetNameOfOwningProcess( *object, params.iNameOfOwner );
-                //
-                object->Close( NULL );
-                }
+            params.iId = threadAdaption.GetId( *object );
+            params.iPriority = threadAdaption.GetPriority( *object );
+            params.iAddressOfOwningProcess = threadAdaption.GetAddressOfOwningProcess( *object );
+            threadAdaption.GetNameOfOwningProcess( *object, params.iNameOfOwner );
             }
         else if ( params.iType == EMemSpyDriverContainerTypeProcess )
             {
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - EMemSpyDriverContainerTypeProcess" ));
 
             DProcess* object = (DProcess*) handleAsObject;
-	        NKern::LockSystem();
-            r = object->Open();
-    	    NKern::UnlockSystem();
+            DMemSpyDriverOSAdaptionDProcess& processAdaption = OSAdaption().DProcess();
+            //
+            params.iId = processAdaption.GetId( *object );
             //
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDProcess& processAdaption = OSAdaption().DProcess();
-                //
-                params.iId = processAdaption.GetId( *object );
-                //
-                params.iPriority = processAdaption.GetPriority( *object );
-                params.iAddressOfOwningProcess = processAdaption.GetAddressOfOwningProcess( *object );
-                params.iCreatorId = processAdaption.GetCreatorId( *object );
-                params.iSecurityZone = processAdaption.GetSecurityZone( *object );
-                params.iAttributes = processAdaption.GetAttributes( *object );
-                params.iAddressOfDataBssStackChunk = processAdaption.GetAddressOfDataBssStackChunk( *object );
-                //
-                object->Close( NULL );
-                }
+            params.iPriority = processAdaption.GetPriority( *object );
+            params.iAddressOfOwningProcess = processAdaption.GetAddressOfOwningProcess( *object );
+            params.iCreatorId = processAdaption.GetCreatorId( *object );
+            params.iSecurityZone = processAdaption.GetSecurityZone( *object );
+            params.iAttributes = processAdaption.GetAttributes( *object );
+            params.iAddressOfDataBssStackChunk = processAdaption.GetAddressOfDataBssStackChunk( *object );
             }
         else if ( params.iType == EMemSpyDriverContainerTypeChunk )
             {
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - EMemSpyDriverContainerTypeChunk" ));
 
             DChunk* object = (DChunk*) handleAsObject;
-	        NKern::LockSystem();
-            r = object->Open();
-    	    NKern::UnlockSystem();
+            DMemSpyDriverOSAdaptionDChunk& ca = OSAdaption().DChunk();
             //
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDChunk& ca = OSAdaption().DChunk();
-                //
-                params.iSize = ca.GetSize( *object );
-                params.iId = ca.GetOwningProcessId( *object );
-                params.iAddressOfOwningProcess = ca.GetAddressOfOwningProcess( *object );
-                params.iMaxSize = ca.GetMaxSize( *object );
-                params.iBottom = ca.GetBottom( *object );
-                params.iTop = ca.GetTop( *object );
-                params.iAttributes = ca.GetAttributes( *object );
-                params.iStartPos = ca.GetStartPos( *object );
-                params.iControllingOwner = ca.GetControllingOwnerId( *object );
-                params.iRestrictions = ca.GetRestrictions( *object );
-                params.iMapAttr = ca.GetMapAttr( *object );
-                params.iChunkType = ca.GetType( *object );
-                ca.GetNameOfOwningProcess( *object, params.iNameOfOwner );
-                //
-                object->Close( NULL );
-                }
+            params.iSize = ca.GetSize( *object );
+            params.iId = ca.GetOwningProcessId( *object );
+            params.iAddressOfOwningProcess = ca.GetAddressOfOwningProcess( *object );
+            params.iMaxSize = ca.GetMaxSize( *object );
+            params.iBottom = ca.GetBottom( *object );
+            params.iTop = ca.GetTop( *object );
+            params.iAttributes = ca.GetAttributes( *object );
+            params.iStartPos = ca.GetStartPos( *object );
+            params.iControllingOwner = ca.GetControllingOwnerId( *object );
+            params.iRestrictions = ca.GetRestrictions( *object );
+            params.iMapAttr = ca.GetMapAttr( *object );
+            params.iChunkType = ca.GetType( *object );
+            ca.GetNameOfOwningProcess( *object, params.iNameOfOwner );
             }
         else if ( params.iType == EMemSpyDriverContainerTypeLibrary )
             {
@@ -416,28 +373,19 @@
 	        Kern::AccessCode();
             //
             DLibrary* object = (DLibrary*) handleAsObject;
-	        NKern::LockSystem();
-            r = object->Open();
-    	    NKern::UnlockSystem();
+            DMemSpyDriverOSAdaptionDCodeSeg& csa = OSAdaption().DCodeSeg();
+            DCodeSeg* codeSeg = csa.GetCodeSeg( *object );
+            params.iAddressOfCodeSeg = (TUint8*)codeSeg;
+            params.iMapCount = csa.GetMapCount( *object );
+            params.iState = csa.GetState( *object );
             //
-            if  ( r == KErrNone )
+            if  ( codeSeg )
                 {
-                DMemSpyDriverOSAdaptionDCodeSeg& csa = OSAdaption().DCodeSeg();
-                DCodeSeg* codeSeg = csa.GetCodeSeg( *object );
-                params.iAddressOfCodeSeg = (TUint8*)codeSeg;
-                params.iMapCount = csa.GetMapCount( *object );
-                params.iState = csa.GetState( *object );
-                //
-                if  ( codeSeg )
-                    {
-                    params.iSize = csa.GetSize( *codeSeg );
-                    }
-                else
-                    {
-                    r = KErrNotFound;
-                    }
-                //
-                object->Close( NULL );
+                params.iSize = csa.GetSize( *codeSeg );
+                }
+            else
+                {
+                r = KErrNotFound;
                 }
             //
 	        Kern::EndAccessCode();
@@ -447,39 +395,21 @@
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - EMemSpyDriverContainerTypeSemaphore" ));
 
             DSemaphore* object = (DSemaphore*) handleAsObject;
-	        NKern::LockSystem();
-            r = object->Open();
-    	    NKern::UnlockSystem();
-            //
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDSemaphore& sa = OSAdaption().DSemaphore();
-                params.iCount = sa.GetCount( *object );
-                params.iResetting = sa.GetResetting( *object );
-                //
-                object->Close( NULL );
-                }
+            DMemSpyDriverOSAdaptionDSemaphore& sa = OSAdaption().DSemaphore();
+            params.iCount = sa.GetCount( *object );
+            params.iResetting = sa.GetResetting( *object );
             }
         else if ( params.iType == EMemSpyDriverContainerTypeMutex )
             {
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - EMemSpyDriverContainerTypeMutex" ));
 
             DMutex* object = (DMutex*) handleAsObject;
-	        NKern::LockSystem();
-            r = object->Open();
-    	    NKern::UnlockSystem();
+            DMemSpyDriverOSAdaptionDMutex& ma = OSAdaption().DMutex();
             //
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDMutex& ma = OSAdaption().DMutex();
-                //
-                params.iCount = ma.GetHoldCount( *object );
-                params.iWaitCount = ma.GetWaitCount( *object );
-                params.iResetting = ma.GetResetting( *object );
-                params.iOrder = ma.GetOrder( *object );
-                //
-                object->Close( NULL );
-                }
+            params.iCount = ma.GetHoldCount( *object );
+            params.iWaitCount = ma.GetWaitCount( *object );
+            params.iResetting = ma.GetResetting( *object );
+            params.iOrder = ma.GetOrder( *object );
             }
         else if ( params.iType == EMemSpyDriverContainerTypeTimer )
             {
@@ -487,98 +417,62 @@
 
             // Get timer properties
             DTimer* object = (DTimer*) handleAsObject;
-	        NKern::LockSystem();
-            r = object->Open();
-    	    NKern::UnlockSystem();
+            DMemSpyDriverOSAdaptionDTimer& ta = OSAdaption().DTimer();
             //
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDTimer& ta = OSAdaption().DTimer();
-                //
-                params.iTimerType = MapToMemSpyTimerType( ta.GetType( *object ) );
-                params.iTimerState = MapToMemSpyTimerState( ta.GetState( *object ) );
-                //
-                object->Close( NULL );
-                }
+            params.iTimerType = MapToMemSpyTimerType( ta.GetType( *object ) );
+            params.iTimerState = MapToMemSpyTimerState( ta.GetState( *object ) );
             }
         else if ( params.iType == EMemSpyDriverContainerTypeServer )
             {
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - EMemSpyDriverContainerTypeServer" ));
 
             DServer* object = (DServer*) handleAsObject;
-	        NKern::LockSystem();
-            r = object->Open();
-    	    NKern::UnlockSystem();
+            DMemSpyDriverOSAdaptionDServer& sa = OSAdaption().DServer();
             //
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDServer& sa = OSAdaption().DServer();
-                //
-                params.iCount = sa.GetSessionCount( *object );
-                params.iId = sa.GetOwningThreadId( *object );
-                params.iSessionType = sa.GetSessionType( *object );
-                params.iAddressOfOwningThread = sa.GetAddressOfOwningThread( *object );
-                sa.GetNameOfOwningThread( *object, params.iNameOfOwner );
-                //
-                object->Close( NULL );
-                }
+            params.iCount = sa.GetSessionCount( *object );
+            params.iId = sa.GetOwningThreadId( *object );
+            params.iSessionType = sa.GetSessionType( *object );
+            params.iAddressOfOwningThread = sa.GetAddressOfOwningThread( *object );
+            sa.GetNameOfOwningThread( *object, params.iNameOfOwner );
             }
         else if ( params.iType == EMemSpyDriverContainerTypeSession )
             {
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - EMemSpyDriverContainerTypeSession" ));
 
             DSession* object = (DSession*) handleAsObject;
-	        NKern::LockSystem();
-            r = object->Open();
-    	    NKern::UnlockSystem();
-            //
-	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - open error: %d", r ));
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDServer& serverAdaption = OSAdaption().DServer();
-                DMemSpyDriverOSAdaptionDSession& sessionAdaption = OSAdaption().DSession();
+            DMemSpyDriverOSAdaptionDServer& serverAdaption = OSAdaption().DServer();
+            DMemSpyDriverOSAdaptionDSession& sessionAdaption = OSAdaption().DSession();
 
-                params.iName.Zero();
+            params.iName.Zero();
 
-                TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - getting session type..." ));
-                params.iSessionType = sessionAdaption.GetSessionType( *object );
-                params.iAddressOfServer = sessionAdaption.GetAddressOfServer( *object );
-                params.iTotalAccessCount = sessionAdaption.GetTotalAccessCount( *object );
-                params.iSvrSessionType = sessionAdaption.GetSessionType( *object );
-                params.iMsgCount = sessionAdaption.GetMsgCount( *object );
-                params.iMsgLimit = sessionAdaption.GetMsgLimit( *object );
-                
-                // Its more useful in this instance, if the name object
-                // points to the server which the session is connected to
-                // (rather than displaying a process-local name).
-                DServer* server = sessionAdaption.GetServer( *object );
-	            TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - getting full name, server: 0x%08x", server ));
-                //
-                if  ( server )
+            TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - getting session type..." ));
+            params.iSessionType = sessionAdaption.GetSessionType( *object );
+            params.iAddressOfServer = sessionAdaption.GetAddressOfServer( *object );
+            params.iTotalAccessCount = sessionAdaption.GetTotalAccessCount( *object );
+            params.iSvrSessionType = sessionAdaption.GetSessionType( *object );
+            params.iMsgCount = sessionAdaption.GetMsgCount( *object );
+            params.iMsgLimit = sessionAdaption.GetMsgLimit( *object );
+            
+            // Its more useful in this instance, if the name object
+            // points to the server which the session is connected to
+            // (rather than displaying a process-local name).
+            DServer* server = (DServer*)CheckedOpen(EMemSpyDriverContainerTypeServer, sessionAdaption.GetServer( *object ));
+	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - getting full name, server: 0x%08x", server ));
+            //
+            if  ( server )
+                {
+                server->FullName( params.iName );
+
+                // Continue as normal for other items
+	            TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - server: 0x%08x, server->iOwningThread: 0x%08x", server, server->iOwningThread ));
+                DThread* owningThread = serverAdaption.GetOwningThread( *server );
+                if  ( owningThread )
                     {
-	                NKern::LockSystem();
-                    r = server->Open();
-     	            NKern::UnlockSystem();
-
-                    if  ( r == KErrNone )
-                        {
-                        server->FullName( params.iName );
- 
-                        // Continue as normal for other items
-	                    TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - server: 0x%08x, server->iOwningThread: 0x%08x", server, server->iOwningThread ));
-                        DThread* owningThread = serverAdaption.GetOwningThread( *server );
-                        if  ( owningThread )
-                            {
-	                        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - getting server thread id..." ));
-                            params.iId = serverAdaption.GetOwningThreadId( *server );
-                            }
-
-                        server->Close( NULL );
-                        }
+	                TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - getting server thread id..." ));
+                    params.iId = serverAdaption.GetOwningThreadId( *server );
                     }
 
-                TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - closing session object..." ));
-                object->Close( NULL );
+                server->Close(NULL);
                 }
             }
         else if ( params.iType == EMemSpyDriverContainerTypeLogicalDevice )
@@ -586,39 +480,21 @@
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - EMemSpyDriverContainerTypeLogicalDevice" ));
 
             DLogicalDevice* object = (DLogicalDevice*) handleAsObject;
-	        NKern::LockSystem();
-            r = object->Open();
-    	    NKern::UnlockSystem();
-            //
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDLogicalDevice& lda = OSAdaption().DLogicalDevice();
-                params.iOpenChannels = lda.GetOpenChannels( *object );
-                params.iVersion = lda.GetVersion( *object );
-                params.iParseMask = lda.GetParseMask( *object );
-                params.iUnitsMask = lda.GetUnitsMask( *object );
-                //
-                object->Close( NULL );
-                }
+            DMemSpyDriverOSAdaptionDLogicalDevice& lda = OSAdaption().DLogicalDevice();
+            params.iOpenChannels = lda.GetOpenChannels( *object );
+            params.iVersion = lda.GetVersion( *object );
+            params.iParseMask = lda.GetParseMask( *object );
+            params.iUnitsMask = lda.GetUnitsMask( *object );
             }
         else if ( params.iType == EMemSpyDriverContainerTypePhysicalDevice )
             {
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - EMemSpyDriverContainerTypePhysicalDevice" ));
 	        
 	        DPhysicalDevice* object = (DPhysicalDevice*) handleAsObject;
-            NKern::LockSystem();
-            r = object->Open();
-            NKern::UnlockSystem();
-            //
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDPhysicalDevice& pda = OSAdaption().DPhysicalDevice();
-                params.iVersion = pda.GetVersion( *object );
-                params.iUnitsMask = pda.GetUnitsMask( *object );
-                params.iAddressOfCodeSeg = pda.GetAddressOfCodeSeg( *object );
-                //
-                object->Close( NULL );
-                }
+            DMemSpyDriverOSAdaptionDPhysicalDevice& pda = OSAdaption().DPhysicalDevice();
+            params.iVersion = pda.GetVersion( *object );
+            params.iUnitsMask = pda.GetUnitsMask( *object );
+            params.iAddressOfCodeSeg = pda.GetAddressOfCodeSeg( *object );
             }
         else if ( params.iType == EMemSpyDriverContainerTypeLogicalChannel )
             {
@@ -629,37 +505,19 @@
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - EMemSpyDriverContainerTypeChangeNotifier" ));
 
 	        DChangeNotifier* object = (DChangeNotifier*) handleAsObject;
-            NKern::LockSystem();
-            r = object->Open();
-            NKern::UnlockSystem();
-            //
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDChangeNotifier& cna = OSAdaption().DChangeNotifier();
-                params.iChanges = cna.GetChanges( *object );
-                params.iAddressOfOwningThread = cna.GetAddressOfOwningThread( *object );
-                cna.GetNameOfOwningThread( *object, params.iNameOfOwner );
-                //
-                object->Close( NULL );
-                }
+            DMemSpyDriverOSAdaptionDChangeNotifier& cna = OSAdaption().DChangeNotifier();
+            params.iChanges = cna.GetChanges( *object );
+            params.iAddressOfOwningThread = cna.GetAddressOfOwningThread( *object );
+            cna.GetNameOfOwningThread( *object, params.iNameOfOwner );
             }
         else if ( params.iType == EMemSpyDriverContainerTypeUndertaker )
             {
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - EMemSpyDriverContainerTypeUndertaker" ));
 	        
             DUndertaker* object = (DUndertaker*) handleAsObject;
-            NKern::LockSystem();
-            r = object->Open();
-            NKern::UnlockSystem();
-            //
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDUndertaker& uta = OSAdaption().DUndertaker();
-                params.iAddressOfOwningThread = uta.GetAddressOfOwningThread( *object );
-                uta.GetNameOfOwningThread( *object, params.iNameOfOwner );
-                //
-                object->Close( NULL );
-                }
+            DMemSpyDriverOSAdaptionDUndertaker& uta = OSAdaption().DUndertaker();
+            params.iAddressOfOwningThread = uta.GetAddressOfOwningThread( *object );
+            uta.GetNameOfOwningThread( *object, params.iNameOfOwner );
             }
         else if ( params.iType == EMemSpyDriverContainerTypeMsgQueue )
             {
@@ -674,26 +532,18 @@
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - EMemSpyDriverContainerTypeCondVar" ));
 	        
             DCondVar* object = (DCondVar*) handleAsObject;
-            NKern::LockSystem();
-            r = object->Open();
-            NKern::UnlockSystem();
-            //
-            if  ( r == KErrNone )
-                {
-                DMemSpyDriverOSAdaptionDCondVar& cva = OSAdaption().DCondVar();
-                params.iResetting = cva.GetResetting( *object );
-                params.iAddressOfOwningThread = cva.GetAddressOfMutex( *object );
-                cva.GetNameOfMutex( *object, params.iNameOfOwner );
-                params.iWaitCount = cva.GetWaitCount( *object );
-                //
-                object->Close( NULL );
-                }
+            DMemSpyDriverOSAdaptionDCondVar& cva = OSAdaption().DCondVar();
+            params.iResetting = cva.GetResetting( *object );
+            params.iAddressOfOwningThread = cva.GetAddressOfMutex( *object );
+            cva.GetNameOfMutex( *object, params.iNameOfOwner );
+            params.iWaitCount = cva.GetWaitCount( *object );
             }
         else
             {
 	        TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetGenericHandleInfo() - KErrNotSupported" ));
             r = KErrNotSupported;
             }
+		handleAsObject->Close(NULL);
         }
     else
         {
@@ -881,13 +731,12 @@
 	NKern::ThreadEnterCS();
 
     // First, locate the specific DObject in question. Cast the handle, but don't use the object...
-    // NB: This claims the system lock
-    DObject* object = CheckIfObjectIsInContainer( EMemSpyDriverContainerTypePropertyRef, aHandle );
+    DObject* object = CheckedOpen(EMemSpyDriverContainerTypePropertyRef, aHandle);
     TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::GetPAndSInfo() - handle search returned: 0x%08x", object ));
 
     if  ( object != NULL )
         {
-        NKern::LockSystem();
+        NKern::LockSystem(); // Keep this, the DPropertyRef APIs use it -TomS
 
         DMemSpyDriverOSAdaptionDPropertyRef& pra = OSAdaption().DPropertyRef();
         const TBool isReady = pra.GetIsReady( *object );
@@ -913,6 +762,7 @@
             }
 
         NKern::UnlockSystem();
+		object->Close(NULL);
         }
 
     NKern::ThreadLeaveCS();
@@ -939,7 +789,7 @@
     NKern::ThreadEnterCS();
     
     DObject* condVarHandle = (DObject*) params.iCondVarHandle;
-    condVarHandle = CheckIfObjectIsInContainer( EMemSpyDriverContainerTypeCondVar, condVarHandle );
+    condVarHandle = CheckedOpen(EMemSpyDriverContainerTypeCondVar, condVarHandle);
     if  ( condVarHandle == NULL )
         {
         Kern::Printf("DMemSpyDriverLogChanMisc::GetCondVarSuspThrs() - END - condVar not found");
@@ -949,9 +799,9 @@
     
     ResetTempHandles();
         
-    DCondVar* condVar = (DCondVar*) params.iCondVarHandle;;
+    DCondVar* condVar = (DCondVar*) condVarHandle;
     
-    NKern::LockSystem();
+    NKern::LockSystem(); // Keep this, needed for iterating suspended queue -TomS
 
     // Iterate through suspended threads, writing back thread pointer (handle)
     // to client
@@ -1003,6 +853,7 @@
             }
         }
 
+	condVarHandle->Close(NULL);
     NKern::ThreadLeaveCS();
 
     TRACE( Kern::Printf("DMemSpyDriverLogChanMisc::GetCondVarSuspThrs() - END - r: %d", r));
@@ -1026,7 +877,7 @@
     NKern::ThreadEnterCS();
 
     DObject* threadHandle = (DObject*) aThreadHandle;
-    threadHandle = CheckIfObjectIsInContainer( EMemSpyDriverContainerTypeThread, threadHandle );
+    threadHandle = CheckedOpen(EMemSpyDriverContainerTypeThread, threadHandle);
     if  ( threadHandle == NULL )
         {
         Kern::Printf("DMemSpyDriverLogChanMisc::GetCondVarSuspThrInfo() - END - thread not found");
@@ -1043,6 +894,7 @@
         r = Kern::ThreadRawWrite( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverCondVarSuspendedThreadInfo) );
         }
     
+	threadHandle->Close(NULL);
     NKern::ThreadLeaveCS();
     
     TRACE( Kern::Printf("DMemSpyDriverLogChanMisc::GetCondVarSuspThrInfo() - END - r: %d", r));
@@ -1106,17 +958,13 @@
 
         if  ( handles != NULL )
             {
-            MemSpyObjectIx_Wait( handles );
-            //
-            TInt searchResult = handles->At( aHandleToLookFor );
-	        if  ( searchResult != KErrNotFound )
+            TBool found = handles->Find( aHandleToLookFor );
+	        if (found)
 		        {
                 TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::SearchThreadsFor - found handle match in [%O]", thread ));
                 aStream.WriteUint32( (TUint32) thread );
                 ++matches;
 		        }
-            //
-            MemSpyObjectIx_Signal( handles );
             }
         }
 
@@ -1151,17 +999,13 @@
 
         if  ( handles != NULL )
             {
-            MemSpyObjectIx_Wait( handles );
-            //
-            TInt searchResult = handles->At( aHandleToLookFor );
-	        if  ( searchResult != KErrNotFound )
+            TBool found = handles->Find( aHandleToLookFor );
+	        if  ( found )
 		        {
                 TRACE( Kern::Printf("DMemSpyDriverLogChanContainers::SearchProcessFor - found handle match in [%O]", process ));
                 aStream.WriteUint32( (TUint32) process );
                 ++matches;
 		        }
-            //
-            MemSpyObjectIx_Signal( handles );
             }
         }
 
--- a/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapBase.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapBase.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -47,11 +47,6 @@
 
 DMemSpyDriverLogChanHeapBase::~DMemSpyDriverLogChanHeapBase()
 	{
-	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::~DMemSpyDriverLogChanHeapBase() - START - this: 0x%08x", this ));
-
-    ReleaseFreeCells();
-
-	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::~DMemSpyDriverLogChanHeapBase() - END - this: 0x%08x", this ));
 	}
 
 
@@ -173,207 +168,15 @@
 
 
 
-TInt DMemSpyDriverLogChanHeapBase::OpenUserHeap( DThread& aClientThread, TUint aExpectedHeapVTable, RMemSpyDriverRHeapUser& aHeap, DChunk*& aUserHeapChunk, TDes8* aClientHeapChunkName )
-    {
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap() - START - aHeap.ChunkIsInitialised: %d, aExpectedHeapVTable: 0x%08x, aClientThread: %O", aHeap.ChunkIsInitialised(), aExpectedHeapVTable, &aClientThread ));
-    __ASSERT_ALWAYS( aHeap.ChunkIsInitialised() == EFalse, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapChunkAlreadyCloned ) );
-
-    TInt r = KErrNotFound;
-    aUserHeapChunk = NULL;
-    
-    NKern::ThreadEnterCS();
-
-    const TBool allocatorIsReallyRHeap = GetUserHeapHandle( aClientThread, aHeap, aExpectedHeapVTable );
-	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - allocatorIsReallyRHeap: %d", allocatorIsReallyRHeap));
-
-    if  ( allocatorIsReallyRHeap )
-        {
-        RAllocator* allocator = OSAdaption().DThread().GetAllocator( aClientThread );
-
-        // Open client's heap chunk in order to read it's dimensions
-        const TInt clientsHeapChunkHandle = aHeap.iChunkHandle;
-	    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - clientsHeapChunkHandle: 0x%08x, allocatorAddress: 0x%08x", clientsHeapChunkHandle, allocator));
-
- 	    NKern::LockSystem();
-        DChunk* clientsHeapChunk = (DChunk*) Kern::ObjectFromHandle( &aClientThread, clientsHeapChunkHandle, EChunk );
-        NKern::UnlockSystem();
-	    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - clientsHeapChunk: 0x%08x", clientsHeapChunk ));
-       
-        if  ( clientsHeapChunk != NULL )
-            {
-            // Get the chunk name (if the caller asked for it)
-            if  ( aClientHeapChunkName )
-                {
-                clientsHeapChunk->FullName( *aClientHeapChunkName );
-                }
-                
-            // Update the heap chunk pointer. We do this now because this
-            // should point to the _real_ user-side heap chunk, rather than
-            // the copy of the chunk that we are about to make.
-            aUserHeapChunk = clientsHeapChunk;
-
-            // Set up ourselves to duplicate their heap chunk
-            const TInt clientsHeapChunkSize = OSAdaption().DChunk().GetSize( *clientsHeapChunk );
-	        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - chunkBase: 0x%08x, size: %8d, maxLen: %8d, chunk: %O", clientsHeapChunk->iBase, clientsHeapChunkSize, clientsHeapChunk->iMaxSize, clientsHeapChunk ));
-
-            // Make a new chunk that is the same size, owned by this thread.
-            TChunkCreateInfo info;
-            info.iType         = TChunkCreateInfo::ESharedKernelSingle;
-            info.iMaxSize      = clientsHeapChunkSize;
-            info.iOwnsMemory   = ETrue; // Use memory from system's free pool
-            info.iDestroyedDfc = NULL;
-        #ifdef __EPOC32__
-            info.iMapAttr      = (TInt)EMapAttrFullyBlocking; // Full caching
-        #endif
-
-            // Holds a copy of the client's heap chunk
-            DChunk* heapCopyChunk;
-            TLinAddr heapCopyChunkAddress;
-            TUint32 heapCopyChunkMappingAttributes;
-            r = Kern::ChunkCreate( info, heapCopyChunk, heapCopyChunkAddress, heapCopyChunkMappingAttributes );
-	        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - creating chunk returned: %d", r));
-            //
-            if  ( r == KErrNone )
-                {
-	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - copy chunk base: 0x%08x, heapCopyChunkAddress: 0x%08x", heapCopyChunk->iBase, heapCopyChunkAddress));
-                
-                // Commit memory for entire buffer
-                TUint32 physicalAddress = 0;
-                r = Kern::ChunkCommitContiguous( heapCopyChunk, 0, clientsHeapChunkSize, physicalAddress );
-	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - commiting chunk returned: %d", r));
-
-                if  ( r != KErrNone)
-                    {
-                    // On error, thow away the chunk we have created
-                    Kern::ChunkClose( heapCopyChunk );
-                    heapCopyChunk = NULL;
-                    }
-                else
-                    {
-    	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - heapCopyChunk->iSize: 0x%08x, heapCopyChunk->iBase: 0x%08x, heapCopyChunkAddress: 0x%08x, physicalAddress: 0x%08x", heapCopyChunk->iSize, heapCopyChunk->iBase, heapCopyChunkAddress, physicalAddress));
-    
-                    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - trying to copy %d bytes from clients allocator address of 0x%08x", clientsHeapChunkSize, allocator ));
-                    r = Kern::ThreadRawRead( &aClientThread, allocator, (TAny*) heapCopyChunkAddress, clientsHeapChunkSize );
-
-                    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - read result of clients heap data is: %d", r));
-                    if  ( r == KErrNone )
-                        {
-                        // Transfer ownership of the copy heap chunk to the heap object. This also calculates the delta
-                        // beween the heap addresses in the client's address space and the kernel address space.
-                        aHeap.AssociateWithKernelChunk( heapCopyChunk, heapCopyChunkAddress, heapCopyChunkMappingAttributes );
-                        }
-                    }
-                }
-            }
-        else
-            {
-	        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - could not open clients heap chunk by its handle" ) );
-            r = KErrNotFound;
-            }
-        }
-    else
-        {
-	    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - clients heap is not an RHeap (allocated vTable mismatch)" ) );
-        r = KErrNotSupported;
-        }
-
-    NKern::ThreadLeaveCS();
-
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenUserHeap - r: %d", r ));
-    return r;
-    }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-TBool DMemSpyDriverLogChanHeapBase::GetUserHeapHandle( DThread& aThread, RMemSpyDriverRHeapUser& aHeap, TUint aExpectedVTable )
-    {
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetUserHeapHandle() - START - aExpectedVTable: 0x%08x", aExpectedVTable) );
-
-    RAllocator* allocator = OSAdaption().DThread().GetAllocator( aThread );
-	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - allocator addr: 0x%08x", allocator) );
-    TUint* pAllocator = (TUint*) allocator;
-    // 
-    TBool vTableOkay = EFalse;
-    TUint vtable = 0;
-
-    // Read a bit more data than is available for debugging purposes
-    TBuf8<32> vtableBuf;
-    TInt r = Kern::ThreadRawRead( &aThread, pAllocator, (TUint8*) vtableBuf.Ptr(), vtableBuf.MaxLength() );
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - read result of vtable data from requested thread is: %d", r));
-    if  ( r == KErrNone )
-        {
-        TRACE( MemSpyDriverUtils::DataDump("allocator vtable data - %lS", vtableBuf.Ptr(), vtableBuf.MaxLength(), vtableBuf.MaxLength() ) );
-        vtableBuf.SetLength( vtableBuf.MaxLength() );
-        
-        vtable = vtableBuf[0] +
-                (vtableBuf[1] << 8) + 
-                (vtableBuf[2] << 16) + 
-                (vtableBuf[3] << 24);
-        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - client VTable is: 0x%08x", vtable) );
-
-        // Check the v-table to work out if it really is an RHeap
-        vTableOkay = ( vtable == aExpectedVTable );
-        if  ( vTableOkay )
-            {
-            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - vtables okay") );
-            r = aHeap.ReadFromUserAllocator( aThread );
-            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - after userget, error: %d", r));
-        
-            }
-        else
-            {
-            TRACE( Kern::Printf( "DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - vtables dont match! - aExpectedVTable: 0x%08x, allocator addr: 0x%08x, client VTable is: 0x%08x, aThread: %O", aExpectedVTable, allocator, vtable, &aThread ) );
-            }
-        }
-    else
-        {
-        TRACE( Kern::Printf( "DMemSpyDriverLogChanHeapBase::GetUserHeapHandle - error during client vTable reading: %d, aThread: %O", r, &aThread ) );
-        }
-    //
-    return (vTableOkay && (r == KErrNone));
-    }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 void DMemSpyDriverLogChanHeapBase::PrintHeapInfo( const TMemSpyHeapInfo& aInfo )
     {
     const TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
-    const TMemSpyHeapObjectDataRHeap& rHeapObjectData = rHeapInfo.ObjectData();
+    //const TMemSpyHeapObjectDataRHeap& rHeapObjectData = rHeapInfo.ObjectData();
     const TMemSpyHeapStatisticsRHeap& rHeapStats = rHeapInfo.Statistics();
     const TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
 
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
+    /*
+	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RAllocator                                      -" ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RAllocator::iAccessCount:       %d", rHeapObjectData.iAccessCount ) );
@@ -408,7 +211,7 @@
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iRand:                   %d", rHeapObjectData.iRand ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - RHeap::iTestData:               0x%08x", rHeapObjectData.iTestData ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - " ) );
-
+	*/
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - Stats (Free)                                    -" ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
@@ -431,12 +234,6 @@
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - " ) );
 
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - Stats (Common)                                  -" ) );
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - total cell count:               %d", rHeapStats.StatsCommon().TotalCellCount() ) );
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - " ) );
-
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - Misc. Info                                      -" ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() ---------------------------------------------------" ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - chunk size:                     %d", rHeapMetaData.ChunkSize() ) );
@@ -445,73 +242,15 @@
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - debug allocator:                %d", rHeapMetaData.IsDebugAllocator() ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - shared heap:                    %d", rHeapMetaData.IsSharedHeap() ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - user thread:                    %d", rHeapMetaData.IsUserThread() ) );
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell header size (free):        %d", rHeapMetaData.HeaderSizeFree() ) );
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell header size (alloc):       %d", rHeapMetaData.HeaderSizeAllocated() ) );
+    //TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell header size (free):        %d", rHeapMetaData.HeaderSizeFree() ) );
+    //TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - cell header size (alloc):       %d", rHeapMetaData.HeaderSizeAllocated() ) );
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - heap vTable:                    0x%08x", rHeapMetaData.VTable() ) );
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - heap object size:               %d", rHeapMetaData.ClassSize() ) );
+    //TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - heap object size:               %d", rHeapMetaData.ClassSize() ) );
+    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - heap size:                      %d", rHeapMetaData.iHeapSize ) );
+    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrintHeapInfo() - allocator address:              0x%08x", rHeapMetaData.iAllocatorAddress ) );
     }
 
-
-
-
-
-
-
-
-
-
-TBool DMemSpyDriverLogChanHeapBase::IsDebugKernel()
-    {
-    TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - START") );
-    
-    TInt r = KErrNone;
-    TBool debugKernel = EFalse;
-
-    NKern::ThreadEnterCS();
-    RMemSpyDriverRHeapKernelInPlace rHeap;
-    r = OpenKernelHeap( rHeap );
-    TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - open kernel heap returned: %d", r) );
-
-    if  ( r == KErrNone )
-        {
-        debugKernel = IsDebugKernel( rHeap );
-
-        // Tidy up
-        rHeap.DisassociateWithKernelChunk();
-        }
-
-    TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - debugKernel: %d", debugKernel) );
-    NKern::ThreadLeaveCS();
-
- 	TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - END - ret: %d", r) );
-    return debugKernel;
-    }
-
-
-TBool DMemSpyDriverLogChanHeapBase::IsDebugKernel( RMemSpyDriverRHeapKernelInPlace& aHeap )
-    {
-    TBool debugKernel = EFalse;
-    //
- 	TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - START") );
-    NKern::ThreadEnterCS();
-
-    // Request that the kernel fail the next heap allocation
-    aHeap.FailNext();
-
-    // Allocate a new cell, and in debug builds of the kernel, this should be NULL
-    TInt* cell = new TInt();
-    TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - cell: 0x%08x", cell) );
-    debugKernel = ( cell == NULL );
-    delete cell;
-
-    NKern::ThreadLeaveCS();
- 	TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::IsDebugKernel() - END - debugKernel: %d", debugKernel) );
-    //
-    return debugKernel;
-    }
-
-
-TInt DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel( RMemSpyDriverRHeapBase& aHeap, TBool aIsDebugAllocator, const TDesC8& aChunkName, TMemSpyHeapInfo* aHeapInfo, TDes8* aTransferBuffer )
+TInt DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel(RMemSpyDriverRHeapBase& aHeap, TMemSpyHeapInfo* aHeapInfo, TDes8* aTransferBuffer )
     {
     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel() - START - aTransferBuffer: 0x%08x", aTransferBuffer ) );
 
@@ -520,16 +259,13 @@
 
     // This object holds all of the info we will accumulate for the client.
     TMemSpyHeapInfo masterHeapInfo;
-    masterHeapInfo.SetType( TMemSpyHeapInfo::ETypeRHeap );
+    masterHeapInfo.SetType(aHeap.GetTypeFromHelper());
     masterHeapInfo.SetTid( 2 );
     masterHeapInfo.SetPid( 1 );
 
     // This is the RHeap-specific object that contains all RHeap info
     TMemSpyHeapInfoRHeap& rHeapInfo = masterHeapInfo.AsRHeap();
 
-    // This is the object data for the RHeap instance
-    TMemSpyHeapObjectDataRHeap& rHeapObjectData = rHeapInfo.ObjectData();
-    aHeap.CopyObjectDataTo( rHeapObjectData );
 
     // When walking the kernel heap we must keep track of the free cells
     // without allocating any more memory (on the kernel heap...)
@@ -544,7 +280,7 @@
 
     // We must walk the client's heap in order to build statistics
     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel - calling heap walker constructor..."));
-    RMemSpyDriverHeapWalker heapWalker( aHeap, aIsDebugAllocator );
+    RMemSpyDriverHeapWalker heapWalker(aHeap);
     if  ( aTransferBuffer )
         {
         // This will allow us to identify that we're writing directly to the stream
@@ -596,18 +332,19 @@
 
     // Get remaining meta data that isn't stored elsewhere
     TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
-    rHeapMetaData.SetChunkName( aChunkName );
+	TFullName chunkName;
+	aHeap.Chunk().FullName(chunkName);
+    rHeapMetaData.SetChunkName(chunkName);
     rHeapMetaData.SetChunkSize( (TUint) aHeap.Chunk().Size() );
     rHeapMetaData.SetChunkHandle( &aHeap.Chunk() );
-    rHeapMetaData.SetChunkBaseAddress( aHeap.Chunk().Base() );
-    rHeapMetaData.SetDebugAllocator( aIsDebugAllocator );
-    rHeapMetaData.SetHeaderSizeFree( RMemSpyDriverRHeapBase::FreeCellHeaderSize() );
-    rHeapMetaData.SetHeaderSizeAllocated( RMemSpyDriverRHeapBase::AllocatedCellHeaderSize( aIsDebugAllocator ) );
+    rHeapMetaData.SetChunkBaseAddress( OSAdaption().DChunk().GetBase(aHeap.Chunk()) );
+    rHeapMetaData.SetDebugAllocator(aHeap.Helper()->AllocatorIsUdeb());
     rHeapMetaData.SetUserThread( EFalse );
     rHeapMetaData.SetSharedHeap( ETrue );
-
-    // Get any heap-specific info
-    aHeap.GetHeapSpecificInfo( masterHeapInfo );
+	rHeapMetaData.iHeapSize = aHeap.Helper()->CommittedSize();
+	rHeapMetaData.iAllocatorAddress = (TAny*)aHeap.Helper()->AllocatorAddress();
+	rHeapMetaData.iMinHeapSize = aHeap.Helper()->MinCommittedSize();
+	rHeapMetaData.iMaxHeapSize = aHeap.Helper()->MaxCommittedSize();
 
     PrintHeapInfo( masterHeapInfo );
 
@@ -641,17 +378,12 @@
 
 
 
-TBool DMemSpyDriverLogChanHeapBase::HandleHeapCell( TInt aCellType, TAny* aCellAddress, TInt aLength, TInt /*aNestingLevel*/, TInt /*aAllocNumber*/ )
+TBool DMemSpyDriverLogChanHeapBase::HandleHeapCell(TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt /*aNestingLevel*/, TInt /*aAllocNumber*/)
     {
     TInt error = KErrNone;
     //
-    if  ( aCellType == EMemSpyDriverGoodFreeCell || aCellType == EMemSpyDriverBadFreeCellAddress || aCellType == EMemSpyDriverBadFreeCellSize )
+    if  (aCellType & EMemSpyDriverFreeCellMask)
         {
-        TMemSpyDriverFreeCell cell;
-        cell.iType = aCellType;
-        cell.iAddress = aCellAddress;
-        cell.iLength = aLength;
-        //
         if  ( iStackStream )
             {
             if  ( !iStackStream->IsFull() )
@@ -669,163 +401,16 @@
                 error = KErrAbort;
                 }
             }
-        else
-            {
-            NKern::ThreadEnterCS();
-            error = iFreeCells.Append( cell );
-            NKern::ThreadLeaveCS();
-            //
-            if ( error == KErrNone )
-                {
-                ++iFreeCellCount;
-                }
-            }
-        }
+       }
     //
     return ( error == KErrNone );
     }
 
 
 void DMemSpyDriverLogChanHeapBase::HandleHeapWalkInit()
-    {
-    // Can't delete the free cell list here as we might be walking the kernel heap
-    iFreeCellCount = 0;
-    }
-
-
-
-
-
-
-TInt DMemSpyDriverLogChanHeapBase::PrepareFreeCellTransferBuffer()
-    {
-    // Transfer free cells immediately from xfer stream
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrepareFreeCellTransferBuffer() - START - iHeapStream: 0x%08x", iHeapStream ));
-    __ASSERT_ALWAYS( !iHeapStream, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapFreeCellStreamNotClosed ) );
-    //
-    TInt r = KErrNoMemory;
-    //
-    NKern::ThreadEnterCS();
-    //
-    iHeapStream = new RMemSpyMemStreamWriter();
-    if  ( iHeapStream )
-        {
-        const TInt requiredMemory = CalculateFreeCellBufferSize();
-        r = OpenXferStream( *iHeapStream, requiredMemory );
-        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrepareFreeCellTransferBuffer() - requested %d bytes for free cell list, r: %d", requiredMemory, r ));
-
-        if  ( r == KErrNone )
-            {
-            const TInt count = iFreeCells.Count();
-            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrepareFreeCellTransferBuffer() - free cell count: %d", count ));
-            //
-            iHeapStream->WriteInt32( count );
-            for( TInt i=0; i<count; i++ )
-                {
-                const TMemSpyDriverFreeCell& cell = iFreeCells[ i ];
-                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrepareFreeCellTransferBuffer() - storing entry: %d", i ));
-                //
-                iHeapStream->WriteInt32( cell.iType );
-                iHeapStream->WriteUint32( reinterpret_cast<TUint32>( cell.iAddress ) );
-                iHeapStream->WriteInt32( cell.iLength );
-                }
-
-            // Finished with the array now
-            iFreeCells.Reset();
-
-            // We return the amount of client-side memory that needs to be allocated to hold the buffer
-            r = requiredMemory;
-            }
-        }
-    //
-    NKern::ThreadLeaveCS();
-               
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::PrepareFreeCellTransferBuffer() - END - r: %d", r));
-	return r;
-    }
-
-
-TInt DMemSpyDriverLogChanHeapBase::FetchFreeCells( TDes8* aBufferSink )
-    {
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::FetchFreeCells() - START - iHeapStream: 0x%08x", iHeapStream ));
-    __ASSERT_ALWAYS( iHeapStream, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapFreeCellStreamNotOpen ) );
-
-    TInt r = KErrNone;
-
-    // Write buffer to client
-    NKern::ThreadEnterCS();
-    r = iHeapStream->WriteAndClose( aBufferSink );
-
-    // Tidy up
-    ReleaseFreeCells();
-
-    NKern::ThreadLeaveCS();
-    //
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::FetchFreeCells() - END - r: %d", r));
-	return r;
-    }
-
-
-
-TInt DMemSpyDriverLogChanHeapBase::CalculateFreeCellBufferSize() const
-    {
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::CalculateFreeCellBufferSize() - START" ));
-
-    const TInt count = iFreeCells.Count();
-    const TInt entrySize = sizeof( TInt32 ) + sizeof( TInt32 ) + sizeof( TUint32 );
-    const TInt r = ( count * entrySize ) + sizeof( TInt ); // Extra TInt to hold count
-                
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::CalculateFreeCellBufferSize() - END - r: %d, count: %d, entrySize: %d", r, count, entrySize ));
-	return r;
-    }
-
-
-
-void DMemSpyDriverLogChanHeapBase::ReleaseFreeCells()
-    {
-	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::ReleaseFreeCells() - START - this: 0x%08x", this ));
-
-    // Housekeeping
-    NKern::ThreadEnterCS();
-    iFreeCells.Reset();
-    //
-    iStackStream = NULL;
-    //
-    delete iHeapStream;
-    iHeapStream = NULL;
-    NKern::ThreadLeaveCS();
-
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapBase::ReleaseFreeCells() - END - this: 0x%08x", this ));
-    }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+	{
+	iFreeCellCount = 0;
+	}
 
 TInt DMemSpyDriverLogChanHeapBase::OpenKernelHeap( RHeapK*& aHeap, DChunk*& aChunk, TDes8* aClientHeapChunkName )
     {
@@ -905,7 +490,7 @@
         // Finalise construction of heap 
         if  ( kernelHeap != NULL )
             {
-            TRACE_KH( Kern::Printf( "DMemSpyDriverLogChanHeapBase::OpenKernelHeap - kernelHeap->Base(): 0x%08x, kernelHeapChunk->Base(): 0x%08x", kernelHeap->Base(), kernelHeapChunk->Base() ) );
+            TRACE_KH( Kern::Printf( "DMemSpyDriverLogChanHeapBase::OpenKernelHeap - kernelHeapChunk->Base(): 0x%08x", kernelHeapChunk->Base() ) );
             aHeap = kernelHeap;
             aChunk = kernelHeapChunk;
 
@@ -935,27 +520,6 @@
     return r;
     }
 
-
-TInt DMemSpyDriverLogChanHeapBase::OpenKernelHeap( RMemSpyDriverRHeapKernelInPlace& aHeap, TDes8* aClientHeapChunkName )
-    {
-    TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(IP) - START") );
-
-    RHeapK* heap = NULL;
-    DChunk* chunk = NULL;
-    TInt r = OpenKernelHeap( heap, chunk, aClientHeapChunkName );
-	
-    TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(IP) - open err: %d", r ) );
-    if  ( r == KErrNone )
-        {
-        aHeap.SetKernelHeap( *heap );
-        aHeap.AssociateWithKernelChunk( chunk, TLinAddr( chunk->iBase ), 0 );
-        }
-
-	TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(IP) - END - ret: %d", r ) );
-    return r;
-    }
-
-
 TInt DMemSpyDriverLogChanHeapBase::OpenKernelHeap( RMemSpyDriverRHeapKernelFromCopy& aHeap, TDes8* aClientHeapChunkName )
     {
     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(CP) - START") );
@@ -1017,7 +581,7 @@
                 NKern::LockSystem();
                 const TUint32 copyLength = heapSize; // TODO Min( heap->Size(), heapSize );
 
-                TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(CP) - trying to copy %d (vs orig estimate of %d) bytes from kernel allocator address: 0x%08x", copyLength, heapSize, heap->Base() ));
+                TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapBase::OpenKernelHeap(CP) - trying to copy %d (vs orig estimate of %d) bytes from kernel allocator address: 0x%08x", copyLength, heapSize, heap));
                 memcpy( (TUint8*) heapCopyChunkAddress, heap, copyLength );
 
                 NKern::UnlockSystem();
--- a/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapData.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapData.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -162,24 +162,20 @@
     //
     // The driver leaves kernel context with the copy of the kernel heap still associated with MemSpy's process.
     // The second driver call will copy the chunk data to user side and release the kernel side chunk.
-    const TBool isInit = iKernelHeap.ChunkIsInitialised();
-    TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataKernelInit() - START - isInit: %d", isInit ));
-    __ASSERT_ALWAYS( !isInit, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicKernelHeapDataInitError ) );
+    //const TBool isInit = iKernelHeap.ChunkIsInitialised();
+    //TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataKernelInit() - START - isInit: %d", isInit ));
+    //__ASSERT_ALWAYS( !isInit, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicKernelHeapDataInitError ) );
 
     iKernelHeap.Reset();
     NKern::ThreadEnterCS();
 
-    // We must identify if we have a debug kernel allocator
-    const TBool debugAllocator = IsDebugKernel();
-    TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataKernelInit() - debugAllocator: %d", debugAllocator ) );
-
     TFullName heapChunkName;
     TInt r = OpenKernelHeap( iKernelHeap, &heapChunkName );
     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataKernelInit() - open err: %d", r));
 
     if  ( r == KErrNone )
         {
-        r = GetHeapInfoKernel( iKernelHeap, debugAllocator, heapChunkName, aInfo, aFreeCells );
+        r = GetHeapInfoKernel( iKernelHeap, aInfo, aFreeCells );
         TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - base class get heap info: %d", r) );
 
         // If everything was okay, we can now return back to user-side, indicating the amount of heap data
@@ -190,10 +186,10 @@
             r = OSAdaption().DChunk().GetSize( iKernelHeap.Chunk() );
             TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - user side buffer needs to be: %d", r) );
             }
-        else if ( iKernelHeap.ChunkIsInitialised() )
+        else
             {
             // Error scenario - must close heap
-            iKernelHeap.DisassociateWithKernelChunk();
+            iKernelHeap.Close();
             }
         }
 
@@ -206,12 +202,15 @@
 
 TInt DMemSpyDriverLogChanHeapData::GetHeapDataKernelFetch( TDes8* aSink )
     {
+	//TOMSCI TODO this function is fundamentally flawed
+	return KErrNotSupported;
+	/*
     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataKernelFetch() - START"));
 
     NKern::ThreadEnterCS();
 
     // We should already have an initialised copy of the kernel heap
-    const TBool isInit = iKernelHeap.ChunkIsInitialised();
+    const TBool isInit = iKernelHeap.Helper() != NULL;
     TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataKernelFetch() - isInit: %d", isInit ));
     __ASSERT_ALWAYS( isInit, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicKernelHeapDataFetchError ) );
 
@@ -261,6 +260,7 @@
 
 	TRACE_KH( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataKernelFetch() - END - ret: %d", r));
     return r;
+	*/
     }
 
 
@@ -279,7 +279,7 @@
 
 
 
-
+const TInt KPageSize = 4096;
 
 TInt DMemSpyDriverLogChanHeapData::GetHeapDataUser( TMemSpyDriverInternalHeapDataParams& aParams )
     {
@@ -304,135 +304,110 @@
 		    return KErrAccessDenied;
             }
         }
-    
+
     // Check that the process' thread's are suspended
     DThread* thread = (DThread*) TempObject();
     if  ( SuspensionManager().IsSuspended( *thread ) )
         {
-        // Find the chunk with the correct handle
+        // Open the heap
 	    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - thread: %O", thread) );
         RMemSpyDriverRHeapUser heap( OSAdaption() );
-        const TBool allocatorIsReallyRHeap = GetUserHeapHandle( *thread, heap, aParams.iRHeapVTable );
-        if  ( allocatorIsReallyRHeap )
+		r = heap.OpenUserHeap(*thread, aParams.iDebugAllocator);
+		TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - opening heap returned: %d", r) );
+        if  (r == KErrNone)
             {
-            const TInt chunkHandle = heap.iChunkHandle;
-	        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - chunkHandle: 0x%08x, thread: %O", chunkHandle, thread) );
-
-  	        NKern::ThreadEnterCS();
- 	        NKern::LockSystem();
-            DChunk* chunk = (DChunk*) Kern::ObjectFromHandle( thread, chunkHandle, EChunk );
-            NKern::UnlockSystem();
-	        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - chunk: 0x%08x", chunk ) );
-  	        NKern::ThreadLeaveCS();
-
-            if  ( chunk != NULL )
+            if  ( aParams.iChecksum != 0 )
                 {
-                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - chunkBase: 0x%08x, size: %8d, maxLen: %8d, chunk: %O", chunk->iBase, chunk->iSize, chunk->iMaxSize, chunk) );
-
-                // If the client specified a checksum value, then we must walk the heap just to make sure
-                // it hasn't changed. Expensive operation, but good for paranoia purposes...
-                if  ( aParams.iChecksum != 0 )
-                    {
-                    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - checksum validation requested - expecting: 0x%08x", aParams.iChecksum ) );
+                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - checksum validation requested - expecting: 0x%08x", aParams.iChecksum ) );
+                RMemSpyDriverHeapWalker heapWalker(heap);
+                
+                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - starting traversal..." ));
+#if ( defined( TRACE_TYPE_USERHEAP ) && defined( TRACE_TYPE_HEAPWALK ) )
+                heapWalker.SetPrintDebug();
+#endif
+                r = heapWalker.Traverse();
+                const TUint32 calculatedChecksum = heapWalker.Stats().iFreeCellCRC;
+                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - finished traversal - err: %d, checksum: 0x%08x", r, calculatedChecksum ));
 
-                    RMemSpyDriverRHeapUser rHeap( OSAdaption() );
-                    DChunk* userHeapChunk = NULL;
-                    r = OpenUserHeap( *thread, aParams.iRHeapVTable, rHeap, userHeapChunk );
-                    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - opening client heap returned: %d", r) );
-                    if  ( r == KErrNone )
-                        {
-                        TMemSpyHeapWalkerNullObserver observer; 
-                        RMemSpyDriverHeapWalker heapWalker( rHeap, aParams.iDebugAllocator );
-                        heapWalker.SetObserver( &observer );
-                        
-                        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - starting traversal..." ));
-#if ( defined( TRACE_TYPE_USERHEAP ) && defined( TRACE_TYPE_HEAPWALK ) )
-                        heapWalker.SetPrintDebug();
-#endif
-                        r = heapWalker.Traverse();
-                        const TUint32 calculatedChecksum = heapWalker.Stats().iFreeCellCRC;
-                        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - finished traversal - err: %d, checksum: 0x%08x", r, calculatedChecksum ));
+                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - comparing CALCULATED: 0x%08x vs EXPECTED: 0x%08x", calculatedChecksum, aParams.iChecksum ));
+                if  ( calculatedChecksum != aParams.iChecksum )
+                    {
+                    Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - comparing CALCULATED: 0x%08x vs EXPECTED: 0x%08x for thread %O", calculatedChecksum, aParams.iChecksum, thread );
+                    r = KErrCorrupt;
+                    }
+                }
 
-                        // Release resources
-                        rHeap.DisassociateWithKernelChunk();
+            // Get user side (MemSpy) descriptor length info
+            if  ( r == KErrNone )
+                {
+                TInt destLen = 0;
+                TInt destMax = 0;
+                TUint8* destPtr = NULL;
+                r = Kern::ThreadGetDesInfo( &ClientThread(), aParams.iDes, destLen, destMax, destPtr, ETrue );
+                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - user side descriptor: 0x%08x (0x%08x), len: %8d, maxLen: %8d, r: %d", aParams.iDes, destPtr, destLen, destMax, r ));
+				destMax = destMax & ~(KPageSize-1); // Round down dest max to page size
+				if (destMax <= 0 || (aParams.iReadAddress & (KPageSize-1))) r = KErrArgument; // If destMax is less than a page or the read address isn't a multiple of page size then we don't want to know
 
-                        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - comparing CALCULATED: 0x%08x vs EXPECTED: 0x%08x", calculatedChecksum, aParams.iChecksum ));
-                        if  ( calculatedChecksum != aParams.iChecksum )
-                            {
-                            Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - comparing CALCULATED: 0x%08x vs EXPECTED: 0x%08x for thread %O", calculatedChecksum, aParams.iChecksum, thread );
-                            r = KErrCorrupt;
-                            }
-                        }
-                    else
-                        {
-                        // Couldn't verify checksum in this situation...
-                        }
-                    }
-
-                // Get user side (MemSpy) descriptor length info
                 if  ( r == KErrNone )
                     {
-                    TInt destLen;
-                    TInt destMax;
-                    TUint8* destPtr = NULL;
-                    r = Kern::ThreadGetDesInfo( &ClientThread(), aParams.iDes, destLen, destMax, destPtr, ETrue );
-                    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - user side descriptor: 0x%08x (0x%08x), len: %8d, maxLen: %8d, r: %d", aParams.iDes, destPtr, destLen, destMax, r ));
-
-                    if  ( r == KErrNone )
+					const TLinAddr chunkBase = (TLinAddr)OSAdaption().DChunk().GetBase(heap.Chunk());
+					const TLinAddr chunkMaxAddr = chunkBase + OSAdaption().DChunk().GetMaxSize(heap.Chunk());
+        	        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - chunkBase:    0x%08x", chunkBase) );
+        
+					TLinAddr readAddress = aParams.iReadAddress;
+                    if (aParams.iRemaining < 0 )
                         {
-                        // Calculate start of real heap data (skipping over embedded RHeap object)
-                        const TUint8* startOfHeapOffset = heap.iBase;
-        	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - startOfHeapOffset:    0x%08x", startOfHeapOffset) );
-            
-                        // Deal with initial case
-                        const TUint heapSize = heap.Size();
-        	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - heapSize:               %8d", heapSize) );
-                        if  ( aParams.iRemaining < 0 )
-                            {
-                            // Initial case, remaining initialised to -1
-                            aParams.iRemaining = heapSize;
-                            }
+                        // Initial case, start from the bottom
+                        readAddress = chunkBase;
+						aParams.iRemaining = heap.Helper()->CommittedSize();
+                        }
+
+                    // The remaining number of bytes should allow us to calculate the position
+                    // to read from.
+                    TInt amountToRead = Min( aParams.iRemaining, destMax );
+        	        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - amountToRead:           %8d", amountToRead) );
+        
+                    // Do the read from the heap we are spying on into MemSpy's address space
+					// TomS: I didn't know you could do this - you live and learn
+					do
+						{
+						r = Kern::ThreadRawRead( thread, (const void*)readAddress, destPtr, amountToRead );
+        				TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - read result: %d", r) );
 
-                        // The remaining number of bytes should allow us to calculate the position
-                        // to read from.
-                        const TInt amountToRead = Min( aParams.iRemaining, destMax );
-        	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - amountToRead:           %8d", amountToRead) );
-                        const TInt readOffset = ( heapSize - aParams.iRemaining );
-        	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - readOffset:             %8d", readOffset) );
-                        const TAny* readAddress = startOfHeapOffset + readOffset;
-        	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - readAddress:          0x%08x", readAddress) );
-            
-                        // Do the read from the heap we are spying on into MemSpy's address space
-                        r = Kern::ThreadRawRead( thread, readAddress, destPtr, amountToRead );
-        	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - read result: %d", r) );
-                        //
-                        if  (r == KErrNone)
-                            {
-                            // Client takes care of updating descriptor length.
-                            r = amountToRead;
-                            }
-                        else if ( r == KErrBadDescriptor )
-                            {
-                            MemSpyDriverUtils::PanicThread( ClientThread(), EPanicBadDescriptor );
-                            }
-            
-                        // Update remaining bytes
-                        aParams.iRemaining -= amountToRead;
-                        aParams.iReadAddress = (TUint) readAddress;
+						if (r == KErrBadDescriptor)
+							{
+							// This is not necessarily an error - it could be we've hit an unmapped page
+							if (amountToRead > KPageSize)
+								{
+								// retry reading a single page instead
+								amountToRead = KPageSize;
+								}
+							else
+								{
+								// Try the next page
+								readAddress += KPageSize;
+								}
+							}
+						} while (r == KErrBadDescriptor && readAddress < chunkMaxAddr);
+                    //
+                    if  (r == KErrNone)
+                        {
+                        // Client takes care of updating descriptor length.
+                        r = amountToRead;
                         }
+        
+                    // Update remaining bytes
+                    aParams.iRemaining -= amountToRead;
+                    aParams.iReadAddress = readAddress;
                     }
                 }
-            else
-                {
-    	        Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - chunk not found! thread: %O", thread );
-                r = KErrNotFound;
-                }
-            }
+			}
         else
             {
-    	    Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - couldnt find heap - vtable mis-match? thread: %O", thread );
+    	    Kern::Printf("DMemSpyDriverLogChanHeapData::GetHeapDataUser - couldnt open heap for thread %O, err=%d", thread, r);
             r = KErrNotSupported;
             }
+		heap.Close();
         }
     else
         {
--- a/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapInfo.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapInfo.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -46,24 +46,18 @@
 DMemSpyDriverLogChanHeapInfo::~DMemSpyDriverLogChanHeapInfo()
 	{
 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::~DMemSpyDriverLogChanHeapInfo() - START - this: 0x%08x", this ));
+	ReleaseCellList();
 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::~DMemSpyDriverLogChanHeapInfo() - END - this: 0x%08x", this ));
 	}
 
-
-
-
-
-
-
-
 TInt DMemSpyDriverLogChanHeapInfo::Request( TInt aFunction, TAny* a1, TAny* a2 )
 	{
 	TInt r = DMemSpyDriverLogChanHeapBase::Request( aFunction, a1, a2 );
     if  ( r == KErrNone )
         {
-        if  ( aFunction != EMemSpyDriverOpCodeHeapInfoFetchFreeCells )
+        if  ( aFunction != EMemSpyDriverOpCodeHeapInfoFetchCellList )
             {
-            ReleaseFreeCells();
+            ReleaseCellList();
             }
         //
         switch( aFunction )
@@ -75,10 +69,10 @@
             r = GetHeapInfoKernel( (TMemSpyDriverInternalHeapRequestParameters*) a1, (TDes8*) a2 );
             break;
         case EMemSpyDriverOpCodeHeapInfoGetIsDebugKernel:
-            r = GetIsDebugKernel( (TBool*) a1 );
+            r = GetIsDebugKernel(a1);
             break;
-        case EMemSpyDriverOpCodeHeapInfoFetchFreeCells:
-            r = FetchFreeCells( (TDes8*) a1 );
+        case EMemSpyDriverOpCodeHeapInfoFetchCellList:
+            r = FetchCellList( (TDes8*) a1 );
             break;
 
         default:
@@ -132,50 +126,42 @@
             DThread* thread = (DThread*) TempObject();
             if  ( SuspensionManager().IsSuspended( *thread ) )
                 {
-                TFullName chunkName;
-
                 // Open client's heap
                 RMemSpyDriverRHeapUser rHeap( OSAdaption() );
-                DChunk* userHeapChunk = NULL;
-                r = OpenUserHeap( *thread, iHeapInfoParams.iRHeapVTable, rHeap, userHeapChunk, &chunkName );
+				r = rHeap.OpenUserHeap(*thread, iHeapInfoParams.iDebugAllocator);
                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - opening client heap returned: %d", r) );
 
                 if  ( r == KErrNone )
                     {
                     // This object holds all of the info we will accumulate for the client.
                     TMemSpyHeapInfo masterHeapInfo;
-                    masterHeapInfo.SetType( TMemSpyHeapInfo::ETypeRHeap );
+                    masterHeapInfo.SetType(rHeap.GetTypeFromHelper());
                     masterHeapInfo.SetTid( iHeapInfoParams.iTid );
                     masterHeapInfo.SetPid( OSAdaption().DThread().GetOwningProcessId( *thread ) );
 
                     // This is the RHeap-specific object that contains all RHeap info
                     TMemSpyHeapInfoRHeap& rHeapInfo = masterHeapInfo.AsRHeap();
 
-                    // This is the object data for the RHeap instance
-                    TMemSpyHeapObjectDataRHeap& rHeapObjectData = rHeapInfo.ObjectData();
-                    rHeap.CopyObjectDataTo( rHeapObjectData );
 
                     // We must walk the client's heap in order to build statistics
                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - calling heap walker constructor..."));
-                    TMemSpyHeapWalkerNullObserver observer; 
-                    RMemSpyDriverHeapWalker heapWalker( rHeap, iHeapInfoParams.iDebugAllocator );
-                    if  ( iHeapInfoParams.iBuildFreeCellList )
+					RMemSpyDriverHeapWalker heapWalker(rHeap);
+                    if  (iHeapInfoParams.iBuildFreeCellList || iHeapInfoParams.iBuildAllocCellList)
                         {
                         heapWalker.SetObserver( this );
-                        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - collecting free cells"));
+                        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - collecting cells"));
                         }
                     else
                         {
-                        heapWalker.SetObserver( &observer );
-                        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - not collecting free cells"));
+                        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - not collecting cells"));
                         }
 
-                    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - starting traversal..." ));
+                    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - starting traversal openerr: %d...", r));
 
 #if ( defined( TRACE_TYPE_USERHEAP ) && defined( TRACE_TYPE_HEAPWALK ) )
                     heapWalker.SetPrintDebug();
 #endif
-                    r = heapWalker.Traverse();
+                    if (r == KErrNone) r = heapWalker.Traverse();
                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoUser - finished traversal - err: %d", r ));
 
                     TMemSpyHeapStatisticsRHeap& rHeapStats = rHeapInfo.Statistics();
@@ -183,24 +169,26 @@
 
                     // Get remaining meta data that isn't stored elsewhere
                     TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
-                    rHeapMetaData.SetChunkName( chunkName );
-                    rHeapMetaData.SetChunkSize( (TUint) OSAdaption().DChunk().GetSize( *userHeapChunk ) );
-                    rHeapMetaData.SetChunkHandle( userHeapChunk );
-                    rHeapMetaData.SetChunkBaseAddress( OSAdaption().DChunk().GetBase( *userHeapChunk ) );
-                    rHeapMetaData.SetDebugAllocator( iHeapInfoParams.iDebugAllocator );
-                    rHeapMetaData.SetHeaderSizeFree( RMemSpyDriverRHeapBase::FreeCellHeaderSize() );
-                    rHeapMetaData.SetHeaderSizeAllocated( RMemSpyDriverRHeapBase::AllocatedCellHeaderSize( iHeapInfoParams.iDebugAllocator ) );
+					DChunk& userHeapChunk = rHeap.Chunk();
+					TFullName chunkName;
+					userHeapChunk.FullName(chunkName);
+					rHeapMetaData.SetChunkName( chunkName );
+		            rHeapMetaData.SetChunkSize( (TUint) OSAdaption().DChunk().GetSize( userHeapChunk ) );
+					rHeapMetaData.SetChunkHandle( &userHeapChunk );
+					rHeapMetaData.SetChunkBaseAddress( OSAdaption().DChunk().GetBase( userHeapChunk ) );
+                    rHeapMetaData.SetDebugAllocator(rHeap.Helper()->AllocatorIsUdeb());
                     rHeapMetaData.SetUserThread( ETrue );
-
-                    // Get any heap-specific info
-                    rHeap.GetHeapSpecificInfo( masterHeapInfo );
+					rHeapMetaData.iHeapSize = rHeap.Helper()->CommittedSize();
+					rHeapMetaData.iAllocatorAddress = (TAny*)rHeap.Helper()->AllocatorAddress();
+					rHeapMetaData.iMinHeapSize = rHeap.Helper()->MinCommittedSize();
+					rHeapMetaData.iMaxHeapSize = rHeap.Helper()->MaxCommittedSize();
 
                     PrintHeapInfo( masterHeapInfo );
 
                     // Write free cells if requested
-                    if  ( r == KErrNone && iHeapInfoParams.iBuildFreeCellList )
+                    if  ( r == KErrNone && (iHeapInfoParams.iBuildFreeCellList || iHeapInfoParams.iBuildAllocCellList))
                         {
-                        r = PrepareFreeCellTransferBuffer();
+                        r = PrepareCellListTransferBuffer();
                         }
 
                     // Update info ready for writing back to the user-side
@@ -217,7 +205,7 @@
                         }
 
                     // Release resources
-                    rHeap.DisassociateWithKernelChunk();
+					rHeap.Close();
                     }
                 }
             else
@@ -249,18 +237,13 @@
     if  ( r == KErrNone )
         {
         // Open kernel heap
-        TFullName heapChunkName;
         RMemSpyDriverRHeapKernelInPlace rHeap;
-        r = OpenKernelHeap( rHeap, &heapChunkName );
+        r = rHeap.OpenKernelHeap();
         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - open err: %d", r ) );
 
         if  ( r == KErrNone )
             {
-            // We must identify if we have a debug kernel allocator
-            const TBool debugAllocator = IsDebugKernel( rHeap );
-            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - debugAllocator: %d", debugAllocator ) );
-
-            r = DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel( rHeap, debugAllocator, heapChunkName, params.iMasterInfo, aTransferBuffer );
+            r = DMemSpyDriverLogChanHeapBase::GetHeapInfoKernel(rHeap, params.iMasterInfo, aTransferBuffer);
             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetHeapInfoKernel() - base class get heap info: %d", r) );
             }
         }
@@ -278,7 +261,7 @@
 
 
 
-TInt DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel( TBool* aIsDebugKernel )
+TInt DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel(TAny* aResult)
     {
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - START") );
     
@@ -288,22 +271,22 @@
     NKern::ThreadEnterCS();
     
     RMemSpyDriverRHeapKernelInPlace rHeap;
-    r = OpenKernelHeap( rHeap );
+    r = rHeap.OpenKernelHeap();
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - open kernel heap returned: %d", r) );
 
     if  ( r == KErrNone )
         {
-        debugKernel = IsDebugKernel( rHeap );
+        debugKernel = rHeap.Helper()->AllocatorIsUdeb();
 
         // Tidy up
-        rHeap.DisassociateWithKernelChunk();
+        rHeap.Close();
         }
 
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - debugKernel: %d", debugKernel) );
 
     // Write back to user-land
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::GetIsDebugKernel() - writing to user-side...") );
-    r = Kern::ThreadRawWrite( &ClientThread(), aIsDebugKernel, &debugKernel, sizeof(TBool) );
+    r = Kern::ThreadRawWrite( &ClientThread(), aResult, &debugKernel, sizeof(TBool) );
 
     NKern::ThreadLeaveCS();
 
@@ -311,39 +294,120 @@
     return r;
     }
 
-
-
+TInt DMemSpyDriverLogChanHeapInfo::PrepareCellListTransferBuffer()
+    {
+    // Transfer free cells immediately from xfer stream
+    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::PrepareCellListTransferBuffer() - START - iHeapStream: 0x%08x", iHeapStream ));
+    __ASSERT_ALWAYS( !iHeapStream, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapFreeCellStreamNotClosed ) );
+    //
+    TInt r = KErrNoMemory;
+    //
+    NKern::ThreadEnterCS();
+    //
+    iHeapStream = new RMemSpyMemStreamWriter();
+    if  ( iHeapStream )
+        {
+        const TInt requiredMemory = CalculateCellListBufferSize();
+        r = OpenXferStream( *iHeapStream, requiredMemory );
+        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::PrepareCellListTransferBuffer() - requested %d bytes for free cell list, r: %d", requiredMemory, r ));
 
-
+        if  ( r == KErrNone )
+            {
+            const TInt count = iCellList.Count();
+            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::PrepareCellListTransferBuffer() - cell count: %d", count ));
+            //
+            iHeapStream->WriteInt32( count );
+            for( TInt i=0; i<count; i++ )
+                {
+                const TMemSpyDriverCell& cell = iCellList[ i ];
+                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::PrepareCellListTransferBuffer() - storing entry: %d", i ));
+                //
+                iHeapStream->WriteInt32( cell.iType );
+                iHeapStream->WriteUint32( reinterpret_cast<TUint32>( cell.iAddress ) );
+                iHeapStream->WriteInt32( cell.iLength );
+                }
 
+            // Finished with the array now
+            iCellList.Reset();
 
+            // We return the amount of client-side memory that needs to be allocated to hold the buffer
+            r = requiredMemory;
+            }
+        }
+    //
+    NKern::ThreadLeaveCS();
+               
+    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::PrepareCellListTransferBuffer() - END - r: %d", r));
+	return r;
+    }
 
 
-
+TInt DMemSpyDriverLogChanHeapInfo::FetchCellList( TDes8* aBufferSink )
+    {
+    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::FetchCellList() - START - iHeapStream: 0x%08x", iHeapStream ));
+    __ASSERT_ALWAYS( iHeapStream, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapFreeCellStreamNotOpen ) );
 
-
+    TInt r = KErrNone;
 
-
+    // Write buffer to client
+    NKern::ThreadEnterCS();
+    r = iHeapStream->WriteAndClose( aBufferSink );
 
+    // Tidy up
+    ReleaseCellList();
 
+    NKern::ThreadLeaveCS();
+    //
+    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::FetchCellList() - END - r: %d", r));
+	return r;
+    }
 
 
 
-
-
+TInt DMemSpyDriverLogChanHeapInfo::CalculateCellListBufferSize() const
+    {
+    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::CalculateCellListBufferSize() - START" ));
 
-
-
-
+    const TInt count = iCellList.Count();
+    const TInt entrySize = sizeof( TInt32 ) + sizeof( TInt32 ) + sizeof( TUint32 );
+    const TInt r = ( count * entrySize ) + sizeof( TInt ); // Extra TInt to hold count
+                
+    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::CalculateCellListBufferSize() - END - r: %d, count: %d, entrySize: %d", r, count, entrySize ));
+	return r;
+    }
 
 
 
-
+void DMemSpyDriverLogChanHeapInfo::ReleaseCellList()
+    {
+	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::ReleaseCellList() - START - this: 0x%08x", this ));
 
+    NKern::ThreadEnterCS();
+    iCellList.Reset();
+    delete iHeapStream;
+    iHeapStream = NULL;
+    NKern::ThreadLeaveCS();
 
-
+    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapInfo::ReleaseCellList() - END - this: 0x%08x", this ));
+    }
 
-
+TBool DMemSpyDriverLogChanHeapInfo::HandleHeapCell(TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt /*aNestingLevel*/, TInt /*aAllocNumber*/)
+    {
+	TInt err = KErrNone;
+    if (((aCellType & EMemSpyDriverFreeCellMask) && iHeapInfoParams.iBuildFreeCellList) || ((aCellType & EMemSpyDriverAllocatedCellMask) && iHeapInfoParams.iBuildAllocCellList))
+		{
+		TMemSpyDriverCell cell;
+		cell.iType = aCellType;
+		cell.iAddress = aCellAddress;
+		cell.iLength = aLength;
 
+		NKern::ThreadEnterCS();
+		err = iCellList.Append(cell);
+		NKern::ThreadLeaveCS();
+		}
+	return err == KErrNone;
+	}
 
-
+void DMemSpyDriverLogChanHeapInfo::HandleHeapWalkInit()
+	{
+	}
--- a/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapWalk.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapWalk.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -124,7 +124,7 @@
 TInt DMemSpyDriverLogChanHeapWalk::WalkHeapInit( TMemSpyDriverInternalWalkHeapParamsInit* aParams )
     {
 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit() - START"));
-    __ASSERT_ALWAYS( !iHeapWalkInitialised && iWalkHeap.ChunkIsInitialised() == EFalse, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkPending ) );
+    __ASSERT_ALWAYS( !iHeapWalkInitialised && iWalkHeap.Helper() == NULL, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkPending ) );
 
     TInt r = Kern::ThreadRawRead( &ClientThread(), aParams, &iHeapWalkInitialParameters, sizeof(TMemSpyDriverInternalWalkHeapParamsInit) );
     if  ( r == KErrNone )
@@ -141,8 +141,8 @@
                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - thread: %O", thread));
 
                 // Open client's heap
-                DChunk* userHeapChunk = NULL;
-                r = OpenUserHeap( *thread, iHeapWalkInitialParameters.iRHeapVTable, iWalkHeap, userHeapChunk );
+                r = iWalkHeap.OpenUserHeap(*thread, iHeapWalkInitialParameters.iDebugAllocator);
+
                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - opening client heap returned: %d", r) );
 
                 if  ( r == KErrNone )
@@ -154,7 +154,7 @@
 
                     // Walk the client's heap
                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - calling heap walker constructor..."));
-                    RMemSpyDriverHeapWalker heapWalker( iWalkHeap, iHeapWalkInitialParameters.iDebugAllocator );
+                    RMemSpyDriverHeapWalker heapWalker(iWalkHeap);
                     
                     TMemSpyDriverLogChanHeapWalkObserver observer( *this );
                     heapWalker.SetObserver( &observer );
@@ -169,7 +169,7 @@
                 if  ( r < KErrNone )
                     {
                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - error scenario - releasing kernel heap chunk copy" ));
-                    iWalkHeap.DisassociateWithKernelChunk();
+                    iWalkHeap.Close();
                     }
                 }
             else
@@ -199,7 +199,7 @@
     {
     const TInt walkedHeapCellCount = iWalkHeapCells.Count();
 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapNextCell() - START - current cell count: %d", walkedHeapCellCount));
-    __ASSERT_ALWAYS( iHeapWalkInitialised && iWalkHeap.ChunkIsInitialised(), MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkNotInitialised ) );
+    __ASSERT_ALWAYS( iHeapWalkInitialised && iWalkHeap.Helper(), MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkNotInitialised ) );
 
     // Open the original thread
 	TInt r = OpenTempObject( aTid, EThread );
@@ -257,12 +257,7 @@
         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapClose - heap walk was still open..."));
       	NKern::ThreadEnterCS();
 
-        if  ( iWalkHeap.ChunkIsInitialised() )
-            {
-            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapClose - removing chunk (%O) from process", &iWalkHeap.Chunk() ) );
-            iWalkHeap.DisassociateWithKernelChunk();
-            iWalkHeap.Reset();
-            }
+		iWalkHeap.Close();
 
         // Discard handled cells
         iWalkHeapCells.Reset();
@@ -279,10 +274,9 @@
 
 TInt DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData(TMemSpyDriverInternalWalkHeapCellDataReadParams* aParams)
     {
-    __ASSERT_ALWAYS( iHeapWalkInitialised && iWalkHeap.ChunkIsInitialised(), MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkNotInitialised ) );
+    __ASSERT_ALWAYS( iHeapWalkInitialised && iWalkHeap.Helper(), MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkNotInitialised ) );
     //
-    const TBool debugEUser = iHeapWalkInitialParameters.iDebugAllocator;
-	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData() - START - thread id: %d, vtable: 0x%08x, debugAllocator: %d", iHeapWalkInitialParameters.iTid, iHeapWalkInitialParameters.iRHeapVTable, debugEUser));
+	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData() - START - thread id: %d, vtable: 0x%08x", iHeapWalkInitialParameters.iTid, iHeapWalkInitialParameters.iRHeapVTable));
     //
 	TMemSpyDriverInternalWalkHeapCellDataReadParams params;
     TInt r = Kern::ThreadRawRead( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverInternalWalkHeapCellDataReadParams) );
@@ -306,92 +300,58 @@
             {
             // Check we can find the cell in the cell list...
             const TMemSpyDriverInternalWalkHeapParamsCell* cell = CellInfoForSpecificAddress( params.iCellAddress );
-            if  ( cell == NULL )
-                {
-                // Maybe the client tried the base address of the cell data.
-                // try to take the header into account and retry.
-                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - didnt find matching cell for address: 0x%08x... trying address minus allocatedCellHeaderSize", params.iCellAddress ));
-
-                const TUint32 cellHeaderSize = (TUint32) RMemSpyDriverRHeapBase::AllocatedCellHeaderSize( debugEUser );
-        
-                TUint32 addr = (TUint32) params.iCellAddress;
-                addr -= cellHeaderSize;
-                params.iCellAddress = (TAny*) addr;
-                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - new address: 0x%08x", params.iCellAddress ));
-        
-                // Last try
-                cell = CellInfoForSpecificAddress( params.iCellAddress );
-                }
 
             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - cell: 0x%08x for address: 0x%08x", cell, params.iCellAddress ));
 
             if  ( cell )
                 {
-                const TBool isValidCell = iWalkHeap.CheckCell( cell->iCellAddress, cell->iLength );
-                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - isValidCell: %d", isValidCell ));
-        
-                if  ( isValidCell )
+                const TInt cellLen = cell->iLength;
+                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - cellLen: %d", cellLen ));
+
+                if  ( params.iReadLen <= cellLen )
                     {
-                    // Check the length request is valid
-                    const TInt cellLen = cell->iLength;
-                    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - cellLen: %d", cellLen ));
+
+                    // Get user side descriptor length info
+         	        TInt destLen = 0;
+        	        TInt destMax = 0;
+                    TUint8* destPtr = NULL;
 
-                    if  ( params.iReadLen <= cellLen )
+                    r = Kern::ThreadGetDesInfo( &ClientThread(), params.iDes, destLen, destMax, destPtr, ETrue );
+        	        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - user side descriptor: 0x%08x (0x%08x), len: %8d, maxLen: %8d, r: %d", params.iDes, destPtr, destLen, destMax, r ));
+
+                    // Work out the start offset for the data...
+                    if  ( r == KErrNone && destMax >= params.iReadLen )
                         {
-                        const TInt cellHeaderSize = RMemSpyDriverRHeapBase::CellHeaderSize( *cell, debugEUser );
-        	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - cellHeaderSize: %8d", cellHeaderSize ));
+                        const TAny* srcPos = ((TUint8*) cell->iCellAddress);
+        	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - srcPos: 0x%08x", srcPos ));
 
-                        // Get user side descriptor length info
-         	            TInt destLen = 0;
-        	            TInt destMax = 0;
-                        TUint8* destPtr = NULL;
+                        // Read some data 
+                        r = Kern::ThreadRawRead( thread, srcPos, destPtr, params.iReadLen );
+    	                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - read from thread returned: %d", r));
 
-                        r = Kern::ThreadGetDesInfo( &ClientThread(), params.iDes, destLen, destMax, destPtr, ETrue );
-        	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - user side descriptor: 0x%08x (0x%08x), len: %8d, maxLen: %8d, r: %d", params.iDes, destPtr, destLen, destMax, r ));
-
-                        // Work out the start offset for the data...
-                        if  ( r == KErrNone && destMax >= params.iReadLen )
+                        if  ( r == KErrNone )
                             {
-                            const TAny* srcPos = ((TUint8*) cell->iCellAddress) + cellHeaderSize;
-        	                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - srcPos: 0x%08x", srcPos ));
-
-                            // Read some data 
-                            r = Kern::ThreadRawRead( thread, srcPos, destPtr, params.iReadLen );
-    	                    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - read from thread returned: %d", r));
-
-                            if  ( r == KErrNone )
-                                {
-                                // Client will update descriptor length in this situation.
-                                r = params.iReadLen;
-                                }
-                            else if ( r == KErrBadDescriptor )
-                                {
-                                MemSpyDriverUtils::PanicThread( ClientThread(), EPanicBadDescriptor );
-                                }
-                            }
-                        else
-                            {
-                            if  ( r != KErrBadDescriptor )
-                                {
-                                r = KErrArgument;                
-            	                Kern::Printf( "DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - error - user-descriptor isnt big enough for requested data" );
-                                }
-                            else
-                                {
-            	                Kern::Printf( "DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - error - bad or non-writable user-side descriptor" );
-                                }
+                            // Client will update descriptor length in this situation.
+                            r = params.iReadLen;
                             }
                         }
                     else
                         {
-                        r = KErrArgument;
-        	            Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - error - read length is bigger than cell length");
+                        if  ( r != KErrBadDescriptor )
+                            {
+                            r = KErrArgument;                
+            	            Kern::Printf( "DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - error - user-descriptor isnt big enough for requested data" );
+                            }
+                        else
+                            {
+            	            Kern::Printf( "DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - error - bad or non-writable user-side descriptor" );
+                            }
                         }
                     }
                 else
                     {
                     r = KErrArgument;
-                    Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - invalid cell address: 0x%08x", cell);
+        	        Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - error - read length is bigger than cell length");
                     }
                 }
             else
@@ -413,17 +373,16 @@
     	Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - thread not found");
 		}
     //
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData() - END"));
+    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData() - END result=%d", r));
     return r;
     }
 
 
 TInt DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo( TAny* aCellAddress, TMemSpyDriverInternalWalkHeapParamsCell* aParams )
     {
-    __ASSERT_ALWAYS( iHeapWalkInitialised && iWalkHeap.ChunkIsInitialised(), MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkNotInitialised ) );
+    __ASSERT_ALWAYS( iHeapWalkInitialised && iWalkHeap.Helper(), MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkNotInitialised ) );
     //
-    const TBool debugEUser = iHeapWalkInitialParameters.iDebugAllocator;
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo() - START - thread id: %d, vtable: 0x%08x, debugAllocator: %d", iHeapWalkInitialParameters.iTid, iHeapWalkInitialParameters.iRHeapVTable, debugEUser));
+    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo() - START - thread id: %d, vtable: 0x%08x", iHeapWalkInitialParameters.iTid, iHeapWalkInitialParameters.iRHeapVTable));
     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - cell: 0x%08x", aCellAddress));
 
     // Open the original thread
@@ -450,16 +409,6 @@
     if  ( cell == NULL )
         {
         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - no exact match for address: 0x%08x...", aCellAddress));
-
-        // Maybe the client tried the base address of the cell data.
-        // try to take the header into account and retry.
-        const TUint32 cellHeaderSize = (TUint32) RMemSpyDriverRHeapBase::AllocatedCellHeaderSize( debugEUser );
-        TUint32 addr = (TUint32) aCellAddress;
-        addr -= cellHeaderSize;
-        
-        TAny* cellByRawStartingAddress = (TAny*) addr;
-        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - trying to search by start of cell address: 0x%08x (cellHeaderSize: %d)", cellByRawStartingAddress, cellHeaderSize));
-        cell = CellInfoForSpecificAddress( cellByRawStartingAddress );
         
         // If the cell still wasn't found, then let's look for any heap cell that contains
         // the client-specified address (i.e. find the heap cell that contains the specified
@@ -473,18 +422,9 @@
 
     if  ( cell )
         {
-        const TBool isValidCell = iWalkHeap.CheckCell( cell->iCellAddress, cell->iLength );
-        if  ( isValidCell )
-            {
-            // Have enough info to write back to client now
-            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - returning... cellType: %1d, addr: 0x%08x, len: %8d, nestingLev: %8d, allocNum: %8d", cell->iCellType, cell->iCellAddress, cell->iLength, cell->iNestingLevel, cell->iAllocNumber ));
-            r = Kern::ThreadRawWrite( &ClientThread(), aParams, cell, sizeof(TMemSpyDriverInternalWalkHeapParamsCell) );
-            }
-        else
-            {
-            r = KErrArgument;
-            Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - invalid cell address: 0x%08x", cell);
-            }
+        // Have enough info to write back to client now
+        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - returning... cellType: %1d, addr: 0x%08x, len: %8d, nestingLev: %8d, allocNum: %8d", cell->iCellType, cell->iCellAddress, cell->iLength, cell->iNestingLevel, cell->iAllocNumber ));
+        r = Kern::ThreadRawWrite( &ClientThread(), aParams, cell, sizeof(TMemSpyDriverInternalWalkHeapParamsCell) );
         }
     else
         {
@@ -494,7 +434,7 @@
     
     CloseTempObject();
     //
-    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo() - END"));
+    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo() - END result=%d", r));
     return r;
     }
 
@@ -576,7 +516,7 @@
 
 
 
-TBool DMemSpyDriverLogChanHeapWalk::WalkerHandleHeapCell( TInt aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber )
+TBool DMemSpyDriverLogChanHeapWalk::WalkerHandleHeapCell(TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber )
     {
     TInt error = KErrNone;
     //
--- a/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanMisc.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanMisc.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -171,7 +171,6 @@
 
         DObjectCon* container = Kern::Containers()[ EProcess ];
         container->Wait();
-        NKern::LockSystem();
 
         const TInt count = container->Count();
         for(TInt i=0; i<count; i++)
@@ -193,9 +192,7 @@
                 }
             }
 
-        NKern::UnlockSystem();
         container->Signal();
-
     	NKern::ThreadLeaveCS();
         }
 
--- a/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanStack.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanStack.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -186,10 +186,6 @@
                 stackSize = threadAdaption.GetSupervisorStackSize( *thread );
                 stackBase = threadAdaption.GetSupervisorStackBase( *thread );
                 }
-            //We have a stack so setting it as available
-            if(stackSize!=0 &&  stackBase!=0)
-                stackAvailable=ETrue;
-            
             TRACE( Kern::Printf("DMemSpyDriverLogChanStack::GetStackData() - stackAvailable: %d", stackAvailable ));
             //           
             if  ( stackAvailable )
--- a/memspy/Driver/Shared/MemSpyDriverObjectsInternal.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Shared/MemSpyDriverObjectsInternal.h	Tue Aug 31 16:45:49 2010 +0300
@@ -33,8 +33,7 @@
     {
 public:
     inline TMemSpyDriverInternalHeapRequestParameters()
-        : iTid( 0 ), iRHeapVTable( 0 ), iBuildFreeCellList( EFalse ), iDebugAllocator( EFalse ), 
-          iMasterInfo( NULL )
+        : iTid(0), iRHeapVTable(0), iBuildFreeCellList(EFalse), iBuildAllocCellList(EFalse), iDebugAllocator(EFalse), iMasterInfo(NULL)
         {
         }
 
@@ -42,6 +41,7 @@
     TUint iTid;
     TUint32 iRHeapVTable;
     TBool iBuildFreeCellList;
+	TBool iBuildAllocCellList;
 
 public: // Params IN or OUT (IN in User heap requests, OUT in Kernel heap requests)
     TBool iDebugAllocator;
--- a/memspy/Driver/Shared/MemSpyDriverOpCodes.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/Shared/MemSpyDriverOpCodes.h	Tue Aug 31 16:45:49 2010 +0300
@@ -56,7 +56,7 @@
 	EMemSpyDriverOpCodeHeapInfoGetUser,
 	EMemSpyDriverOpCodeHeapInfoGetKernel,
     EMemSpyDriverOpCodeHeapInfoGetIsDebugKernel,
-    EMemSpyDriverOpCodeHeapInfoFetchFreeCells,
+    EMemSpyDriverOpCodeHeapInfoFetchCellList,
     EMemSpyDriverOpCodeHeapInfoEnd,
 
     // HEAP DATA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/Driver/Shared/heaputils.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,1678 @@
+// heaputils.cpp
+// 
+// Copyright (c) 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+#ifdef TEST_HYBRIDHEAP_ASSERTS
+#define private public
+#include <e32def.h>
+#include "slab.h"
+#include "page_alloc.h"
+#include "heap_hybrid.h"
+#endif
+
+#include "heaputils.h"
+
+#ifdef __KERNEL_MODE__
+
+#include <kern_priv.h>
+#define MEM Kern
+__ASSERT_COMPILE(sizeof(LtkUtils::RKernelSideAllocatorHelper) == 10*4);
+#define KERN_ENTER_CS() NKern::ThreadEnterCS()
+#define KERN_LEAVE_CS() NKern::ThreadLeaveCS()
+#define LOG(args...)
+#define HUEXPORT_C
+#else
+
+#include <e32std.h>
+#define MEM User
+#define KERN_ENTER_CS()
+#define KERN_LEAVE_CS()
+//#include <e32debug.h>
+//#define LOG(args...) RDebug::Printf(args)
+#define LOG(args...)
+
+#ifdef STANDALONE_ALLOCHELPER
+#define HUEXPORT_C
+#else
+#define HUEXPORT_C EXPORT_C
+#endif
+
+#endif // __KERNEL_MODE__
+
+using LtkUtils::RAllocatorHelper;
+const TUint KPageSize = 4096;
+__ASSERT_COMPILE(sizeof(RAllocatorHelper) == 9*4);
+
+// RAllocatorHelper
+
+HUEXPORT_C RAllocatorHelper::RAllocatorHelper()
+	: iAllocatorAddress(0), iAllocatorType(EUnknown), iInfo(NULL), iValidInfo(0), iTempSlabBitmap(NULL), iPageCache(NULL), iPageCacheAddr(0)
+#ifdef __KERNEL_MODE__
+	, iChunk(NULL)
+#endif
+	{
+	}
+
+namespace LtkUtils
+	{
+	class THeapInfo
+		{
+	public:
+		THeapInfo()
+			{
+			ClearStats();
+			}
+
+		void ClearStats()
+			{
+			memclr(this, sizeof(THeapInfo));
+			}
+
+		TInt iAllocatedSize; // number of bytes in allocated cells (excludes free cells, cell header overhead)
+		TInt iCommittedSize; // amount of memory actually committed (includes cell header overhead, gaps smaller than an MMU page)
+		TInt iAllocationCount; // number of allocations currently
+		TInt iMaxCommittedSize; // or thereabouts
+		TInt iMinCommittedSize;
+		TInt iUnusedPages;
+		TInt iCommittedFreeSpace;
+		// Heap-only stats
+		TInt iHeapFreeCellCount;
+		// Hybrid-only stats
+		TInt iDlaAllocsSize;
+		TInt iDlaAllocsCount;
+		TInt iDlaFreeSize;
+		TInt iDlaFreeCount;
+		TInt iSlabAllocsSize;
+		TInt iSlabAllocsCount;
+		TInt iPageAllocsSize;
+		TInt iPageAllocsCount;
+		TInt iSlabFreeCellSize;
+		TInt iSlabFreeCellCount;
+		TInt iSlabFreeSlabSize;
+		TInt iSlabFreeSlabCount;
+		};
+	}
+
+const TInt KTempBitmapSize = 256; // KMaxSlabPayload / mincellsize, technically. Close enough.
+
+#ifdef __KERNEL_MODE__
+
+TInt RAllocatorHelper::OpenKernelHeap()
+	{
+	_LIT(KName, "SvHeap");
+	NKern::ThreadEnterCS();
+	DObjectCon* chunkContainer = Kern::Containers()[EChunk];
+	chunkContainer->Wait();
+	const TInt chunkCount = chunkContainer->Count();
+	DChunk* foundChunk = NULL;
+	for(TInt i=0; i<chunkCount; i++)
+		{
+		DChunk* chunk = (DChunk*)(*chunkContainer)[i];
+		if (chunk->NameBuf() && chunk->NameBuf()->Find(KName) != KErrNotFound)
+			{
+			// Found it. No need to open it, we can be fairly confident the kernel heap isn't going to disappear from under us
+			foundChunk = chunk;
+			break;
+			}
+		}
+	iChunk = foundChunk;
+    chunkContainer->Signal();
+#ifdef __WINS__
+	TInt err = OpenChunkHeap((TLinAddr)foundChunk->Base(), 0); // It looks like DChunk::iBase/DChunk::iFixedBase should both be ok for the kernel chunk
+#else
+	// Copied from P::KernelInfo
+	const TRomHeader& romHdr=Epoc::RomHeader();
+	const TRomEntry* primaryEntry=(const TRomEntry*)Kern::SuperPage().iPrimaryEntry;
+	const TRomImageHeader* primaryImageHeader=(const TRomImageHeader*)primaryEntry->iAddressLin;
+	TLinAddr stack = romHdr.iKernDataAddress + Kern::RoundToPageSize(romHdr.iTotalSvDataSize);
+	TLinAddr heap = stack + Kern::RoundToPageSize(primaryImageHeader->iStackSize);
+	TInt err = OpenChunkHeap(heap, 0); // aChunkMaxSize is only used for trying the middle of the chunk for hybrid allocatorness, and the kernel heap doesn't use that (thankfully). So we can safely pass in zero.
+
+#endif
+	if (!err) err = FinishConstruction();
+	NKern::ThreadLeaveCS();
+	return err;
+	}
+
+#else
+
+HUEXPORT_C TInt RAllocatorHelper::Open(RAllocator* aAllocator)
+	{
+	iAllocatorAddress = (TLinAddr)aAllocator;
+	TInt udeb = EuserIsUdeb();
+	if (udeb < 0) return udeb; // error
+
+	TInt err = IdentifyAllocatorType(udeb);
+	if (!err)
+		{
+		err = FinishConstruction(); // Allocate everything up front
+		}
+	if (!err)
+		{
+		// We always stealth our own allocations, again to avoid tripping up allocator checks
+		SetCellNestingLevel(iInfo, -1);
+		SetCellNestingLevel(iTempSlabBitmap, -1);
+		SetCellNestingLevel(iPageCache, -1);
+		}
+	return err;
+	}
+
+#endif
+
+TInt RAllocatorHelper::FinishConstruction()
+	{
+	TInt err = KErrNone;
+	KERN_ENTER_CS();
+	if (!iInfo)
+		{
+		iInfo = new THeapInfo;
+		if (!iInfo) err = KErrNoMemory;
+		}
+	if (!err && !iTempSlabBitmap)
+		{
+		iTempSlabBitmap = (TUint8*)MEM::Alloc(KTempBitmapSize);
+		if (!iTempSlabBitmap) err = KErrNoMemory;
+		}
+	if (!err && !iPageCache)
+		{
+		iPageCache = MEM::Alloc(KPageSize);
+		if (!iPageCache) err = KErrNoMemory;
+		}
+
+	if (err)
+		{
+		delete iInfo;
+		iInfo = NULL;
+		MEM::Free(iTempSlabBitmap);
+		iTempSlabBitmap = NULL;
+		MEM::Free(iPageCache);
+		iPageCache = NULL;
+		}
+	KERN_LEAVE_CS();
+	return err;
+	}
+
+TInt RAllocatorHelper::ReadWord(TLinAddr aLocation, TUint32& aResult) const
+	{
+	// Check if we can satisfy the read from the cache
+	if (aLocation >= iPageCacheAddr)
+		{
+		TUint offset = aLocation - iPageCacheAddr;
+		if (offset < KPageSize)
+			{
+			aResult = ((TUint32*)iPageCache)[offset >> 2];
+			return KErrNone;
+			}
+		}
+
+	// If we reach here, not in page cache. Try and read in the new page
+	if (iPageCache)
+		{
+		TLinAddr pageAddr = aLocation & ~(KPageSize-1);
+		TInt err = ReadData(pageAddr, iPageCache, KPageSize);
+		if (!err)
+			{
+			iPageCacheAddr = pageAddr;
+			aResult = ((TUint32*)iPageCache)[(aLocation - iPageCacheAddr) >> 2];
+			return KErrNone;
+			}
+		}
+
+	// All else fails, try just reading it uncached
+	return ReadData(aLocation, &aResult, sizeof(TUint32));
+	}
+
+TInt RAllocatorHelper::ReadByte(TLinAddr aLocation, TUint8& aResult) const
+	{
+	// Like ReadWord but 8-bit
+
+	// Check if we can satisfy the read from the cache
+	if (aLocation >= iPageCacheAddr)
+		{
+		TUint offset = aLocation - iPageCacheAddr;
+		if (offset < KPageSize)
+			{
+			aResult = ((TUint8*)iPageCache)[offset];
+			return KErrNone;
+			}
+		}
+
+	// If we reach here, not in page cache. Try and read in the new page
+	if (iPageCache)
+		{
+		TLinAddr pageAddr = aLocation & ~(KPageSize-1);
+		TInt err = ReadData(pageAddr, iPageCache, KPageSize);
+		if (!err)
+			{
+			iPageCacheAddr = pageAddr;
+			aResult = ((TUint8*)iPageCache)[(aLocation - iPageCacheAddr)];
+			return KErrNone;
+			}
+		}
+
+	// All else fails, try just reading it uncached
+	return ReadData(aLocation, &aResult, sizeof(TUint8));
+	}
+
+
+TInt RAllocatorHelper::WriteWord(TLinAddr aLocation, TUint32 aWord)
+	{
+	// Invalidate the page cache if necessary
+	if (aLocation >= iPageCacheAddr && aLocation - iPageCacheAddr < KPageSize)
+		{
+		iPageCacheAddr = 0;
+		}
+
+	return WriteData(aLocation, &aWord, sizeof(TUint32));
+	}
+
+TInt RAllocatorHelper::ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const
+	{
+	// RAllocatorHelper base class impl is for allocators in same address space, so just copy it
+	memcpy(aResult, (const TAny*)aLocation, aSize);
+	return KErrNone;
+	}
+
+TInt RAllocatorHelper::WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize)
+	{
+	memcpy((TAny*)aLocation, aData, aSize);
+	return KErrNone;
+	}
+
+#ifdef __KERNEL_MODE__
+
+LtkUtils::RKernelSideAllocatorHelper::RKernelSideAllocatorHelper()
+	: iThread(NULL)
+	{}
+
+void LtkUtils::RKernelSideAllocatorHelper::Close()
+	{
+	NKern::ThreadEnterCS();
+	if (iThread)
+		{
+		iThread->Close(NULL);
+		}
+	iThread = NULL;
+	RAllocatorHelper::Close();
+	NKern::ThreadLeaveCS();
+	}
+
+TInt LtkUtils::RKernelSideAllocatorHelper::ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const
+	{
+	return Kern::ThreadRawRead(iThread, (const TAny*)aLocation, aResult, aSize);
+	}
+
+TInt LtkUtils::RKernelSideAllocatorHelper::WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize)
+	{
+	return Kern::ThreadRawWrite(iThread, (TAny*)aLocation, aData, aSize);
+	}
+
+TInt LtkUtils::RKernelSideAllocatorHelper::TryLock()
+	{
+	return KErrNotSupported;
+	}
+
+void LtkUtils::RKernelSideAllocatorHelper::TryUnlock()
+	{
+	// Not supported
+	}
+
+TInt LtkUtils::RKernelSideAllocatorHelper::OpenUserHeap(TUint aThreadId, TLinAddr aAllocatorAddress, TBool aEuserIsUdeb)
+	{
+	NKern::ThreadEnterCS();
+	DObjectCon* threads = Kern::Containers()[EThread];
+	threads->Wait();
+	iThread = Kern::ThreadFromId(aThreadId);
+	if (iThread && iThread->Open() != KErrNone)
+		{
+		// Failed to open
+		iThread = NULL;
+		}
+	threads->Signal();
+	NKern::ThreadLeaveCS();
+	if (!iThread) return KErrNotFound;
+	iAllocatorAddress = aAllocatorAddress;
+	TInt err = IdentifyAllocatorType(aEuserIsUdeb);
+	if (err) Close();
+	return err;
+	}
+
+#endif // __KERNEL_MODE__
+
+TInt RAllocatorHelper::OpenChunkHeap(TLinAddr aChunkBase, TInt aChunkMaxSize)
+	{
+	iAllocatorAddress = aChunkBase;
+#ifdef __KERNEL_MODE__
+	// Must be in CS
+	// Assumes that this only ever gets called for the kernel heap. Otherwise goes through RKernelSideAllocatorHelper::OpenUserHeap.
+	TInt udeb = EFalse; // We can't figure this out until after we've got the heap
+#else
+	// Assumes the chunk isn't the kernel heap. It's not a good idea to try messing with the kernel heap from user side...
+	TInt udeb = EuserIsUdeb();
+	if (udeb < 0) return udeb; // error
+#endif
+
+	TInt err = IdentifyAllocatorType(udeb);
+	if (err == KErrNone && iAllocatorType == EAllocator)
+		{
+		// We've no reason to assume it's an allocator because we don't know the iAllocatorAddress actually is an RAllocator*
+		err = KErrNotFound;
+		}
+	if (err)
+		{
+		TInt oldErr = err;
+		TAllocatorType oldType = iAllocatorType;
+		// Try middle of chunk, in case it's an RHybridHeap
+		iAllocatorAddress += aChunkMaxSize / 2;
+		err = IdentifyAllocatorType(udeb);
+		if (err || iAllocatorType == EAllocator)
+			{
+			// No better than before
+			iAllocatorAddress = aChunkBase;
+			iAllocatorType = oldType;
+			err = oldErr;
+			}
+		}
+#ifdef __KERNEL_MODE__
+	if (err == KErrNone)
+		{
+		// Now we know the allocator, we can figure out the udeb-ness
+		RAllocator* kernelAllocator = reinterpret_cast<RAllocator*>(iAllocatorAddress);
+		kernelAllocator->DebugFunction(RAllocator::ESetFail, (TAny*)9999, (TAny*)0); // Use an invalid fail reason - this should have no effect on the operation of the heap
+		TInt err = kernelAllocator->DebugFunction(7, NULL, NULL); // 7 is RAllocator::TAllocDebugOp::EGetFail
+		if (err == 9999)
+			{
+			// udeb new
+			udeb = ETrue;
+			}
+		else if (err == KErrNotSupported)
+			{
+			// Old heap - fall back to slightly nasty non-thread-safe method
+			kernelAllocator->DebugFunction(RAllocator::ESetFail, (TAny*)RAllocator::EFailNext, (TAny*)1);
+			TAny* res = Kern::Alloc(4);
+			if (res) udeb = ETrue;
+			Kern::Free(res);
+			}
+		else
+			{
+			// it's new urel
+			}
+
+		// Put everything back
+		kernelAllocator->DebugFunction(RAllocator::ESetFail, (TAny*)RAllocator::ENone, (TAny*)0);
+		// And update the type now we know the udeb-ness for certain
+		err = IdentifyAllocatorType(udeb);
+		}
+#endif
+	return err;
+	}
+
+
+// The guts of RAllocatorHelper
+
+enum TWhatToGet
+	{
+	ECommitted = 1,
+	EAllocated = 2,
+	ECount = 4,
+	EMaxSize = 8,
+	EUnusedPages = 16,
+	ECommittedFreeSpace = 32,
+	EMinSize = 64,
+	EHybridStats = 128,
+	};
+
+class RHackAllocator : public RAllocator
+	{
+public:
+	using RAllocator::iHandles;
+	using RAllocator::iTotalAllocSize;
+	using RAllocator::iCellCount;
+	};
+
+class RHackHeap : public RHeap
+	{
+public:
+	// Careful, only allowed to use things that are still in the new RHeap, and are still in the same place
+	using RHeap::iMaxLength;
+	using RHeap::iChunkHandle;
+	using RHeap::iLock;
+	using RHeap::iBase;
+	using RHeap::iAlign;
+	using RHeap::iTop;
+	};
+
+const TInt KChunkSizeOffset = 30*4;
+const TInt KPageMapOffset = 141*4;
+//const TInt KDlOnlyOffset = 33*4;
+const TInt KMallocStateOffset = 34*4;
+const TInt KMallocStateTopSizeOffset = 3*4;
+const TInt KMallocStateTopOffset = 5*4;
+const TInt KMallocStateSegOffset = 105*4;
+const TInt KUserHybridHeapSize = 186*4;
+const TInt KSparePageOffset = 167*4;
+const TInt KPartialPageOffset = 165*4;
+const TInt KFullSlabOffset = 166*4;
+const TInt KSlabAllocOffset = 172*4;
+const TInt KSlabParentOffset = 1*4;
+const TInt KSlabChild1Offset = 2*4;
+const TInt KSlabChild2Offset = 3*4;
+const TInt KSlabPayloadOffset = 4*4;
+const TInt KSlabsetSize = 4;
+
+#ifdef TEST_HYBRIDHEAP_ASSERTS
+__ASSERT_COMPILE(_FOFF(RHybridHeap, iChunkSize) == KChunkSizeOffset);
+__ASSERT_COMPILE(_FOFF(RHybridHeap, iPageMap) == KPageMapOffset);
+__ASSERT_COMPILE(_FOFF(RHybridHeap, iGlobalMallocState) == KMallocStateOffset);
+__ASSERT_COMPILE(sizeof(malloc_state) == 107*4);
+__ASSERT_COMPILE(_FOFF(malloc_state, iTopSize) == KMallocStateTopSizeOffset);
+__ASSERT_COMPILE(_FOFF(malloc_state, iTop) == KMallocStateTopOffset);
+__ASSERT_COMPILE(_FOFF(malloc_state, iSeg) == KMallocStateSegOffset);
+__ASSERT_COMPILE(sizeof(RHybridHeap) == KUserHybridHeapSize);
+__ASSERT_COMPILE(_FOFF(RHybridHeap, iSparePage) == KSparePageOffset);
+__ASSERT_COMPILE(_FOFF(RHybridHeap, iPartialPage) == KPartialPageOffset);
+__ASSERT_COMPILE(_FOFF(RHybridHeap, iSlabAlloc) == KSlabAllocOffset);
+__ASSERT_COMPILE(_FOFF(slab, iParent) == KSlabParentOffset);
+__ASSERT_COMPILE(_FOFF(slab, iChild1) == KSlabChild1Offset);
+__ASSERT_COMPILE(_FOFF(slab, iChild2) == KSlabChild2Offset);
+__ASSERT_COMPILE(_FOFF(slab, iPayload) == KSlabPayloadOffset);
+__ASSERT_COMPILE(sizeof(slabset) == KSlabsetSize);
+#endif
+
+TInt RAllocatorHelper::TryLock()
+	{
+#ifdef __KERNEL_MODE__
+	NKern::ThreadEnterCS();
+	DMutex* m = *(DMutex**)(iAllocatorAddress + _FOFF(RHackHeap, iLock));
+	if (m) Kern::MutexWait(*m);
+	return KErrNone;
+#else
+	if (iAllocatorType != EUnknown && iAllocatorType != EAllocator)
+		{
+		RFastLock& lock = *reinterpret_cast<RFastLock*>(iAllocatorAddress + _FOFF(RHackHeap, iLock));
+		lock.Wait();
+		return KErrNone;
+		}
+	return KErrNotSupported;
+#endif
+	}
+
+void RAllocatorHelper::TryUnlock()
+	{
+#ifdef __KERNEL_MODE__
+	DMutex* m = *(DMutex**)(iAllocatorAddress + _FOFF(RHackHeap, iLock));
+	if (m) Kern::MutexSignal(*m);
+	NKern::ThreadLeaveCS();
+#else
+	if (iAllocatorType != EUnknown && iAllocatorType != EAllocator)
+		{
+		RFastLock& lock = *reinterpret_cast<RFastLock*>(iAllocatorAddress + _FOFF(RHackHeap, iLock));
+		lock.Signal();
+		}
+#endif
+	}
+
+HUEXPORT_C void RAllocatorHelper::Close()
+	{
+	KERN_ENTER_CS();
+	iAllocatorType = EUnknown;
+	iAllocatorAddress = 0;
+	delete iInfo;
+	iInfo = NULL;
+	iValidInfo = 0;
+	MEM::Free(iTempSlabBitmap);
+	iTempSlabBitmap = NULL;
+	MEM::Free(iPageCache);
+	iPageCache = NULL;
+	iPageCacheAddr = 0;
+	KERN_LEAVE_CS();
+	}
+
+TInt RAllocatorHelper::IdentifyAllocatorType(TBool aAllocatorIsUdeb)
+	{
+	iAllocatorType = EUnknown;
+
+	TUint32 handlesPtr = 0;
+	TInt err = ReadWord(iAllocatorAddress + _FOFF(RHackAllocator, iHandles), handlesPtr);
+
+	if (err) return err;
+	if (handlesPtr == iAllocatorAddress + _FOFF(RHackHeap, iChunkHandle) || handlesPtr == iAllocatorAddress + _FOFF(RHackHeap, iLock))
+		{
+		// It's an RHeap of some kind - I doubt any other RAllocator subclass will use iHandles in this way
+		TUint32 base = 0;
+		err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iBase), base);
+		if (err) return err;
+		TInt objsize = (TInt)base - (TInt)iAllocatorAddress;
+		if (objsize <= 32*4)
+			{
+			// Old RHeap
+			iAllocatorType = aAllocatorIsUdeb ? EUdebOldRHeap : EUrelOldRHeap;
+			}
+		else
+			{
+			// new hybrid heap - bigger than the old one. Likewise figure out if udeb or urel.
+			iAllocatorType = aAllocatorIsUdeb ? EUdebHybridHeap : EUrelHybridHeap;
+			}
+		}
+	else
+		{
+		iAllocatorType = EAllocator;
+		}
+	return KErrNone;
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::SetCellNestingLevel(TAny* aCell, TInt aNestingLevel)
+	{
+	TInt err = KErrNone;
+
+	switch (iAllocatorType)
+		{
+		case EUdebOldRHeap:
+		case EUdebHybridHeap:
+			// By this reckoning, they're in the same place amazingly
+			{
+			TLinAddr nestingAddr = (TLinAddr)aCell - 8;
+			err = WriteWord(nestingAddr, aNestingLevel);
+			break;
+			}
+		default:
+			break;
+		}
+	return err;
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::GetCellNestingLevel(TAny* aCell, TInt& aNestingLevel)
+	{
+	switch (iAllocatorType)
+		{
+		case EUdebOldRHeap:
+		case EUdebHybridHeap:
+			// By this reckoning, they're in the same place amazingly
+			{
+			TLinAddr nestingAddr = (TLinAddr)aCell - 8;
+			return ReadWord(nestingAddr, (TUint32&)aNestingLevel);
+			}
+		default:
+			return KErrNotSupported;
+		}
+	}
+
+TInt RAllocatorHelper::RefreshDetails(TUint aMask)
+	{
+	TInt err = FinishConstruction();
+	if (err) return err;
+
+	// Invalidate the page cache
+	iPageCacheAddr = 0;
+
+	TryLock();
+	err = DoRefreshDetails(aMask);
+	TryUnlock();
+	return err;
+	}
+
+const TInt KHeapWalkStatsForOldHeap = (EUnusedPages|ECommittedFreeSpace);
+const TInt KHeapWalkStatsForNewHeap = (EAllocated|ECount|EUnusedPages|ECommittedFreeSpace|EHybridStats);
+
+TInt RAllocatorHelper::DoRefreshDetails(TUint aMask)
+	{
+	TInt err = KErrNotSupported;
+	switch (iAllocatorType)
+		{
+		case EUrelOldRHeap:
+		case EUdebOldRHeap:
+			{
+			if (aMask & ECommitted)
+				{
+				// The old RHeap::Size() used to use iTop - iBase, which was effectively chunkSize - sizeof(RHeap)
+				// I think that for CommittedSize we should include the size of the heap object, just as it includes
+				// the size of heap cell metadata and overhead. Plus it makes sure the committedsize is a multiple of the page size
+				TUint32 top = 0;
+				//TUint32 base = 0;
+				//err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iBase), base);
+				//if (err) return err;
+				err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iTop), top);
+				if (err) return err;
+
+				//iInfo->iCommittedSize = top - base;
+				iInfo->iCommittedSize = top - iAllocatorAddress;
+				iValidInfo |= ECommitted;
+				}
+			if (aMask & EAllocated)
+				{
+				TUint32 allocSize = 0;
+				err = ReadWord(iAllocatorAddress + _FOFF(RHackAllocator, iTotalAllocSize), allocSize);
+				if (err) return err;
+				iInfo->iAllocatedSize = allocSize;
+				iValidInfo |= EAllocated;
+				}
+			if (aMask & ECount)
+				{
+				TUint32 count = 0;
+				err = ReadWord(iAllocatorAddress + _FOFF(RHackAllocator, iCellCount), count);
+				if (err) return err;
+				iInfo->iAllocationCount = count;
+				iValidInfo |= ECount;
+				}
+			if (aMask & EMaxSize)
+				{
+				TUint32 maxlen = 0;
+				err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iMaxLength), maxlen);
+				if (err) return err;
+				iInfo->iMaxCommittedSize = maxlen;
+				iValidInfo |= EMaxSize;
+				}
+			if (aMask & EMinSize)
+				{
+				TUint32 minlen = 0;
+				err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iMaxLength) - 4, minlen); // This isn't a typo! iMinLength is 4 bytes before iMaxLength, on old heap ONLY
+				if (err) return err;
+				iInfo->iMinCommittedSize = minlen;
+				iValidInfo |= EMinSize;
+				}
+			if (aMask & KHeapWalkStatsForOldHeap)
+				{
+				// Need a heap walk
+				iInfo->ClearStats();
+				iValidInfo = 0;
+				err = DoWalk(&WalkForStats, NULL);
+				if (err == KErrNone) iValidInfo |= KHeapWalkStatsForOldHeap;
+				}
+			return err;
+			}
+		case EUrelHybridHeap:
+		case EUdebHybridHeap:
+			{
+			TBool needWalk = EFalse;
+			if (aMask & ECommitted)
+				{
+				// RAllocator::Size uses iChunkSize - sizeof(RHybridHeap);
+				// We can't do exactly the same, because we can't calculate sizeof(RHybridHeap), only ROUND_UP(sizeof(RHybridHeap), iAlign)
+				// And if fact we don't bother and just use iChunkSize
+				TUint32 chunkSize = 0;
+				err = ReadWord(iAllocatorAddress + KChunkSizeOffset, chunkSize);
+				if (err) return err;
+				//TUint32 baseAddr = 0;
+				//err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iBase), baseAddr);
+				//if (err) return err;
+				iInfo->iCommittedSize = chunkSize; // - (baseAddr - iAllocatorAddress);
+				iValidInfo |= ECommitted;
+				}
+			if (aMask & (EAllocated|ECount))
+				{
+				if (iAllocatorType == EUdebHybridHeap)
+					{
+					// Easy, just get them from the counter
+					TUint32 totalAlloc = 0;
+					err = ReadWord(iAllocatorAddress + _FOFF(RHackAllocator, iTotalAllocSize), totalAlloc);
+					if (err) return err;
+					iInfo->iAllocatedSize = totalAlloc;
+					iValidInfo |= EAllocated;
+
+					TUint32 cellCount = 0;
+					err = ReadWord(iAllocatorAddress + _FOFF(RHackAllocator, iCellCount), cellCount);
+					if (err) return err;
+					iInfo->iAllocationCount = cellCount;
+					iValidInfo |= ECount;
+					}
+				else
+					{
+					// A heap walk is needed
+					needWalk = ETrue;
+					}
+				}
+			if (aMask & EMaxSize)
+				{
+				TUint32 maxlen = 0;
+				err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iMaxLength), maxlen);
+				if (err) return err;
+				iInfo->iMaxCommittedSize = maxlen;
+				iValidInfo |= EMaxSize;
+				}
+			if (aMask & EMinSize)
+				{
+				TUint32 minlen = 0;
+				err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iAlign) + 4*4, minlen); // iMinLength is in different place to old RHeap
+				if (err) return err;
+				iInfo->iMinCommittedSize = minlen;
+				iValidInfo |= EMinSize;
+				}
+			if (aMask & (EUnusedPages|ECommittedFreeSpace|EHybridStats))
+				{
+				// EAllocated and ECount have already been taken care of above
+				needWalk = ETrue;
+				}
+
+			if (needWalk)
+				{
+				iInfo->ClearStats();
+				iValidInfo = 0;
+				err = DoWalk(&WalkForStats, NULL);
+				if (err == KErrNone) iValidInfo |= KHeapWalkStatsForNewHeap;
+				}
+			return err;
+			}
+		default:
+			return KErrNotSupported;
+		}
+	}
+
+TInt RAllocatorHelper::CheckValid(TUint aMask)
+	{
+	if ((iValidInfo & aMask) == aMask)
+		{
+		return KErrNone;
+		}
+	else
+		{
+		return RefreshDetails(aMask);
+		}
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::CommittedSize()
+	{
+	TInt err = CheckValid(ECommitted);
+	if (err) return err;
+	return iInfo->iCommittedSize;
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::AllocatedSize()
+	{
+	TInt err = CheckValid(EAllocated);
+	if (err) return err;
+	return iInfo->iAllocatedSize;
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::AllocationCount()
+	{
+	TInt err = CheckValid(ECount);
+	if (err) return err;
+	return iInfo->iAllocationCount;
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::RefreshDetails()
+	{
+	return RefreshDetails(iValidInfo);
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::MaxCommittedSize()
+	{
+	TInt err = CheckValid(EMaxSize);
+	if (err) return err;
+	return iInfo->iMaxCommittedSize;
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::MinCommittedSize()
+	{
+	TInt err = CheckValid(EMinSize);
+	if (err) return err;
+	return iInfo->iMinCommittedSize;
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::AllocCountForCell(TAny* aCell) const
+	{
+	TUint32 allocCount = 0;
+	switch (iAllocatorType)
+		{
+		case EUdebOldRHeap:
+		case EUdebHybridHeap: // Both are in the same place, amazingly
+			{
+			TLinAddr allocCountAddr = (TLinAddr)aCell - 4;
+			TInt err = ReadWord(allocCountAddr, allocCount);
+			if (err) return err;
+			return (TInt)allocCount;
+			}
+		default:
+			return KErrNotSupported;
+		}
+	}
+
+struct SContext3
+	{
+	RAllocatorHelper::TWalkFunc3 iOrigWalkFn;
+	TAny* iOrigContext;
+	};
+
+TBool RAllocatorHelper::DispatchClientWalkCallback(RAllocatorHelper& aHelper, TAny* aContext, RAllocatorHelper::TExtendedCellType aCellType, TLinAddr aCellPtr, TInt aCellLength)
+	{
+	WalkForStats(aHelper, NULL, aCellType, aCellPtr, aCellLength);
+	SContext3* context = static_cast<SContext3*>(aContext);
+	return (*context->iOrigWalkFn)(aHelper, context->iOrigContext, aCellType, aCellPtr, aCellLength);
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::Walk(TWalkFunc3 aCallbackFn, TAny* aContext)
+	{
+	// Might as well take the opportunity of updating our stats at the same time as walking the heap for the client
+	SContext3 context = { aCallbackFn, aContext };
+
+	TInt err = FinishConstruction(); // In case this hasn't been done yet
+	if (err) return err;
+
+	TryLock();
+	err = DoWalk(&DispatchClientWalkCallback, &context);
+	TryUnlock();
+	return err;
+	}
+
+TInt RAllocatorHelper::DoWalk(TWalkFunc3 aCallbackFn, TAny* aContext)
+	{
+	TInt err = KErrNotSupported;
+	switch (iAllocatorType)
+		{
+		case EUdebOldRHeap:
+		case EUrelOldRHeap:
+			err = OldSkoolWalk(aCallbackFn, aContext);
+			break;
+		case EUrelHybridHeap:
+		case EUdebHybridHeap:
+			err = NewHotnessWalk(aCallbackFn, aContext);
+			break;
+		default:
+			err = KErrNotSupported;
+			break;
+		}
+	return err;
+	}
+
+struct SContext
+	{
+	RAllocatorHelper::TWalkFunc iOrigWalkFn;
+	TAny* iOrigContext;
+	};
+
+struct SContext2
+	{
+	RAllocatorHelper::TWalkFunc2 iOrigWalkFn;
+	TAny* iOrigContext;
+	};
+
+#define New2Old(aNew) (((aNew)&RAllocatorHelper::EAllocationMask) ? RAllocatorHelper::EAllocation : ((aNew)&RAllocatorHelper::EFreeMask) ? RAllocatorHelper::EFreeSpace : RAllocatorHelper::EBadness)
+
+TBool DispatchOldTWalkFuncCallback(RAllocatorHelper& /*aHelper*/, TAny* aContext, RAllocatorHelper::TExtendedCellType aCellType, TLinAddr aCellPtr, TInt aCellLength)
+	{
+	SContext* context = static_cast<SContext*>(aContext);
+	return (*context->iOrigWalkFn)(context->iOrigContext, New2Old(aCellType), aCellPtr, aCellLength);
+	}
+
+TBool DispatchOldTWalk2FuncCallback(RAllocatorHelper& aHelper, TAny* aContext, RAllocatorHelper::TExtendedCellType aCellType, TLinAddr aCellPtr, TInt aCellLength)
+	{
+	SContext2* context = static_cast<SContext2*>(aContext);
+	return (*context->iOrigWalkFn)(aHelper, context->iOrigContext, New2Old(aCellType), aCellPtr, aCellLength);
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::Walk(TWalkFunc aCallbackFn, TAny* aContext)
+	{
+	// For backwards compatability insert a compatability callback to map between the different types of callback that clients requested
+	SContext context = { aCallbackFn, aContext };
+	return Walk(&DispatchOldTWalkFuncCallback, &context);
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::Walk(TWalkFunc2 aCallbackFn, TAny* aContext)
+	{
+	SContext2 context = { aCallbackFn, aContext };
+	return Walk(&DispatchOldTWalk2FuncCallback, &context);
+	}
+
+
+TInt RAllocatorHelper::OldSkoolWalk(TWalkFunc3 aCallbackFn, TAny* aContext)
+	{
+	TLinAddr pC = 0;
+	TInt err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iBase), pC); // pC = iBase; // allocated cells
+	if (err) return err;
+	TLinAddr pF = iAllocatorAddress + _FOFF(RHackHeap, iAlign) + 3*4; // pF = &iFree; // free cells
+
+	TLinAddr top = 0;
+	err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iTop), top);
+	if (err) return err;
+	const TInt KAllocatedCellHeaderSize = iAllocatorType == EUdebOldRHeap ? 12 : 4;
+	TInt minCell = 0;
+	err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iAlign) + 4, (TUint32&)minCell);
+	if (err) return err;
+	TInt align = 0;
+	err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iAlign), (TUint32&)align);
+	if (err) return err;
+
+	FOREVER
+		{
+		err = ReadWord(pF+4, pF); // pF = pF->next; // next free cell
+		if (err) return err;
+		TLinAddr pFnext = 0;
+		if (pF) err = ReadWord(pF + 4, pFnext);
+		if (err) return err;
+
+		if (!pF)
+			{
+			pF = top; // to make size checking work
+			}
+		else if (pF>=top || (pFnext && pFnext<=pF) )
+			{
+			// free cell pointer off the end or going backwards
+			//Unlock();
+			(*aCallbackFn)(*this, aContext, EHeapBadFreeCellAddress, pF, 0);
+			return KErrCorrupt;
+			}
+		else
+			{
+			TInt l; // = pF->len
+			err = ReadWord(pF, (TUint32&)l);
+			if (err) return err;
+			if (l<minCell || (l & (align-1)))
+				{
+				// free cell length invalid
+				//Unlock();
+				(*aCallbackFn)(*this, aContext, EHeapBadFreeCellSize, pF, l);
+				return KErrCorrupt;
+				}
+			}
+		while (pC!=pF)				// walk allocated cells up to next free cell
+			{
+			TInt l; // pC->len;
+			err = ReadWord(pC, (TUint32&)l);
+			if (err) return err;
+			if (l<minCell || (l & (align-1)))
+				{
+				// allocated cell length invalid
+				//Unlock();
+				(*aCallbackFn)(*this, aContext, EHeapBadAllocatedCellSize, pC, l);
+				return KErrCorrupt;
+				}
+			TBool shouldContinue = (*aCallbackFn)(*this, aContext, EHeapAllocation, pC + KAllocatedCellHeaderSize, l - KAllocatedCellHeaderSize);
+			if (!shouldContinue) return KErrNone;
+			
+			//SCell* pN = __NEXT_CELL(pC);
+			TLinAddr pN = pC + l;
+			if (pN > pF)
+				{
+				// cell overlaps next free cell
+				//Unlock();
+				(*aCallbackFn)(*this, aContext, EHeapBadAllocatedCellAddress, pC, l);
+				return KErrCorrupt;
+				}
+			pC = pN;
+			}
+		if (pF == top)
+			break;		// reached end of heap
+		TInt pFlen = 0;
+		err = ReadWord(pF, (TUint32&)pFlen);
+		if (err) return err;
+		pC = pF + pFlen; // pC = __NEXT_CELL(pF);	// step to next allocated cell
+		TBool shouldContinue = (*aCallbackFn)(*this, aContext, EHeapFreeCell, pF, pFlen);
+		if (!shouldContinue) return KErrNone;
+		}
+	return KErrNone;
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::CountUnusedPages()
+	{
+	TInt err = CheckValid(EUnusedPages);
+	if (err) return err;
+	return iInfo->iUnusedPages;
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::CommittedFreeSpace()
+	{
+	TInt err = CheckValid(ECommittedFreeSpace);
+	if (err) return err;
+	return iInfo->iCommittedFreeSpace;
+	}
+
+#define ROUND_DOWN(val, pow2) ((val) & ~((pow2)-1))
+#define ROUND_UP(val, pow2) ROUND_DOWN((val) + (pow2) - 1, (pow2))
+
+HUEXPORT_C TLinAddr RAllocatorHelper::AllocatorAddress() const
+	{
+	return iAllocatorAddress;
+	}
+
+TBool RAllocatorHelper::WalkForStats(RAllocatorHelper& aSelf, TAny* /*aContext*/, TExtendedCellType aType, TLinAddr aCellPtr, TInt aCellLength)
+	{
+	//ASSERT(aCellLength >= 0);
+	THeapInfo& info = *aSelf.iInfo;
+
+	TInt pagesSpanned = 0; // The number of pages that fit entirely inside the payload of this cell
+	if ((TUint)aCellLength > KPageSize)
+		{
+		TLinAddr nextPageAlignedAddr = ROUND_UP(aCellPtr, KPageSize);
+		pagesSpanned = ROUND_DOWN(aCellPtr + aCellLength - nextPageAlignedAddr, KPageSize) / KPageSize;
+		}
+
+	if (aSelf.iAllocatorType == EUrelOldRHeap || aSelf.iAllocatorType == EUdebOldRHeap)
+		{
+		if (aType & EFreeMask)
+			{
+			info.iUnusedPages += pagesSpanned;
+			info.iCommittedFreeSpace += aCellLength;
+			info.iHeapFreeCellCount++;
+			}
+		}
+	else
+		{
+		if (aType & EAllocationMask)
+			{
+			info.iAllocatedSize += aCellLength;
+			info.iAllocationCount++;
+			}
+		else if (aType & EFreeMask)
+			{
+			// I *think* that DLA will decommit pages from inside free cells...
+			TInt committedLen = aCellLength - (pagesSpanned * KPageSize);
+			info.iCommittedFreeSpace += committedLen;
+			}
+
+		switch (aType)
+			{
+			case EDlaAllocation:
+				info.iDlaAllocsSize += aCellLength;
+				info.iDlaAllocsCount++;
+				break;
+			case EPageAllocation:
+				info.iPageAllocsSize += aCellLength;
+				info.iPageAllocsCount++;
+				break;
+			case ESlabAllocation:
+				info.iSlabAllocsSize += aCellLength;
+				info.iSlabAllocsCount++;
+				break;
+			case EDlaFreeCell:
+				info.iDlaFreeSize += aCellLength;
+				info.iDlaFreeCount++;
+				break;
+			case ESlabFreeCell:
+				info.iSlabFreeCellSize += aCellLength;
+				info.iSlabFreeCellCount++;
+				break;
+			case ESlabFreeSlab:
+				info.iSlabFreeSlabSize += aCellLength;
+				info.iSlabFreeSlabCount++;
+				break;
+			default:
+				break;
+			}
+		}
+
+	return ETrue;
+	}
+
+#define PAGESHIFT 12
+
+TUint RAllocatorHelper::PageMapOperatorBrackets(unsigned ix, TInt& err) const
+	{
+	//return 1U&(iBase[ix>>3] >> (ix&7));
+	TUint32 basePtr = 0;
+	err = ReadWord(iAllocatorAddress + KPageMapOffset, basePtr);
+	if (err) return 0;
+
+	TUint8 res = 0;
+	err = ReadByte(basePtr + (ix >> 3), res);
+	if (err) return 0;
+
+	return 1U&(res >> (ix&7));
+	}
+
+
+TInt RAllocatorHelper::PageMapFind(TUint start, TUint bit, TInt& err)
+	{
+	TUint32 iNbits = 0;
+	err = ReadWord(iAllocatorAddress + KPageMapOffset + 4, iNbits);
+	if (err) return 0;
+
+	if (start<iNbits) do
+		{
+		//if ((*this)[start]==bit)
+		if (PageMapOperatorBrackets(start, err) == bit || err)
+			return start;
+		} while (++start<iNbits);
+	return -1;
+	}
+
+TUint RAllocatorHelper::PagedDecode(TUint pos, TInt& err)
+	{
+	unsigned bits = PageMapBits(pos,2,err);
+	if (err) return 0;
+	bits >>= 1;
+	if (bits == 0)
+		return 1;
+	bits = PageMapBits(pos+2,2,err);
+	if (err) return 0;
+	if ((bits & 1) == 0)
+		return 2 + (bits>>1);
+	else if ((bits>>1) == 0)
+		{
+		return PageMapBits(pos+4, 4,err);
+		}
+	else
+		{
+		return PageMapBits(pos+4, 18,err);
+		}
+	}
+
+TUint RAllocatorHelper::PageMapBits(unsigned ix, unsigned len, TInt& err)
+	{
+	int l=len;
+	unsigned val=0;
+	unsigned bit=0;
+	while (--l>=0)
+		{
+		//val |= (*this)[ix++]<<bit++;
+		val |= PageMapOperatorBrackets(ix++, err) << bit++;
+		if (err) return 0;
+		}
+	return val;
+	}
+
+enum TSlabType { ESlabFullInfo, ESlabPartialInfo, ESlabEmptyInfo };
+
+#ifndef TEST_HYBRIDHEAP_ASSERTS
+#define MAXSLABSIZE		56
+#define	SLABSHIFT		10
+#define	SLABSIZE		(1 << SLABSHIFT)
+const TInt KMaxSlabPayload = SLABSIZE - KSlabPayloadOffset;
+#endif
+
+TInt RAllocatorHelper::NewHotnessWalk(TWalkFunc3 aCallbackFn, TAny* aContext)
+	{
+	// RHybridHeap does paged, slab then DLA, so that's what we do too
+	// Remember Kernel RHybridHeaps don't even have the page and slab members
+
+	TUint32 basePtr;
+	TInt err = ReadWord(iAllocatorAddress + _FOFF(RHackHeap, iBase), basePtr);
+	if (err) return err;
+	if (basePtr < iAllocatorAddress + KUserHybridHeapSize)
+		{
+		// Must be a kernel one - don't do page and slab
+		}
+	else
+		{
+		// Paged
+		TUint32 membase = 0;
+		err = ReadWord(iAllocatorAddress + KPageMapOffset + 8, membase);
+		if (err) return err;
+
+		TBool shouldContinue = ETrue;
+		for (int ix = 0;(ix = PageMapFind(ix,1,err)) >= 0 && err == KErrNone;)
+			{
+			int npage = PagedDecode(ix, err);
+			if (err) return err;
+			// Introduce paged buffer to the walk function 
+			TLinAddr bfr = membase + (1 << (PAGESHIFT-1))*ix;
+			int len = npage << PAGESHIFT;
+			if ( (TUint)len > KPageSize )
+				{ // If buffer is not larger than one page it must be a slab page mapped into bitmap
+				if (iAllocatorType == EUdebHybridHeap)
+					{
+					bfr += 8;
+					len -= 8;
+					}
+				shouldContinue = (*aCallbackFn)(*this, aContext, EPageAllocation, bfr, len);
+				if (!shouldContinue) return KErrNone;
+				}
+			ix += (npage<<1);
+			}
+		if (err) return err;
+
+		// Slab
+		TUint32 sparePage = 0;
+		err = ReadWord(iAllocatorAddress + KSparePageOffset, sparePage);
+		if (err) return err;
+		if (sparePage)
+			{
+			//Walk(wi, iSparePage, iPageSize, EGoodFreeCell, ESlabSpare); // Introduce Slab spare page to the walk function 
+			// This counts as 4 spare slabs
+			for (TInt i = 0; i < 4; i++)
+				{
+				shouldContinue = (*aCallbackFn)(*this, aContext, ESlabFreeSlab, sparePage + SLABSIZE*i, SLABSIZE);
+				if (!shouldContinue) return KErrNone;
+				}
+			}
+
+		//TreeWalk(&iFullSlab, &SlabFullInfo, i, wi);
+		TInt err = TreeWalk(iAllocatorAddress + KFullSlabOffset, ESlabFullInfo, aCallbackFn, aContext, shouldContinue);
+		if (err || !shouldContinue) return err;
+		for (int ix = 0; ix < (MAXSLABSIZE>>2); ++ix)
+			{
+			TUint32 partialAddr = iAllocatorAddress + KSlabAllocOffset + ix*KSlabsetSize;
+			//TreeWalk(&iSlabAlloc[ix].iPartial, &SlabPartialInfo, i, wi);
+			err = TreeWalk(partialAddr, ESlabPartialInfo, aCallbackFn, aContext, shouldContinue);
+			if (err || !shouldContinue) return err;
+			}
+		//TreeWalk(&iPartialPage, &SlabEmptyInfo, i, wi);
+		TreeWalk(iAllocatorAddress + KPartialPageOffset, ESlabEmptyInfo, aCallbackFn, aContext, shouldContinue);
+		}
+
+	// DLA
+#define CHUNK_OVERHEAD (sizeof(TUint))
+#define CHUNK_ALIGN_MASK (7) 
+#define CHUNK2MEM(p)        ((TLinAddr)(p) + 8)
+#define MEM2CHUNK(mem)      ((TLinAddr)(p) - 8)
+/* chunk associated with aligned address A */
+#define ALIGN_OFFSET(A)\
+	((((TLinAddr)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\
+	((8 - ((TLinAddr)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))
+#define ALIGN_AS_CHUNK(A)   ((A) + ALIGN_OFFSET(CHUNK2MEM(A)))
+#define CINUSE_BIT 2
+#define INUSE_BITS 3
+
+	TUint32 topSize = 0;
+	err = ReadWord(iAllocatorAddress + KMallocStateOffset + KMallocStateTopSizeOffset, topSize);
+	if (err) return err;
+
+	TUint32 top = 0;
+	err = ReadWord(iAllocatorAddress + KMallocStateOffset + KMallocStateTopOffset, top);
+	if (err) return err;
+
+	TInt max = ((topSize-1) & ~CHUNK_ALIGN_MASK) - CHUNK_OVERHEAD;
+	if ( max < 0 )
+		max = 0;
+	
+	TBool shouldContinue = (*aCallbackFn)(*this, aContext, EDlaFreeCell, top, max);
+	if (!shouldContinue) return KErrNone;
+	
+	TUint32 mallocStateSegBase = 0;
+	err = ReadWord(iAllocatorAddress + KMallocStateOffset + KMallocStateSegOffset, mallocStateSegBase);
+	if (err) return err;
+
+	for (TLinAddr q = ALIGN_AS_CHUNK(mallocStateSegBase); q != top; /*q = NEXT_CHUNK(q)*/)
+		{
+		TUint32 qhead = 0;
+		err = ReadWord(q + 4, qhead);
+		if (err) return err;
+		//TInt sz = CHUNKSIZE(q);
+		TInt sz = qhead & ~(INUSE_BITS);
+		if (!(qhead & CINUSE_BIT))
+			{
+			//Walk(wi, CHUNK2MEM(q), sz, EGoodFreeCell, EDougLeaAllocator); // Introduce DL free buffer to the walk function 
+			shouldContinue = (*aCallbackFn)(*this, aContext, EDlaFreeCell, CHUNK2MEM(q), sz);
+			if (!shouldContinue) return KErrNone;
+			}
+		else
+			{
+			//Walk(wi, CHUNK2MEM(q), (sz- CHUNK_OVERHEAD), EGoodAllocatedCell, EDougLeaAllocator); // Introduce DL allocated buffer to the walk function 
+			TLinAddr addr = CHUNK2MEM(q);
+			TInt size = sz - CHUNK_OVERHEAD;
+			if (iAllocatorType == EUdebHybridHeap)
+				{
+				size -= 8;
+				addr += 8;
+				}
+			shouldContinue = (*aCallbackFn)(*this, aContext, EDlaAllocation, addr, size);
+			if (!shouldContinue) return KErrNone;
+			}
+		// This is q = NEXT_CHUNK(q) expanded
+		q = q + sz;
+		}
+	return KErrNone;
+	}
+
+TInt RAllocatorHelper::TreeWalk(TUint32 aSlabRoot, TInt aSlabType, TWalkFunc3 aCallbackFn, TAny* aContext, TBool& shouldContinue)
+	{
+	const TSlabType type = (TSlabType)aSlabType;
+
+	TUint32 s = 0;
+	TInt err = ReadWord(aSlabRoot, s);
+	if (err) return err;
+	//slab* s = *root;
+	if (!s)
+		return KErrNone;
+	
+	for (;;)
+		{
+		//slab* c;
+		//while ((c = s->iChild1) != 0)
+		//	s = c;		// walk down left side to end
+		TUint32 c;
+		for(;;)
+			{
+			err = ReadWord(s + KSlabChild1Offset, c);
+			if (err) return err;
+			if (c == 0) break;
+			else s = c;
+			}
+		for (;;)
+			{
+			//TODOf(s, i, wi);
+			//TODO __HEAP_CORRUPTED_TEST_STATIC
+			TUint32 h;
+			err = ReadWord(s, h); // = aSlab->iHeader;
+			if (err) return err;
+			TUint32 size = (h&0x0003f000)>>12; //SlabHeaderSize(h);
+			TUint debugheadersize = 0;
+			if (iAllocatorType == EUdebHybridHeap) debugheadersize = 8;
+			TUint32 usedCount = (((h&0x0ffc0000)>>18) + 4) / size; // (SlabHeaderUsedm4(h) + 4) / size;
+			switch (type)
+				{
+				case ESlabFullInfo:
+					{
+					TUint32 count = usedCount;
+					TUint32 i = 0;
+					while ( i < count )
+						{
+						TUint32 addr = s + KSlabPayloadOffset + i*size; //&aSlab->iPayload[i*size];
+						shouldContinue = (*aCallbackFn)(*this, aContext, ESlabAllocation, addr + debugheadersize, size - debugheadersize);
+						if (!shouldContinue) return KErrNone;
+						i++;
+						}
+					break;
+					}
+				case ESlabPartialInfo:
+					{
+					//TODO __HEAP_CORRUPTED_TEST_STATIC
+					TUint32 count = KMaxSlabPayload / size;
+					TUint32 freeOffset = (h & 0xff) << 2;
+					if (freeOffset == 0)
+						{
+						// TODO Shouldn't happen for a slab on the partial list
+						}
+					memset(iTempSlabBitmap, 1, KTempBitmapSize); // Everything defaults to in use
+					TUint wildernessCount = count - usedCount;
+					while (freeOffset)
+						{
+						wildernessCount--;
+						TInt idx = (freeOffset-KSlabPayloadOffset)/size;
+						LOG("iTempSlabBitmap freeOffset %d index %d", freeOffset, idx);
+						iTempSlabBitmap[idx] = 0; // Mark it as free
+
+						TUint32 addr = s + freeOffset;
+						TUint8 nextCell = 0;
+						err = ReadByte(addr, nextCell);
+						if (err) return err;
+						freeOffset = ((TUint32)nextCell) << 2;
+						}
+					memset(iTempSlabBitmap + count - wildernessCount, 0, wildernessCount); // Mark the wilderness as free
+					for (TInt i = 0; i < count; i++)
+						{
+						TLinAddr addr = s + KSlabPayloadOffset + i*size;
+						if (iTempSlabBitmap[i])
+							{
+							// In use
+							shouldContinue = (*aCallbackFn)(*this, aContext, ESlabAllocation, addr + debugheadersize, size - debugheadersize);
+							}
+						else
+							{
+							// Free
+							shouldContinue = (*aCallbackFn)(*this, aContext, ESlabFreeCell, addr, size);
+							}
+						if (!shouldContinue) return KErrNone;
+						}
+					break;
+					}
+				case ESlabEmptyInfo:
+					{
+					// Check which slabs of this page are empty
+					TUint32 pageAddr = ROUND_DOWN(s, KPageSize);
+					TUint32 headerForPage = 0;
+					err = ReadWord(pageAddr, headerForPage);
+					if (err) return err;
+					TUint32 slabHeaderPageMap = (headerForPage & 0x00000f00)>>8; // SlabHeaderPagemap(unsigned h)
+					for (TInt slabIdx = 0; slabIdx < 4; slabIdx++)
+						{
+						if (slabHeaderPageMap & (1<<slabIdx))
+							{
+							TUint32 addr = pageAddr + SLABSIZE*slabIdx + KSlabPayloadOffset; //&aSlab->iPayload[i*size];
+							shouldContinue = (*aCallbackFn)(*this, aContext, ESlabFreeSlab, addr, KMaxSlabPayload);
+							if (!shouldContinue) return KErrNone;
+							}
+						}
+					break;
+					}
+				}
+
+			//c = s->iChild2;
+			err = ReadWord(s + KSlabChild2Offset, c);
+			if (err) return err;
+
+			if (c)
+				{	// one step down right side, now try and walk down left
+				s = c;
+				break;
+				}
+			for (;;)
+				{	// loop to walk up right side
+				TUint32 pp = 0;
+				err = ReadWord(s + KSlabParentOffset, pp);
+				if (err) return err;
+				//slab** pp = s->iParent;
+				if (pp == aSlabRoot)
+					return KErrNone;
+#define SlabFor(x) ROUND_DOWN(x, SLABSIZE)
+				s = SlabFor(pp);
+				//if (pp == &s->iChild1)
+				if (pp == s + KSlabChild1Offset)
+					break;
+				}
+			}
+		}
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::SizeForCellType(TExtendedCellType aType)
+	{
+	if (aType & EBadnessMask) return KErrArgument;
+	if (aType == EAllocationMask) return AllocatedSize();
+
+	if (iAllocatorType == EUdebOldRHeap || iAllocatorType == EUrelOldRHeap)
+		{
+		switch (aType)
+			{
+			case EHeapAllocation:
+				return AllocatedSize();
+			case EHeapFreeCell:
+			case EFreeMask:
+				return CommittedFreeSpace();
+			default:
+				return KErrNotSupported;
+			}
+		}
+	else if (iAllocatorType == EUrelHybridHeap || iAllocatorType == EUdebHybridHeap)
+		{
+		TInt err = CheckValid(EHybridStats);
+		if (err) return err;
+
+		switch (aType)
+			{
+			case EHeapAllocation:
+			case EHeapFreeCell:
+				return KErrNotSupported;
+			case EDlaAllocation:
+				return iInfo->iDlaAllocsSize;
+			case EPageAllocation:
+				return iInfo->iPageAllocsSize;
+			case ESlabAllocation:
+				return iInfo->iSlabAllocsSize;
+			case EDlaFreeCell:
+				return iInfo->iDlaFreeSize;
+			case ESlabFreeCell:
+				return iInfo->iSlabFreeCellSize;
+			case ESlabFreeSlab:
+				return iInfo->iSlabFreeSlabSize;
+			case EFreeMask:
+				// Note this isn't the same as asking for CommittedFreeSpace(). SizeForCellType(EFreeMask) may include decommitted pages that lie inside a free cell
+				return iInfo->iDlaFreeSize + iInfo->iSlabFreeCellSize + iInfo->iSlabFreeSlabSize;
+			default:
+				return KErrNotSupported;
+			}
+		}
+	else
+		{
+		return KErrNotSupported;
+		}
+	}
+
+HUEXPORT_C TInt RAllocatorHelper::CountForCellType(TExtendedCellType aType)
+	{
+	if (aType & EBadnessMask) return KErrArgument;
+	if (aType == EAllocationMask) return AllocationCount();
+
+	if (iAllocatorType == EUdebOldRHeap || iAllocatorType == EUrelOldRHeap)
+		{
+		switch (aType)
+			{
+			case EHeapAllocation:
+				return AllocationCount();
+			case EHeapFreeCell:
+			case EFreeMask:
+				{
+				TInt err = CheckValid(ECommittedFreeSpace);
+				if (err) return err;
+				return iInfo->iHeapFreeCellCount;
+				}
+			default:
+				return KErrNotSupported;
+			}
+		}
+	else if (iAllocatorType == EUrelHybridHeap || iAllocatorType == EUdebHybridHeap)
+		{
+		TInt err = CheckValid(EHybridStats);
+		if (err) return err;
+
+		switch (aType)
+			{
+			case EHeapAllocation:
+			case EHeapFreeCell:
+				return KErrNotSupported;
+			case EDlaAllocation:
+				return iInfo->iDlaAllocsCount;
+			case EPageAllocation:
+				return iInfo->iPageAllocsCount;
+			case ESlabAllocation:
+				return iInfo->iSlabAllocsCount;
+			case EDlaFreeCell:
+				return iInfo->iDlaFreeCount;
+			case ESlabFreeCell:
+				return iInfo->iSlabFreeCellCount;
+			case ESlabFreeSlab:
+				return iInfo->iSlabFreeSlabCount;
+			case EFreeMask:
+				// This isn't a hugely meaningful value, but if that's what they asked for...
+				return iInfo->iDlaFreeCount + iInfo->iSlabFreeCellCount + iInfo->iSlabFreeSlabCount;
+			default:
+				return KErrNotSupported;
+			}
+		}
+	else
+		{
+		return KErrNotSupported;
+		}
+	}
+
+HUEXPORT_C TBool LtkUtils::RAllocatorHelper::AllocatorIsUdeb() const
+	{
+	return iAllocatorType == EUdebOldRHeap || iAllocatorType == EUdebHybridHeap;
+	}
+
+
+HUEXPORT_C const TDesC& LtkUtils::RAllocatorHelper::Description() const
+	{
+	_LIT(KRHeap, "RHeap");
+	_LIT(KRHybridHeap, "RHybridHeap");
+	_LIT(KUnknown, "Unknown");
+	switch (iAllocatorType)
+		{
+		case EUrelOldRHeap:
+		case EUdebOldRHeap:
+			return KRHeap;
+		case EUrelHybridHeap:
+		case EUdebHybridHeap:
+			return KRHybridHeap;
+		case EAllocator:
+		case EUnknown:
+		default:
+			return KUnknown;
+		}
+	}
+
+#ifdef __KERNEL_MODE__
+
+DChunk* LtkUtils::RAllocatorHelper::OpenUnderlyingChunk()
+	{
+	// Enter and leave in CS and with no locks held. On exit the returned DChunk has been Open()ed.
+	TInt err = iChunk->Open();
+	if (err) return NULL;
+	return iChunk;
+	}
+
+DChunk* LtkUtils::RKernelSideAllocatorHelper::OpenUnderlyingChunk()
+	{
+	if (iAllocatorType != EUrelOldRHeap && iAllocatorType != EUdebOldRHeap && iAllocatorType != EUrelHybridHeap && iAllocatorType != EUdebHybridHeap) return NULL;
+	// Note RKernelSideAllocatorHelper doesn't use or access RAllocatorHelper::iChunk, because we figure out the chunk handle in a different way.
+	// It is for this reason that iChunk is private, to remove temptation
+	
+	// Enter and leave in CS and with no locks held. On exit the returned DChunk has been Open()ed.
+	TUint32 chunkHandle = 0;
+	TInt err = ReadData(iAllocatorAddress + _FOFF(RHackHeap, iChunkHandle), &chunkHandle, sizeof(TUint32));
+	if (err) return NULL;
+
+	NKern::LockSystem();
+	DChunk* result = (DChunk*)Kern::ObjectFromHandle(iThread, chunkHandle, EChunk);
+	if (result && result->Open() != KErrNone)
+		{
+		result = NULL;
+		}
+	NKern::UnlockSystem();
+	return result;
+	}
+
+LtkUtils::RAllocatorHelper::TType LtkUtils::RAllocatorHelper::GetType() const
+	{
+	switch (iAllocatorType)
+		{
+		case EUrelOldRHeap:
+		case EUdebOldRHeap:
+			return ETypeRHeap;
+		case EUrelHybridHeap:
+		case EUdebHybridHeap:
+			return ETypeRHybridHeap;
+		case EAllocator:
+		case EUnknown:
+		default:
+			return ETypeUnknown;
+		}
+	}
+
+#else
+
+TInt LtkUtils::RAllocatorHelper::EuserIsUdeb()
+	{
+	TAny* buf = User::Alloc(4096);
+	if (!buf) return KErrNoMemory;
+	RAllocator* dummyHeap = UserHeap::FixedHeap(buf, 4096, 4, ETrue);
+	if (!dummyHeap) return KErrNoMemory; // Don't think this can happen
+
+	dummyHeap->__DbgSetAllocFail(RAllocator::EFailNext, 1);
+	TAny* ptr = dummyHeap->Alloc(4);
+	// Because we specified singleThreaded=ETrue we can allow dummyHeap to just go out of scope here
+	User::Free(buf);
+
+	if (ptr)
+		{
+		// Clearly the __DbgSetAllocFail had no effect so we must be urel
+		// We don't need to free ptr because it came from the dummy heap
+		return EFalse;
+		}
+	else
+		{
+		return ETrue;
+		}
+	}
+
+#ifndef STANDALONE_ALLOCHELPER
+
+#include <fshell/ltkutils.h>
+HUEXPORT_C void LtkUtils::MakeHeapCellInvisible(TAny* aCell)
+	{
+	RAllocatorHelper helper;
+	TInt err = helper.Open(&User::Allocator());
+	if (err == KErrNone)
+		{
+		helper.SetCellNestingLevel(aCell, -1);
+		helper.Close();
+		}
+	}
+#endif // STANDALONE_ALLOCHELPER
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/Driver/Shared/heaputils.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,216 @@
+// heaputils.h
+// 
+// Copyright (c) 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+
+#ifndef FSHELL_HEAP_UTILS_H
+#define FSHELL_HEAP_UTILS_H
+
+#include <e32cmn.h>
+
+#ifdef __KERNEL_MODE__
+class DThread;
+class DChunk;
+#else
+class RMemoryAccess;
+#endif // __KERNEL_MODE__
+
+#if defined(STANDALONE_ALLOCHELPER) || defined(__KERNEL_MODE__)
+#define HUIMPORT_C
+#define HUCLASS(x) NONSHARABLE_CLASS(x)
+#else
+#define HUIMPORT_C IMPORT_C
+#define HUCLASS(x) class x
+#endif
+
+namespace LtkUtils
+	{
+
+class THeapInfo;
+	
+HUCLASS(RAllocatorHelper) // class RAllocatorHelper
+	{
+public:
+	HUIMPORT_C RAllocatorHelper();
+#ifdef __KERNEL_MODE__
+	TInt OpenKernelHeap();
+#else
+	HUIMPORT_C TInt Open(RAllocator* aAllocator);
+#endif
+	HUIMPORT_C TInt SetCellNestingLevel(TAny* aCell, TInt aNestingLevel);
+	HUIMPORT_C TInt GetCellNestingLevel(TAny* aCell, TInt& aNestingLevel);
+	HUIMPORT_C TInt AllocCountForCell(TAny* aCell) const;
+	HUIMPORT_C TLinAddr AllocatorAddress() const;
+	HUIMPORT_C TInt RefreshDetails();
+	
+	HUIMPORT_C TInt CommittedSize();
+	HUIMPORT_C TInt AllocatedSize();
+	HUIMPORT_C TInt AllocationCount();
+	HUIMPORT_C TInt MaxCommittedSize();
+	HUIMPORT_C TInt MinCommittedSize();
+	HUIMPORT_C TInt CountUnusedPages();
+	HUIMPORT_C TInt CommittedFreeSpace();
+
+	enum TCellType
+		{
+		EAllocation, EFreeSpace, EBadness
+		};
+
+	enum TExtendedCellType
+		{
+		EAllocationMask = 0xFF,
+		EFreeMask = 0xFF00,
+		EBadnessMask = 0xFF000000,
+
+		EHeapAllocation = 1,
+		EDlaAllocation = 2,
+		EPageAllocation = 3,
+		ESlabAllocation = 4,
+		
+		EHeapFreeCell = 0x0100,
+		EDlaFreeCell = 0x0200,
+		// There is nothing 'free' in the page allocator
+		ESlabFreeCell = 0x0300, // Used to track free cells in partially-filled slabs
+		ESlabFreeSlab = 0x0400, // Used to track entirely empty slabs (that don't have a specific cell size)
+
+		EHeapBadFreeCellAddress = 0x01000000,
+		EHeapBadFreeCellSize = 0x02000000,
+		EHeapBadAllocatedCellSize = 0x03000000,
+		EHeapBadAllocatedCellAddress = 0x04000000,
+		};
+			
+	// TBool WalkFunc(TAny* aContext, TCellType aCellType, TLinAddr aCellPtr, TInt aCellLength)
+	// aCellPtr points to the start of the cell payload for allocated cells (unlike RHeap's walker, which points to the cell header)
+	// aCellLength is the payload length, ie what AllocLen(aCellPtr) would return
+	// return ETrue to continue walking, EFalse to stop the walk
+	typedef TBool (*TWalkFunc)(TAny*, TCellType, TLinAddr, TInt);
+	typedef TBool (*TWalkFunc2)(RAllocatorHelper&, TAny*, TCellType, TLinAddr, TInt);
+	typedef TBool (*TWalkFunc3)(RAllocatorHelper&, TAny*, TExtendedCellType, TLinAddr, TInt);
+	HUIMPORT_C TInt Walk(TWalkFunc aCallbackFn, TAny* aContext);
+	HUIMPORT_C TInt Walk(TWalkFunc2 aCallbackFn, TAny* aContext); // Like the other but the walk func gives you the RAllocatorHelper pointer too
+	HUIMPORT_C TInt Walk(TWalkFunc3 aCallbackFn, TAny* aContext); // Like the other but the walk func gives you more details about the allocation type
+	HUIMPORT_C TInt SizeForCellType(TExtendedCellType aType);
+	HUIMPORT_C TInt CountForCellType(TExtendedCellType aType);
+	HUIMPORT_C TBool AllocatorIsUdeb() const;
+	HUIMPORT_C const TDesC& Description() const;
+	HUIMPORT_C virtual void Close();
+
+#ifdef __KERNEL_MODE__
+	virtual DChunk* OpenUnderlyingChunk(); // Must be in CS
+	enum TType
+		{
+		ETypeUnknown,
+		ETypeRHeap,
+		ETypeRHybridHeap,
+		};
+	TType GetType() const; // This is for information only, nothing should care about the return value
+#endif
+
+protected:
+	TInt FinishConstruction();
+	TInt IdentifyAllocatorType(TBool aAllocatorIsUdeb);
+	TInt OpenChunkHeap(TLinAddr aChunkBase, TInt aChunkMaxSize);
+#ifndef __KERNEL_MODE__
+	static TInt EuserIsUdeb();
+#endif
+	virtual TInt ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const;
+	virtual TInt WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize);
+	virtual TInt TryLock();
+	virtual void TryUnlock();
+
+private:
+	TInt ReadWord(TLinAddr aLocation, TUint32& aResult) const;
+	TInt ReadByte(TLinAddr aLocation, TUint8& aResult) const;
+	TInt WriteWord(TLinAddr aLocation, TUint32 aWord);
+	TInt RefreshDetails(TUint aMask);
+	TInt DoRefreshDetails(TUint aMask);
+	TInt CheckValid(TUint aMask);
+	TInt DoWalk(TWalkFunc3 aCallbackFn, TAny* aContext);
+	TInt OldSkoolWalk(TWalkFunc3 aCallbackFn, TAny* aContext);
+	TInt NewHotnessWalk(TWalkFunc3 aCallbackFn, TAny* aContext);
+	static TBool DispatchClientWalkCallback(RAllocatorHelper& aHelper, TAny* aContext, TExtendedCellType aCellType, TLinAddr aCellPtr, TInt aCellLength);
+	static TBool WalkForStats(RAllocatorHelper& aSelf, TAny* aContext, TExtendedCellType aType, TLinAddr aCellPtr, TInt aCellLength);
+	TUint PageMapOperatorBrackets(unsigned ix, TInt& err) const;
+	TInt PageMapFind(TUint start, TUint bit, TInt& err);
+	TUint PageMapBits(unsigned ix, unsigned len, TInt& err);
+	TUint PagedDecode(TUint pos, TInt& err);
+	TInt TreeWalk(TUint32 aSlabRoot, TInt aSlabType, TWalkFunc3 aCallbackFn, TAny* aContext, TBool& shouldContinue);
+protected:
+	TLinAddr iAllocatorAddress;
+	enum TAllocatorType
+		{
+		EUnknown,
+		EAllocator,
+		EUrelOldRHeap,
+		EUdebOldRHeap,
+		EUrelHybridHeap,
+		EUdebHybridHeap,
+		};
+	TAllocatorType iAllocatorType;
+private:
+	THeapInfo* iInfo;
+	TUint iValidInfo;
+	TUint8* iTempSlabBitmap;
+	mutable TAny* iPageCache;
+	mutable TLinAddr iPageCacheAddr;
+#ifdef __KERNEL_MODE__
+	DChunk* iChunk;
+	//TUint iSpare[0];
+#else
+	TUint iSpare[1];
+#endif
+	};
+
+#ifdef __KERNEL_MODE__
+
+class RKernelSideAllocatorHelper : public RAllocatorHelper
+	{
+public:
+	RKernelSideAllocatorHelper();
+	TInt OpenUserHeap(TUint aThreadId, TLinAddr aAllocatorAddress, TBool aEuserIsUdeb);
+	virtual DChunk* OpenUnderlyingChunk(); // Must be in CS
+	virtual void Close();
+
+protected:
+	virtual TInt ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const;
+	virtual TInt WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize);
+	virtual TInt TryLock();
+	virtual void TryUnlock();
+private:
+	DThread* iThread;
+	};
+
+#else
+
+class RProxyAllocatorHelper : public RAllocatorHelper
+	{
+public:
+	HUIMPORT_C RProxyAllocatorHelper();
+	HUIMPORT_C TInt Open(RMemoryAccess& aMem, TUint aThreadId);
+	HUIMPORT_C TInt OpenChunkHeap(RMemoryAccess& aMem, TAny* aDChunkPtr);
+	HUIMPORT_C virtual void Close();
+
+protected:
+	virtual TInt ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const;
+	virtual TInt WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize);
+	virtual TInt TryLock();
+	virtual void TryUnlock();
+
+private:
+	RMemoryAccess* iMemoryAccess;
+	TUint iThreadId;
+	};
+
+#endif // __KERNEL_MODE__
+
+	} // namespace LtkUtils
+
+#endif
--- a/memspy/Driver/User/Include/RBuildQueryableHeap.h	Thu Aug 19 11:25:43 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/*
-* 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 RBUILDQUERYABLEHEAP_H
-#define RBUILDQUERYABLEHEAP_H
-
-// System includes
-#include <e32cmn.h>
-
-// User includes
-#include <memspy/driver/memspydriverenumerationsshared.h>
-
-
-class RBuildQueryableHeap : public RHeap
-    {
-public: // API
-    TBool IsDebugEUser() const;
-    TInt CellHeaderSize( TMemSpyDriverCellType aType ) const;
-    };
-
-
-
-#endif
--- a/memspy/Driver/User/Source/MemSpyDriverClient.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/User/Source/MemSpyDriverClient.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -22,11 +22,11 @@
 
 // User includes
 #include "MemSpyDriverOpCodes.h"
-#include "RBuildQueryableHeap.h"
 #include <memspy/driver/memspydriverconstants.h>
 #include <memspy/driver/memspydriverobjectsshared.h>
 #include "MemSpyDriverStreamReaderImp.h"
 #include "MemSpyDriverObjectsInternal.h"
+#include "heaputils.h"
 
 // Constants
 const TInt KMemSpyClientBufferGrowSize = 0x1000 * 8; // 32kb
@@ -511,7 +511,7 @@
             TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
             TMemSpyHeapMetaDataRHeap& metaData = rHeapInfo.MetaData();
             metaData.SetVTable( RHeapVTable() );
-            metaData.SetClassSize( sizeof( RHeap ) );
+            //metaData.SetClassSize( sizeof( RHeap ) );
             }
         }
     else if ( r == KErrNotSupported )
@@ -523,9 +523,14 @@
 	return r;
     }
 
+EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoUser( TMemSpyHeapInfo& aInfo, TUint aTid, RArray< TMemSpyDriverFreeCell >& aFreeCells )
+	{
+	return GetHeapInfoUser(aInfo, aTid, aFreeCells, EFalse);
+	}
 
-EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoUser( TMemSpyHeapInfo& aInfo, TUint aTid, RArray< TMemSpyDriverFreeCell >& aFreeCells )
-    {
+// For the record I don't think this function should be exported, but since the one above was I'm going with the flow. -TomS
+EXPORT_C TInt RMemSpyDriverClient::GetHeapInfoUser(TMemSpyHeapInfo& aInfo, TUint aTid, RArray<TMemSpyDriverCell>& aCells, TBool aCollectAllocatedCellsAsWellAsFree)
+	{
     TMemSpyDriverInternalHeapRequestParameters params;
     //
     params.iTid = aTid;
@@ -533,8 +538,10 @@
     params.iDebugAllocator = DebugEUser();
     params.iMasterInfo = &aInfo;
     params.iBuildFreeCellList = ETrue;
+	params.iBuildAllocCellList = aCollectAllocatedCellsAsWellAsFree;
+
     //
-    aFreeCells.Reset();
+    aCells.Reset();
     ResetStreamBuffer();
 	TInt r = DoControl( EMemSpyDriverOpCodeHeapInfoGetUser, &params );
 	//
@@ -548,7 +555,7 @@
             TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
             TMemSpyHeapMetaDataRHeap& metaData = rHeapInfo.MetaData();
             metaData.SetVTable( RHeapVTable() );
-            metaData.SetClassSize( sizeof( RHeap ) );
+            //metaData.SetClassSize( sizeof( RHeap ) );
             }
 
         // Resize transfer buffer to make room for free cells. We only make the buffer
@@ -561,10 +568,10 @@
         // Now fetch the heap data
         if  ( r == KErrNone )
             {
-            r = DoControl( EMemSpyDriverOpCodeHeapInfoFetchFreeCells, &iBuffer );
+            r = DoControl( EMemSpyDriverOpCodeHeapInfoFetchCellList, &iBuffer );
             if  ( r == KErrNone )
                 {
-                TRAP( r, ReadHeapInfoFreeCellsFromXferBufferL( aFreeCells ) );
+                TRAP( r, ReadHeapInfoFreeCellsFromXferBufferL( aCells ) );
                 }
             }
         }
@@ -663,6 +670,7 @@
     params.iDes = &aDest;
     params.iChecksum = aFreeCellChecksum;
     params.iRemaining = -1;
+	params.iReadAddress = 0;
     aDest.Zero();
     //
 	TInt r = DoControl( EMemSpyDriverOpCodeHeapDataGetUser, &params, NULL );
@@ -688,6 +696,7 @@
     params.iDes = &aDest;
     params.iChecksum = 0;
     params.iRemaining = aAmountRemaining;
+	params.iReadAddress = aReadAddress;
     aDest.Zero();
     //
 	TInt r = DoControl( EMemSpyDriverOpCodeHeapDataGetUser, &params, NULL );
@@ -790,7 +799,7 @@
 
 EXPORT_C TInt RMemSpyDriverClient::WalkHeapNextCell( TUint aTid, TMemSpyDriverCellType& aCellType, TAny*& aCellAddress, TInt& aLength, TInt& aNestingLevel, TInt& aAllocNumber, TInt& aCellHeaderSize, TAny*& aCellPayloadAddress )
     {
-    aCellType = EMemSpyDriverGoodAllocatedCell;
+    aCellType = EMemSpyDriverBadCellMask;
     aCellAddress = NULL;
     aLength = 0;
     aNestingLevel = 0;
@@ -803,14 +812,11 @@
     //
 	if  ( r == KErrNone )
 	    {
-        RBuildQueryableHeap* heap = static_cast< RBuildQueryableHeap* >( &User::Allocator() );
-        //
         aCellType = (TMemSpyDriverCellType) params.iCellType;
         aCellAddress = params.iCellAddress;
         aLength = params.iLength;
         aNestingLevel = params.iNestingLevel;
         aAllocNumber = params.iAllocNumber;
-        aCellHeaderSize = heap->CellHeaderSize( aCellType );
         aCellPayloadAddress = ((TUint8*) aCellAddress) + aCellHeaderSize;
         }
     //
@@ -839,7 +845,7 @@
 
 EXPORT_C TInt RMemSpyDriverClient::WalkHeapGetCellInfo( TAny*& aCellAddress, TMemSpyDriverCellType& aCellType, TInt& aLength, TInt& aNestingLevel, TInt& aAllocNumber, TInt& aCellHeaderSize, TAny*& aCellPayloadAddress )
     {
-    aCellType = EMemSpyDriverGoodAllocatedCell;
+    aCellType = EMemSpyDriverBadCellMask;
     aLength = 0;
     aNestingLevel = 0;
     aAllocNumber = 0;
@@ -851,14 +857,11 @@
     //
 	if  ( r == KErrNone )
 	    {
-        RBuildQueryableHeap* heap = static_cast< RBuildQueryableHeap* >( &User::Allocator() );
-        //
         aCellAddress = params.iCellAddress;
         aCellType = (TMemSpyDriverCellType) params.iCellType;
         aLength = params.iLength;
         aNestingLevel = params.iNestingLevel;
         aAllocNumber = params.iAllocNumber;
-        aCellHeaderSize = heap->CellHeaderSize( aCellType );
         aCellPayloadAddress = ((TUint8*) aCellAddress) + aCellHeaderSize;
         }
     //
@@ -1401,10 +1404,15 @@
 
 TBool RMemSpyDriverClient::DebugEUser()
     {
-    RHeap* heap = static_cast< RHeap* >( &User::Allocator() );
-    RBuildQueryableHeap* queryHeap = static_cast< RBuildQueryableHeap* >( heap );
-    const TBool isDebugEUser = queryHeap->IsDebugEUser();
-    return isDebugEUser;
+	LtkUtils::RAllocatorHelper allocHelper;
+	TBool result = EFalse;
+	TInt err = allocHelper.Open(&User::Allocator());
+	if (!err)
+		{
+		result = allocHelper.AllocatorIsUdeb();
+		allocHelper.Close();
+		}
+	return result;
     }
 
 
@@ -1435,7 +1443,7 @@
         for( TInt i=0; i<count; i++ )
             {
             TMemSpyDriverFreeCell entry;
-            entry.iType = stream.ReadInt32L();
+            entry.iType = (TMemSpyDriverCellType)stream.ReadInt32L();
             entry.iAddress = reinterpret_cast< TAny* >( stream.ReadUint32L() );
             entry.iLength = stream.ReadInt32L();
             aFreeCells.AppendL( entry );
@@ -1462,10 +1470,11 @@
     {
 #if defined( _DEBUG ) && !defined( __WINS__ )
     const TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
-    const TMemSpyHeapObjectDataRHeap& rHeapObjectData = rHeapInfo.ObjectData();
+    //const TMemSpyHeapObjectDataRHeap& rHeapObjectData = rHeapInfo.ObjectData();
     const TMemSpyHeapStatisticsRHeap& rHeapStats = rHeapInfo.Statistics();
     const TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
 
+	/*
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RAllocator                                      -");
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
@@ -1501,6 +1510,7 @@
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iRand:                   %d", rHeapObjectData.iRand);
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - RHeap::iTestData:               0x%08x", rHeapObjectData.iTestData);
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - ");
+	*/
 
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - Stats (Free)                                    -");
@@ -1524,12 +1534,6 @@
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - ");
 
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
-    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - Stats (Common)                                  -");
-    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
-    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - total cell count:               %d", rHeapStats.StatsCommon().TotalCellCount());
-    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - ");
-
-    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - Misc. Info                                      -");
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() ---------------------------------------------------");
     const TPtrC chunkName( rHeapMetaData.ChunkName() );
@@ -1542,8 +1546,8 @@
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - user thread:                    %d", rHeapMetaData.IsUserThread() );
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - thread id:                      %d", aInfo.Tid() );
     RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - process id:                     %d", aInfo.Pid() );
-    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell header size (free):        %d", rHeapMetaData.HeaderSizeFree());
-    RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell header size (alloc):       %d", rHeapMetaData.HeaderSizeAllocated());
+    //RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell header size (free):        %d", rHeapMetaData.HeaderSizeFree());
+    //RDebug::Printf("RMemSpyDriverClient::PrintHeapInfo() - cell header size (alloc):       %d", rHeapMetaData.HeaderSizeAllocated());
 #else
     (void) aInfo;
 #endif
--- a/memspy/Driver/User/Source/RBuildQueryableHeap.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#include "RBuildQueryableHeap.h"
-
-// System includes
-#include <e32std.h>
-#include <e32debug.h>
-
-
-TBool RBuildQueryableHeap::IsDebugEUser() const
-    {
-    User::__DbgSetAllocFail( FALSE, RAllocator::EFailNext, 1);
-
-    TInt* cell = new TInt();
-#if defined(_DEBUG) && !defined( __WINS__ )
-    RDebug::Printf("RBuildQueryableHeap::IsDebugEUser() - cell: 0x%08x", cell);
-#endif
-
-    const TBool debugEUser = ( cell == NULL );
-#if defined(_DEBUG) && !defined( __WINS__ )
-    RDebug::Printf("RBuildQueryableHeap::IsDebugEUser() - debugEUser: %d", debugEUser);
-#endif
-
-    delete cell;
-    //
-    return debugEUser;
-    }
-
-
-TInt RBuildQueryableHeap::CellHeaderSize( TMemSpyDriverCellType aType ) const
-    {
-	TInt size = 0;
-	//
-	switch( aType )
-	{
-	case EMemSpyDriverGoodAllocatedCell:
-	case EMemSpyDriverBadAllocatedCellSize:
-	case EMemSpyDriverBadAllocatedCellAddress:
-		{
-		size = sizeof( TInt ); // Allocated UREL cells contain just a length
-		if  ( IsDebugEUser() )
-			{
-			size = sizeof( RHeap::SDebugCell );
-			}
-		break;
-		}
-	case EMemSpyDriverGoodFreeCell:
-	case EMemSpyDriverBadFreeCellAddress:
-	case EMemSpyDriverBadFreeCellSize:
-		size = EFreeCellSize;
-		break;
-	default:
-		break;
-	}
-    //
-    return size;
-    }
-
--- a/memspy/Driver/eabi/memspydriverclientu.def	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/eabi/memspydriverclientu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -67,4 +67,5 @@
 	_ZN22RMemSpyMemStreamReader5ReadLER6TDes16 @ 66 NONAME
 	_ZN19RMemSpyDriverClient26GetCondVarSuspendedThreadsEPvPS0_Ri @ 67 NONAME
 	_ZN19RMemSpyDriverClient29GetCondVarSuspendedThreadInfoEPvR39TMemSpyDriverCondVarSuspendedThreadInfo @ 68 NONAME
+	_ZN19RMemSpyDriverClient15GetHeapInfoUserER15TMemSpyHeapInfojR6RArrayI21TMemSpyDriverFreeCellEi @ 69 NONAME
 
--- a/memspy/Driver/group/MemSpyDriver.mmp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/group/MemSpyDriver.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -69,6 +69,11 @@
 USERINCLUDE     ../Kernel/Include
 USERINCLUDE     ../Kernel/Include/SubChannels
 
+// New Allocator support
+MACRO			STANDALONE_ALLOCHELPER
+SOURCEPATH      ../Shared
+SOURCE          heaputils.cpp
+
 OS_LAYER_KERNEL_SYSTEMINCLUDE
 
 START WINS
--- a/memspy/Driver/group/MemSpyDriverClient.mmp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Driver/group/MemSpyDriverClient.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -29,7 +29,6 @@
 
 SOURCEPATH				../User/Source
 SOURCE					MemSpyDriverClient.cpp
-SOURCE					RBuildQueryableHeap.cpp
 SOURCE					MemSpyDriverStreamReader.cpp
 SOURCE					MemSpyDriverStreamReaderImp.cpp
 
@@ -40,6 +39,10 @@
 
 LIBRARY					euser.lib efsrv.lib
 
+// New Allocator support
+MACRO			STANDALONE_ALLOCHELPER
+SOURCEPATH      ../Shared
+SOURCE          heaputils.cpp
 
 
 
--- a/memspy/Engine/BWINS/MemSpyEngineu.def	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/BWINS/MemSpyEngineu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -384,24 +384,44 @@
 	?Type@CMemSpyThreadInfoItemBase@@QBE?AW4TMemSpyThreadInfoItemType@@XZ @ 383 NONAME ; enum TMemSpyThreadInfoItemType CMemSpyThreadInfoItemBase::Type(void) const
 	?TypeAsString@CMemSpyEngineGenericKernelObjectList@@SA?AVTPtrC16@@W4TMemSpyDriverContainerType@@@Z @ 384 NONAME ; class TPtrC16 CMemSpyEngineGenericKernelObjectList::TypeAsString(enum TMemSpyDriverContainerType)
 	?VID@CMemSpyProcess@@QBEKXZ @ 385 NONAME ; unsigned long CMemSpyProcess::VID(void) const
-	?MdcaCount@CMemSpyEngineWindowGroupList@@UBEHXZ @ 386 NONAME ABSENT ; int CMemSpyEngineWindowGroupList::MdcaCount(void) const
-	?GetWindowGroupListL@CMemSpyEngineHelperWindowServer@@QAEXAAV?$RArray@VTMemSpyEngineWindowGroupInfo@@@@@Z @ 387 NONAME ABSENT ; void CMemSpyEngineHelperWindowServer::GetWindowGroupListL(class RArray<class TMemSpyEngineWindowGroupInfo> &)
-	??1CMemSpyEngineWindowGroupList@@UAE@XZ @ 388 NONAME ABSENT ; CMemSpyEngineWindowGroupList::~CMemSpyEngineWindowGroupList(void)
-	?Count@CMemSpyEngineWindowGroupList@@QBEHXZ @ 389 NONAME ABSENT ; int CMemSpyEngineWindowGroupList::Count(void) const
-	?ItemIndex@CMemSpyEngineWindowGroupList@@QBEHABVTMemSpyEngineWindowGroupInfo@@@Z @ 390 NONAME ABSENT ; int CMemSpyEngineWindowGroupList::ItemIndex(class TMemSpyEngineWindowGroupInfo const &) const
-	?WindowGroupListL@CMemSpyEngineHelperWindowServer@@QAEPAVCMemSpyEngineWindowGroupList@@XZ @ 391 NONAME ABSENT ; class CMemSpyEngineWindowGroupList * CMemSpyEngineHelperWindowServer::WindowGroupListL(void)
-	?HelperWindowServer@CMemSpyEngine@@QAEAAVCMemSpyEngineHelperWindowServer@@XZ @ 392 NONAME ABSENT ; class CMemSpyEngineHelperWindowServer & CMemSpyEngine::HelperWindowServer(void)
-	?MdcaPoint@CMemSpyEngineWindowGroupList@@UBE?AVTPtrC16@@H@Z @ 393 NONAME ABSENT ; class TPtrC16 CMemSpyEngineWindowGroupList::MdcaPoint(int) const
-	?At@CMemSpyEngineWindowGroupList@@QBEABVTMemSpyEngineWindowGroupInfo@@H@Z @ 394 NONAME ABSENT ; class TMemSpyEngineWindowGroupInfo const & CMemSpyEngineWindowGroupList::At(int) const
-	?ItemIndex@CMemSpyEngineWindowGroupList@@QBEHABVTMemSpyEngineWindowGroupBasicInfo@@@Z @ 395 NONAME ABSENT ; int CMemSpyEngineWindowGroupList::ItemIndex(class TMemSpyEngineWindowGroupBasicInfo const &) const
-	?At@CMemSpyEngineWindowGroupList@@QBEABVTMemSpyEngineWindowGroupBasicInfo@@H@Z @ 396 NONAME ABSENT ; class TMemSpyEngineWindowGroupBasicInfo const & CMemSpyEngineWindowGroupList::At(int) const
-	?GetWindowGroupListL@CMemSpyEngineHelperWindowServer@@QAEXAAV?$RArray@VTMemSpyEngineWindowGroupBasicInfo@@@@@Z @ 397 NONAME ABSENT ; void CMemSpyEngineHelperWindowServer::GetWindowGroupListL(class RArray<class TMemSpyEngineWindowGroupBasicInfo> &)
-	?GetWindowGroupDetailsL@CMemSpyEngineHelperWindowServer@@QAEXHAAVTMemSpyEngineWindowGroupDetails@@@Z @ 398 NONAME ABSENT ; void CMemSpyEngineHelperWindowServer::GetWindowGroupDetailsL(int, class TMemSpyEngineWindowGroupDetails &)
-	?SwitchToL@CMemSpyEngineHelperWindowServer@@QAEXH@Z @ 399 NONAME ABSENT ; void CMemSpyEngineHelperWindowServer::SwitchToL(int)
+	__E32Dll @ 386 NONAME ABSENT ; int CMemSpyEngineWindowGroupList::MdcaCount(void) const
+	__E32Dll @ 387 NONAME ABSENT ; void CMemSpyEngineHelperWindowServer::GetWindowGroupListL(class RArray<class TMemSpyEngineWindowGroupInfo> &)
+	__E32Dll @ 388 NONAME ABSENT ; CMemSpyEngineWindowGroupList::~CMemSpyEngineWindowGroupList(void)
+	__E32Dll @ 389 NONAME ABSENT ; int CMemSpyEngineWindowGroupList::Count(void) const
+	__E32Dll @ 390 NONAME ABSENT ; int CMemSpyEngineWindowGroupList::ItemIndex(class TMemSpyEngineWindowGroupInfo const &) const
+	__E32Dll @ 391 NONAME ABSENT ; class CMemSpyEngineWindowGroupList * CMemSpyEngineHelperWindowServer::WindowGroupListL(void)
+	__E32Dll @ 392 NONAME ABSENT ; class CMemSpyEngineHelperWindowServer & CMemSpyEngine::HelperWindowServer(void)
+	__E32Dll @ 393 NONAME ABSENT ; class TPtrC16 CMemSpyEngineWindowGroupList::MdcaPoint(int) const
+	__E32Dll @ 394 NONAME ABSENT ; class TMemSpyEngineWindowGroupInfo const & CMemSpyEngineWindowGroupList::At(int) const
+	__E32Dll @ 395 NONAME ABSENT ; int CMemSpyEngineWindowGroupList::ItemIndex(class TMemSpyEngineWindowGroupBasicInfo const &) const
+	__E32Dll @ 396 NONAME ABSENT ; class TMemSpyEngineWindowGroupBasicInfo const & CMemSpyEngineWindowGroupList::At(int) const
+	__E32Dll @ 397 NONAME ABSENT ; void CMemSpyEngineHelperWindowServer::GetWindowGroupListL(class RArray<class TMemSpyEngineWindowGroupBasicInfo> &)
+	__E32Dll @ 398 NONAME ABSENT ; void CMemSpyEngineHelperWindowServer::GetWindowGroupDetailsL(int, class TMemSpyEngineWindowGroupDetails &)
+	__E32Dll @ 399 NONAME ABSENT ; void CMemSpyEngineHelperWindowServer::SwitchToL(int)
 	?Capabilities@CMemSpyProcess@@QBE?AUSCapabilitySet@@XZ @ 400 NONAME ; struct SCapabilitySet CMemSpyProcess::Capabilities(void) const
 	?UIDs@CMemSpyProcess@@QBE?AVTUidType@@XZ @ 401 NONAME ; class TUidType CMemSpyProcess::UIDs(void) const
 	?HelperCondVar@CMemSpyEngine@@QAEAAVCMemSpyEngineHelperCondVar@@XZ @ 402 NONAME ; class CMemSpyEngineHelperCondVar & CMemSpyEngine::HelperCondVar(void)
 	?GetCondVarSuspendedThreadsL@CMemSpyEngineHelperCondVar@@QAEXABVTMemSpyDriverHandleInfoGeneric@@AAV?$RArray@VTMemSpyDriverCondVarSuspendedThreadInfo@@@@@Z @ 403 NONAME ; void CMemSpyEngineHelperCondVar::GetCondVarSuspendedThreadsL(class TMemSpyDriverHandleInfoGeneric const &, class RArray<class TMemSpyDriverCondVarSuspendedThreadInfo> &)
 	?HelperWindowServer@CMemSpyEngine@@QAEAAVMMemSpyEngineHelperWindowServer@@XZ @ 404 NONAME ; class MMemSpyEngineHelperWindowServer & CMemSpyEngine::HelperWindowServer(void)
 	?IsHelperWindowServerSupported@CMemSpyEngine@@QAEHXZ @ 405 NONAME ; int CMemSpyEngine::IsHelperWindowServerSupported(void)
+	__E32Dll @ 406 NONAME ABSENT ; int CMemSpyEngineGenericKernelObjectList::Size(void) const
+	__E32Dll @ 407 NONAME ABSENT ; int CMemSpyEngineGenericKernelObjectList::Size(void)
+	?Size@CMemSpyEngineGenericKernelObjectList@@QBEHXZ @ 408 NONAME ; int CMemSpyEngineGenericKernelObjectList::Size(void) const
+	?NewHeapRawInfo@CMemSpyEngineHelperHeap@@QAEAAVTMemSpyHeapData@@ABVTMemSpyHeapInfo@@@Z @ 409 NONAME ABSENT ; class TMemSpyHeapData & CMemSpyEngineHelperHeap::NewHeapRawInfo(class TMemSpyHeapInfo const &)
+	?NewHeapRawInfo@CMemSpyEngineHelperHeap@@QAE?AVTMemSpyHeapData@@ABVTMemSpyHeapInfo@@@Z @ 410 NONAME ; class TMemSpyHeapData CMemSpyEngineHelperHeap::NewHeapRawInfo(class TMemSpyHeapInfo const &)
+	?ItemsCount@CMemSpyEngineGenericKernelObjectList@@QBEHXZ @ 411 NONAME ; int CMemSpyEngineGenericKernelObjectList::ItemsCount(void) const
+	?Priority@CMemSpyThread@@QBE?AW4TThreadPriority@@XZ @ 412 NONAME ; enum TThreadPriority CMemSpyThread::Priority(void) const
+	?NewL@CMemSpyEngine@@SAPAV1@AAVRFs@@H@Z @ 413 NONAME ; class CMemSpyEngine * CMemSpyEngine::NewL(class RFs &, int)
+	?Value@CMemSpyThreadInfoItemBase@@QBE?AVTPtrC16@@H@Z @ 414 NONAME ; class TPtrC16 CMemSpyThreadInfoItemBase::Value(int) const
+	?ExitType@CMemSpyProcess@@QBE?AW4TExitType@@XZ @ 415 NONAME ; enum TExitType CMemSpyProcess::ExitType(void) const
+	?ExitCategory@CMemSpyProcess@@QBE?AV?$TBuf@$0BA@@@XZ @ 416 NONAME ; class TBuf<16> CMemSpyProcess::ExitCategory(void) const
+	?Priority@CMemSpyProcess@@QBE?AW4TProcessPriority@@XZ @ 417 NONAME ; enum TProcessPriority CMemSpyProcess::Priority(void) const
+	?Caption@CMemSpyThreadInfoItemBase@@QBE?AVTPtrC16@@H@Z @ 418 NONAME ; class TPtrC16 CMemSpyThreadInfoItemBase::Caption(int) const
+	?ExitReason@CMemSpyProcess@@QBEHXZ @ 419 NONAME ; int CMemSpyProcess::ExitReason(void) const
+	?NewL@CMemSpyEngineSinkMetaData@@SAPAV1@ABVTDesC16@@000HHABVTTime@@@Z @ 420 NONAME ; class CMemSpyEngineSinkMetaData * CMemSpyEngineSinkMetaData::NewL(class TDesC16 const &, class TDesC16 const &, class TDesC16 const &, class TDesC16 const &, int, int, class TTime const &)
+	?InstallDebugSinkL@CMemSpyEngine@@QAEXXZ @ 421 NONAME ; void CMemSpyEngine::InstallDebugSinkL(void)
+	?NewL@CMemSpyEngineSinkMetaData@@SAPAV1@ABVTDesC16@@000HH@Z @ 422 NONAME ; class CMemSpyEngineSinkMetaData * CMemSpyEngineSinkMetaData::NewL(class TDesC16 const &, class TDesC16 const &, class TDesC16 const &, class TDesC16 const &, int, int)
+	?InstallFileSinkL@CMemSpyEngine@@QAEXABVTDesC16@@@Z @ 423 NONAME ; void CMemSpyEngine::InstallFileSinkL(class TDesC16 const &)
+	?CheckForChangesNowL@CMemSpyEngineHelperSysMemTracker@@QAEXXZ @ 424 NONAME ; void CMemSpyEngineHelperSysMemTracker::CheckForChangesNowL(void)
+	?GetHeapInfoUserL@CMemSpyEngineHelperHeap@@QAEXABVTProcessId@@ABVTThreadId@@AAVTMemSpyHeapInfo@@PAV?$RArray@VTMemSpyDriverFreeCell@@@@H@Z @ 425 NONAME ; void CMemSpyEngineHelperHeap::GetHeapInfoUserL(class TProcessId const &, class TThreadId const &, class TMemSpyHeapInfo &, class RArray<class TMemSpyDriverFreeCell> *, int)
 
--- a/memspy/Engine/Include/ClientServer/MemSpyEngineServer.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Include/ClientServer/MemSpyEngineServer.h	Tue Aug 31 16:45:49 2010 +0300
@@ -23,17 +23,36 @@
 
 // User includes
 #include <memspyengineclientinterface.h>
+#include <memspy/engine/memspydevicewideoperations.h>
 
 // Classes referenced
 class CMemSpyEngine;
+class CMemSpyDwOperationTracker;
 
-
+NONSHARABLE_CLASS( CShutdown ) : public CTimer
+    {
+    enum {KMyShutdownDelay=10 * 1000000};       // 10s
+public:
+    inline CShutdown();
+    inline void ConstructL();
+    inline void Start();
+private:
+    void RunL();
+    };
 
 NONSHARABLE_CLASS( CMemSpyEngineServer ) : public CServer2
     {
 public:
     static CMemSpyEngineServer* NewL( CMemSpyEngine& aEngine );
     ~CMemSpyEngineServer();
+    
+    CMemSpyDwOperationTracker* CurrentOperationTracker() const { return iCurrentOperationTracker; }
+    void SetCurrentOperationTracker(CMemSpyDwOperationTracker* aTracker) { iCurrentOperationTracker = aTracker; }
+    
+    CMemSpyEngine& Engine() { return iEngine; } 
+    
+    void AddSession(TBool aCliRequest);
+    void DropSession(TBool aCliRequest);
 
 private:
     CMemSpyEngineServer( CMemSpyEngine& aEngine );
@@ -44,6 +63,12 @@
 
 private:
     CMemSpyEngine& iEngine;
+    CMemSpyDwOperationTracker* iCurrentOperationTracker;
+    
+    TInt iSessionCount;
+    TBool iCliConnected;
+    
+    CShutdown iShutdown;
     };
 
 
@@ -53,7 +78,9 @@
 public:
 	static CMemSpyEngineSession* NewL( CMemSpyEngine& aEngine, const RMessage2& aMessage );
 	~CMemSpyEngineSession();
-
+	
+	void CreateL();
+	
 private:
 	CMemSpyEngineSession( CMemSpyEngine& aEngine );
 	void ConstructL( const RMessage2& aMessage );
@@ -63,17 +90,54 @@
 
 private: // Internal methods
     void DoServiceL( const RMessage2& aMessage );
+    void DoAsyncServiceL( const RMessage2& aMessage );
+    void DoUiServiceL( const RMessage2& aMessage );
+    void DoCmdServiceL( const RMessage2& aMessage );
     static TInt ValidateFunction( TInt aFunction, TBool aIncludesThreadId, TBool aIncludesThreadName );
     void HandleThreadSpecificOpL( TInt aFunction, const TThreadId& aThreadId );
     void HandleThreadSpecificOpL( TInt aFunction, const TDesC& aThreadName );
     void HandleThreadAgnosticOpL( TInt aFunction, const RMessage2& aMessage );
+    void StartDeviceWideOperationL(CMemSpyDeviceWideOperations::TOperation aOperation, const RMessage2& aMessage);
+    
+    inline CMemSpyEngineServer& Server() const { return *static_cast<CMemSpyEngineServer*>(const_cast<CServer2*>(CSession2::Server())); }
 
 private:
     CMemSpyEngine& iEngine;
     HBufC* iClientThreadName;
     TUint32 iClientThreadId;
+    TBool iIsCliRequest;
     };
 
+/**
+ * CMemSpyDwOperationTracker
+ * Tracks device wide operation progress and calls iOperationMessage.Complete upon completion. 
+ */
+NONSHARABLE_CLASS( CMemSpyDwOperationTracker ) : public MMemSpyDeviceWideOperationsObserver
+	{
+public:
+	static CMemSpyDwOperationTracker* NewL(CMemSpyDeviceWideOperations::TOperation aOperation, 
+			const RMessage2& aOperationMessage,
+			CMemSpyEngineServer& aServer);
+	~CMemSpyDwOperationTracker();
+	
+	void AddNotificationL(const RMessage2& aMessage);
+	
+	void Cancel();
+
+public: // From MMemSpyDeviceWideOperationsObserver
+	void HandleDeviceWideOperationEvent(TEvent aEvent, TInt aParam1, const TDesC& aParam2);
+	
+private:
+	CMemSpyDwOperationTracker(const RMessage2& aOperationMessage, CMemSpyEngineServer& aServer);
+	void ConstructL(CMemSpyDeviceWideOperations::TOperation aOperation);
+	
+private:
+	RMessage2 iOperationMessage;
+	CMemSpyEngineServer& iServer;
+	CArrayFixFlat<RMessage2>* iPendingNotifications;
+	CMemSpyDeviceWideOperations* iOperation;
+	TInt iProgress;
+	};
 
 
 #endif
--- a/memspy/Engine/Include/Sink/MemSpyEngineOutputSinkFile.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Include/Sink/MemSpyEngineOutputSinkFile.h	Tue Aug 31 16:45:49 2010 +0300
@@ -32,12 +32,12 @@
 NONSHARABLE_CLASS( CMemSpyEngineOutputSinkFile ) : public CMemSpyEngineOutputSink
     {
 public:
-    static CMemSpyEngineOutputSinkFile* NewL( CMemSpyEngine& aEngine );
+    static CMemSpyEngineOutputSinkFile* NewL( CMemSpyEngine& aEngine, const TDesC& aRootFolder );
     ~CMemSpyEngineOutputSinkFile();
 
 public:
     CMemSpyEngineOutputSinkFile( CMemSpyEngine& aEngine );
-    void ConstructL();
+    void ConstructL( const TDesC& aRootFolder );
     
 private: // From CMemSpyEngineOutputSink
     void ProcessSuspendedL( TProcessId aId );
@@ -64,6 +64,8 @@
 
     TUint iFileServerProcessId;
     TBool iFileServerSuspended;
+    
+    HBufC* iRoot;
 
 private:
     friend class CMemSpyEngineFileHolder;
@@ -117,4 +119,4 @@
 
 
 
-#endif
\ No newline at end of file
+#endif
--- a/memspy/Engine/Source/ClientServer/MemSpyEngineServer.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/ClientServer/MemSpyEngineServer.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -19,6 +19,9 @@
 
 // System includes
 #include <e32svr.h>
+#include <w32std.h>
+#include <APGTASK.H>
+#include <APGWGNAM.H>  
 
 // User includes
 #include <memspy/engine/memspyengine.h>
@@ -38,7 +41,40 @@
 #include <memspy/engine/memspyenginehelpersysmemtracker.h>
 #include <memspy/engine/memspyenginehelpersysmemtrackerconfig.h>
 #include <memspy/engine/memspyenginehelperkernelcontainers.h>
+#include <memspy/engine/memspyengineobjectthreadinfocontainer.h>
+#include <memspy/engine/memspyengineobjectthreadinfoobjects.h>
+#include <memspy/engine/memspyenginehelpersysmemtrackercycle.h>
 
+#include <memspy/engine/memspyprocessdata.h>
+#include <memspy/engine/memspythreaddata.h>
+#include <memspy/engine/memspykernelobjectdata.h>
+#include <memspy/engine/memspythreadinfoitemdata.h>
+#include <memspy/engine/memspymemorytrackingcycledata.h>
+#include <memspy/engine/memspyengineoutputsink.h>
+#include <memspy/engine/memspyenginehelperactiveobject.h>
+
+inline CShutdown::CShutdown() :CTimer(-1)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+inline void CShutdown::ConstructL()
+    {
+    CTimer::ConstructL();
+    }
+
+inline void CShutdown::Start()
+    {
+    After(KMyShutdownDelay);
+    }
+
+void CShutdown::RunL()
+    //
+    // Initiate server exit when the timer expires
+    //
+    {
+    CActiveScheduler::Stop();
+    }
 
 CMemSpyEngineServer::CMemSpyEngineServer( CMemSpyEngine& aEngine )
 :   CServer2( EPriorityNormal ), iEngine( aEngine )
@@ -54,6 +90,10 @@
 void CMemSpyEngineServer::ConstructL()
     {
     StartL( KMemSpyServerName );
+    
+    iShutdown.ConstructL();
+    // ensure that the server still exits even if the 1st client fails to connect
+    iShutdown.Start();
     }
 
 
@@ -79,6 +119,34 @@
 	return session;
     }
 
+void CMemSpyEngineServer::AddSession(TBool aCliRequest)
+    {
+    if (aCliRequest)
+        {
+        iCliConnected = ETrue;
+        }
+    else
+        {
+        ++iSessionCount;
+        }
+    iShutdown.Cancel();
+    }
+
+void CMemSpyEngineServer::DropSession(TBool aCliRequest)
+    {
+    if (!aCliRequest)
+        {
+        --iSessionCount;
+        }
+    
+    if (iSessionCount == 0 && !iCliConnected)
+        {
+        iShutdown.Start();
+        }
+    }
+
+
+
 
 
 
@@ -120,6 +188,8 @@
 #endif
 
     delete iClientThreadName;
+    
+    Server().DropSession(iIsCliRequest);
     }
 
 
@@ -138,10 +208,17 @@
     iClientThreadId = thread.Id();
 
     CleanupStack::PopAndDestroy( &thread );
-
+    
+    const TUid KCliUid3 = { 0x2002129D };
+    iIsCliRequest = aMessage.SecureId() == TSecureId(KCliUid3);
+    
     TRACE( RDebug::Print( _L("[MemSpy] CMemSpyEngineSession::ConstructL() - NEW SESSION - this: 0x%08x, id: %4d, client: %S"), this, iClientThreadId, iClientThreadName ) );
     }
 
+void CMemSpyEngineSession::CreateL()
+    {   
+    Server().AddSession(iIsCliRequest);
+    }
 
 CMemSpyEngineSession* CMemSpyEngineSession::NewL( CMemSpyEngine& aEngine, const RMessage2& aMessage )
     {
@@ -162,13 +239,669 @@
         {
         RDebug::Print( _L("[MemSpy] CMemSpyEngineSession::ServiceL() - SERVICE ERROR - this: 0x%08x, fn: %d, err: %d, client: %S"), this, aMessage.Function(), error, iClientThreadName );
         }
-    aMessage.Complete( error );
+    
+    if ((aMessage.Function() & KMemSpyOpFlagsAsyncOperation) == 0 || error != KErrNone)
+    	{
+		aMessage.Complete( error );
+    	}
 
     TRACE( RDebug::Print( _L("[MemSpy] CMemSpyEngineSession::ServiceL() - END - this: 0x%08x, fn: 0x%08x, id: %4d, client: %S"), this, aMessage.Function(), iClientThreadId, iClientThreadName ) );
 	}
 
+// ---------------------------------------------------------
+// DoServiceL( const RMessage2& aMessage )
+// ---------------------------------------------------------
+//
+void CMemSpyEngineSession::DoServiceL( const RMessage2& aMessage )
+	{
+	TInt function = aMessage.Function() & KMemSpyOpFlagsTypeMask;
+	if (function >= EMemSpyClientServerOpMarkerUiFirst && 
+		function < EMemSpyClientServerOpMarkerUiLast)
+		
+		DoUiServiceL(aMessage);
+	else
+		DoCmdServiceL(aMessage);
+	}
+// ---------------------------------------------------------
+// DoUiServiceL( const RMessage2& aMessage )
+// ---------------------------------------------------------
+//
+void CMemSpyEngineSession::DoUiServiceL( const RMessage2& aMessage )
+    {
+	switch (aMessage.Function() & KMemSpyOpFlagsTypeMask)
+		{
+		case EMemSpyClientServerOpGetProcessCount:
+			{
+			aMessage.WriteL(0, TPckgBuf<TInt>(iEngine.Container().Count()));
+			break;
+			}
+		case EMemSpyClientServerOpGetProcesses:
+			{
+			CMemSpyEngineObjectContainer& list = iEngine.Container();
+			
+			TPckgBuf<TInt> a0;
+			aMessage.ReadL(0, a0);
+			TInt realCount = Min(a0(), list.Count());
+			
+			for(TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyProcessData))
+				{
+				CMemSpyProcess& process = iEngine.Container().At(i);
+				TMemSpyProcessData data;
+				data.iIsDead = process.IsDead();
+				data.iId = process.Id();
+				data.iName.Copy(process.Name().Left(KMaxFullName));
+				data.iThreadCount = process.Count();
+				data.iPriority = process.Priority();
+				data.iExitType = process.ExitType();
+				data.iExitReason = process.ExitReason();
+				data.iExitCategory = process.ExitCategory();
+				data.iSID = process.SID();
+				
+				TPckgBuf<TMemSpyProcessData> buffer(data);
+				aMessage.WriteL(1, buffer, offset);
+				}
+			
+			a0 = list.Count();
+			aMessage.WriteL(0, a0);
 
-void CMemSpyEngineSession::DoServiceL( const RMessage2& aMessage )
+			break;
+			}
+		case EMemSpyClienServerOpGetProcessIdByName:
+			{
+			TFullName processName;
+			aMessage.ReadL(0, processName);
+			
+			TBool found(EFalse);
+			
+			for (TInt i=0; i<iEngine.Container().Count(); i++)
+				{
+				CMemSpyProcess& process = iEngine.Container().At(i);
+				if (process.Name().FindF(processName) >= 0)
+					{
+					found = ETrue;
+					TPckgBuf<TProcessId> procId(process.Id());
+					aMessage.WriteL(1, procId);
+					}
+				}
+			
+			if (!found)
+				{
+				User::Leave(KErrNotFound);
+				}
+			
+			break;
+			}
+		case EMemSpyClientServerOpProcessSystemPermanentOrCritical:
+			{
+			TBool ret = EFalse;
+			TPckgBuf<TProcessId> id;
+			aMessage.ReadL( 0, id );
+			
+			CMemSpyEngineObjectContainer& container = iEngine.Container();
+			CMemSpyProcess& process = container.ProcessByIdL( id() );
+			
+			if  ( process.IsSystemPermanent() || process.IsSystemCritical() )
+				{
+				ret = ETrue;
+				}
+			TPckgBuf<TBool> retBuf( ret );
+			aMessage.WriteL( 1, retBuf );
+			
+			break;
+			}
+		case EMemSpyClientServerOpEndProcess:
+			{
+			TPckgBuf<TProcessId> id;
+			aMessage.ReadL( 0, id );
+			TPckgBuf<TMemSpyEndType> type;
+			aMessage.ReadL( 1, type );
+					
+			CMemSpyEngineObjectContainer& container = iEngine.Container();			
+			CMemSpyProcess& process = container.ProcessByIdL( id() );
+									
+			switch ( type() )
+				{
+				case ETerminate:
+					{
+					process.TerminateL();
+					break;
+					}
+				case EPanic:
+					{
+					process.PanicL();
+					break;
+					}
+				case EKill:
+					{
+					process.KillL();
+					break;
+					}
+				}																
+			break;
+			}
+		case EMemSpyClientServerOpSwitchToProcess:
+			{/*
+			TInt wgCount;
+			RWsSession wsSession;
+			User::LeaveIfError( wsSession.Connect() );
+			CleanupClosePushL( wsSession );
+			User::LeaveIfError( wgCount = wsSession.NumWindowGroups() );
+			RArray<RWsSession::TWindowGroupChainInfo> wgArray;
+			CleanupClosePushL( wgArray );
+			User::LeaveIfError( wsSession.WindowGroupList( &wgArray ) );
+			TApaTask task( wsSession );
+			TBool brought( EFalse );
+			TInt wgId( KErrNotFound );
+			TThreadId threadId;
+			
+			TPckgBuf<TProcessId> id;
+			aMessage.ReadL( 0, id );
+			CMemSpyEngineObjectContainer& container = iEngine.Container();
+			CMemSpyProcess& process = container.ProcessByIdL( id() );
+			
+			// loop trough threads in a process
+			for ( TInt i = 0; i < process.MdcaCount(); i++ )
+				{
+				TInt wgCountLocal = wgCount;
+							
+				// loop trough all window groups and see if a thread id matches
+				while( !brought && wgCountLocal-- )
+					{
+					wgId = wgArray[wgCountLocal].iId;
+					User::LeaveIfError( wsSession.GetWindowGroupClientThreadId( wgId, threadId ) );
+					if ( threadId == process.At( i ).Id() )
+						{
+						CApaWindowGroupName* wgName = CApaWindowGroupName::NewLC( wsSession, wgId );
+						task.SetWgId( wgId );
+						if ( !wgName->Hidden() && task.Exists() )
+							{
+							task.BringToForeground();
+							brought = ETrue;                        
+							}
+						CleanupStack::PopAndDestroy( wgName );
+						}
+					}
+				}
+			
+			TPckgBuf<TBool> ret( brought );
+			aMessage.WriteL( 1, ret );
+			
+			break;*/
+			}
+		case EMemSpyClientServerOpGetThreadCount:
+			{
+			TPckgBuf<TProcessId> pid;
+			aMessage.ReadL(1, pid);
+			CMemSpyProcess& process = iEngine.Container().ProcessByIdL(pid());
+			aMessage.WriteL(0, TPckgBuf<TInt>(process.Count()));
+			break;
+			}
+		case EMemSpyClientServerOpGetThreads:
+			{
+			TPckgBuf<TProcessId> pid;
+			aMessage.ReadL(2, pid);
+			
+			CMemSpyProcess& list = iEngine.Container().ProcessByIdL(pid());
+			
+			TPckgBuf<TInt> a0;
+			aMessage.ReadL(0, a0);
+			TInt realCount = Min(a0(), list.Count());
+						
+			for(TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyThreadData))
+				{
+				CMemSpyThread& thread = list.At(i);
+				
+				TMemSpyThreadData data;
+				data.iId = thread.Id();
+				data.iName.Copy(thread.Name().Left(KMaxFullName));
+				data.iThreadPriority = thread.Priority();
+				
+				TPckgBuf<TMemSpyThreadData> buffer(data);
+				aMessage.WriteL(1, buffer, offset);
+				}
+			
+			a0 = list.Count();
+			aMessage.WriteL(0, a0);
+
+			break;
+			}
+		case EMemSpyClientServerOpSetThreadPriority:
+			{
+			TPckgBuf<TThreadId> tid;
+			TPckgBuf<TInt> priority;
+			aMessage.ReadL(0, tid);
+			aMessage.ReadL(1, priority);
+			
+			CMemSpyProcess* process = NULL;
+			CMemSpyThread* thread = NULL; 
+			User::LeaveIfError(iEngine.Container().ProcessAndThreadByThreadId(tid(), process, thread));
+			
+			if (thread)
+				{				
+				thread->SetPriorityL(static_cast<TThreadPriority>(priority()));
+				}					
+			break;
+			}
+		case EMemSpyClientServerOpThreadSystemPermanentOrCritical:
+			{
+			TPckgBuf<TThreadId> id;
+			aMessage.ReadL( 0, id );
+			
+			CMemSpyEngineObjectContainer& container = iEngine.Container();            
+			CMemSpyProcess* process = NULL;
+			CMemSpyThread* thread = NULL; 
+			User::LeaveIfError( container.ProcessAndThreadByThreadId( id(), process, thread ) );
+			
+			TBool ret = thread && ( thread->IsSystemPermanent() || thread->IsSystemCritical() );
+			
+			TPckgBuf<TBool> retBuf( ret );
+			aMessage.WriteL( 1, retBuf );
+							
+			break;
+			}
+		case EMemSpyClientServerOpEndThread:
+			{
+			TPckgBuf<TThreadId> id;
+			aMessage.ReadL( 0, id );
+			TPckgBuf<TMemSpyEndType> type;
+			aMessage.ReadL( 1, type );
+			
+			CMemSpyEngineObjectContainer& container = iEngine.Container();
+			CMemSpyProcess* process = NULL;
+			CMemSpyThread* thread = NULL; 
+			User::LeaveIfError( container.ProcessAndThreadByThreadId( id(), process, thread ) );
+			
+			if( thread )
+				{
+				switch ( type() )
+					{
+					case ETerminate:
+						{
+						thread->TerminateL();
+						break;
+						}
+					case EPanic:
+						{
+						thread->PanicL();
+						break;
+						}
+					case EKill:
+						{
+						thread->KillL();
+						break;
+						}
+					}				
+				}			
+			break;
+			}
+		case EMemSpyClientServerOpSwitchToThread:
+			{
+			TInt wgCount;
+			RWsSession wsSession;
+			User::LeaveIfError( wsSession.Connect() );
+			CleanupClosePushL( wsSession );
+			User::LeaveIfError( wgCount = wsSession.NumWindowGroups() );
+			RArray<RWsSession::TWindowGroupChainInfo> wgArray;
+			CleanupClosePushL( wgArray );
+			User::LeaveIfError( wsSession.WindowGroupList( &wgArray ) );
+			TApaTask task( wsSession );
+			TBool brought( EFalse );
+			TInt wgId( KErrNotFound );
+			TThreadId threadId;
+					
+			TPckgBuf<TThreadId> id;
+			aMessage.ReadL( 0, id );
+					
+			// loop trough all window groups and see if a thread id matches
+			while( !brought && wgCount-- )
+				{
+				wgId = wgArray[wgCount].iId;
+				User::LeaveIfError( wsSession.GetWindowGroupClientThreadId( wgId, threadId ) );
+				if ( threadId == id() )
+					{
+					CApaWindowGroupName* wgName = CApaWindowGroupName::NewLC( wsSession, wgId );
+					task.SetWgId( wgId );
+					if ( !wgName->Hidden() && task.Exists() )
+						{
+						task.BringToForeground();
+						brought = ETrue;                        
+						}
+					CleanupStack::PopAndDestroy( wgName );
+					}
+				}			
+			TPckgBuf<TBool> ret( brought );
+			aMessage.WriteL( 1, ret );															
+					
+			break;
+			}		
+		case EMemSpyClientServerOpGetInfoItemType:
+			{
+			
+			TPckgBuf<TInt> index;
+			aMessage.ReadL( 0, index );			
+			TPckgBuf<TThreadId> id;
+			aMessage.ReadL( 1, id);
+								
+			CMemSpyEngineObjectContainer& container = iEngine.Container();            
+			CMemSpyProcess* process = NULL; //not needed
+			CMemSpyThread* thread = NULL; 
+			User::LeaveIfError( container.ProcessAndThreadByThreadId( id(), process, thread ) );
+		            
+			CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL();                        
+			TMemSpyThreadInfoItemType retType = threadInfoContainer.Item( index() ).Type();
+			
+			TPckgBuf<TMemSpyThreadInfoItemType> ret( retType );
+			aMessage.WriteL( 2, ret );			
+			
+			break;
+			}
+		case EMemSpyClientServerOpGetThreadInfoItemsCount:
+			{
+			TPckgBuf<TThreadId> id;
+			aMessage.ReadL( 0, id );
+			TPckgBuf<TMemSpyThreadInfoItemType> type;
+			aMessage.ReadL( 1, type );					 
+			
+			CMemSpyEngineObjectContainer& container = iEngine.Container();            
+			CMemSpyProcess* process = NULL;
+			CMemSpyThread* thread = NULL; 
+			
+			container.ProcessAndThreadByThreadId( id(), process, thread );
+			
+			CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL();                 
+								
+			CMemSpyThreadInfoItemBase& threadInfoItemBase = threadInfoContainer.Item( type() );
+				    
+			TInt count = threadInfoItemBase.MdcaCount();		    
+			TPckgBuf<TInt> tempret( count );
+			aMessage.WriteL( 2, tempret );
+		
+			break;
+			}		
+		case EMemSpyClientServerOpGetThreadInfoItems:
+			{
+			TPckgBuf<TInt> count;
+			aMessage.ReadL( 0, count );						
+			TPckgBuf<TThreadId> id;
+			aMessage.ReadL( 1, id );
+			TPckgBuf<TMemSpyThreadInfoItemType> type;
+			aMessage.ReadL( 2, type );			
+			
+			CMemSpyEngineObjectContainer& container = iEngine.Container();            
+			CMemSpyProcess* process = NULL;
+			CMemSpyThread* thread = NULL; 
+			User::LeaveIfError( container.ProcessAndThreadByThreadId( id() , process, thread ) );
+							  
+			CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL();      
+
+			CMemSpyThreadInfoItemBase& threadInfoItemBase = threadInfoContainer.Item( type() ); //get ThreadInfoItemBaseByType
+			
+			TInt itemCount = Min(count(), threadInfoItemBase.MdcaCount());
+								
+			for( TInt i=0, offset = 0; i<itemCount; i++, offset += sizeof( TMemSpyThreadInfoItemData ) )
+				{
+				TMemSpyThreadInfoItemData data;
+				
+				TPtrC caption(threadInfoItemBase.MdcaPoint(i).Mid(1));
+				TInt tabPos = caption.Locate('\t');
+				if (tabPos != KErrNotFound)
+					caption.Set(caption.Left(tabPos));
+				
+				TPtrC value(threadInfoItemBase.MdcaPoint(i));
+				tabPos = value.LocateReverse('\t');
+				if (tabPos != KErrNotFound)
+					value.Set(value.Mid(tabPos + 1));
+												
+				data.iCaption.Copy( caption.Left(64) );
+				data.iValue.Copy( value.Left(32) );
+							
+				TPckgBuf<TMemSpyThreadInfoItemData> buffer(data);
+				aMessage.WriteL(3, buffer, offset);				
+				}			
+			aMessage.WriteL(0, count);
+					
+			break;
+			}
+		// --- KernelObjects related functions ---
+		case EMemSpyClientServerOpGetKernelObjectCount:
+			{
+			TInt iCount = EMemSpyDriverContainerTypeLast - EMemSpyDriverContainerTypeFirst;
+			TPckgBuf<TInt> ret( iCount );
+			aMessage.WriteL(0, ret);			
+			break;
+			}
+		case EMemSpyClientServerOpGetKernelObjects:
+			{
+			TPckgBuf<TInt> count;
+			aMessage.ReadL(0, count);
+			
+			CMemSpyEngineGenericKernelObjectContainer* model = iEngine.HelperKernelContainers().ObjectsAllL(); //contains all the objects
+			CleanupStack::PushL( model );
+			
+			for( TInt i=0, offset = 0; i<count(); i++, offset += sizeof( TMemSpyKernelObjectData ) )
+				{
+				TMemSpyKernelObjectData data;
+				
+				TPtrC name(model->At(i).Name().Mid(1));
+				TInt tabPos = name.Locate('\t');
+				if (tabPos != KErrNotFound)
+					name.Set(name.Left(tabPos));
+												
+				data.iName.Copy(name);
+				data.iType = model->At(i).Type();
+				data.iCount = model->At(i).Count();											
+				data.iSize = model->At(i).Count() * model->At(i).Count();
+
+				TPckgBuf<TMemSpyKernelObjectData> buffer(data);
+				aMessage.WriteL(1, buffer, offset);
+				}			
+			aMessage.WriteL(0, count);
+			CleanupStack::PopAndDestroy( model );
+			break;
+			}
+		case EMemSpyClientServerOpGetKernelObjectItemCount:
+			{
+			TPckgBuf<TMemSpyDriverContainerType> tempType;
+			aMessage.ReadL(1, tempType); //get type of kernel object
+			TMemSpyDriverContainerType type = tempType();
+			
+			CMemSpyEngineHelperKernelContainers& kernelContainerManager = iEngine.HelperKernelContainers();
+			CMemSpyEngineGenericKernelObjectList* iObjectList = kernelContainerManager.ObjectsForSpecificContainerL( type );
+			CleanupStack::PushL( iObjectList );
+			
+			TInt count = iObjectList->Count();
+			TPckgBuf<TInt> ret( count );
+			aMessage.WriteL( 0, ret );
+			
+			CleanupStack::PopAndDestroy( iObjectList );
+			break;
+			}
+		case EMemSpyClientServerOpGetKernelObjectItems:
+			{
+			TPckgBuf<TInt> count;
+			TPckgBuf<TMemSpyDriverContainerType> tempType;
+			aMessage.ReadL( 0, count ); //get count of items
+			aMessage.ReadL(1, tempType); //get type of kernel object
+			TInt c = count();
+						
+			CMemSpyEngineHelperKernelContainers& kernelContainerManager = iEngine.HelperKernelContainers();
+			CMemSpyEngineGenericKernelObjectList* iObjectList = kernelContainerManager.ObjectsForSpecificContainerL( tempType() );
+			CleanupStack::PushL( iObjectList );
+			
+			for( TInt i=0, offset = 0; i<c; i++, offset += sizeof( TMemSpyDriverHandleInfoGeneric ) )
+				{
+				TMemSpyDriverHandleInfoGeneric data;								
+															
+				data = iObjectList->At( i );
+				
+				TPckgBuf<TMemSpyDriverHandleInfoGeneric> buffer(data);
+				aMessage.WriteL(2, buffer, offset);
+				}			
+			
+			CleanupStack::PopAndDestroy( iObjectList );			
+			break;
+			}
+			
+		case EMemSpyClientServerOpOutputAllContainerContents:
+			{
+			CMemSpyEngineHelperKernelContainers& kernelContainerManager = iEngine.HelperKernelContainers();
+			CMemSpyEngineGenericKernelObjectContainer* model = kernelContainerManager.ObjectsAllL();
+			
+			model->OutputL( iEngine.Sink() );
+
+			break;
+			}
+			
+		case EMemSpyClientServerOpDumpKernelHeap:
+			{
+		    iEngine.HelperHeap().OutputHeapDataKernelL();
+			
+			break;
+			}
+			
+		case EMemSpyClientServerOpOutputInfoHandles:
+			{
+			TPckgBuf<TThreadId> id;
+			aMessage.ReadL(0, id);
+			CMemSpyEngineObjectContainer& container = iEngine.Container();            
+			CMemSpyProcess* process = NULL;
+			CMemSpyThread* thread = NULL; 
+			User::LeaveIfError( container.ProcessAndThreadByThreadId( id() , process, thread ) );
+										  
+			CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL();
+			
+			threadInfoContainer.PrintL();
+			
+			break;
+			}
+			
+		case EMemSpyClientServerOpOutputAOList:
+			{
+			TPckgBuf<TThreadId> id;
+			TPckgBuf<TMemSpyThreadInfoItemType> type;
+			aMessage.ReadL(0, id);
+			aMessage.ReadL(1, type);
+			
+			CMemSpyEngineObjectContainer& container = iEngine.Container();            
+			CMemSpyProcess* process = NULL;
+			CMemSpyThread* thread = NULL; 
+			User::LeaveIfError( container.ProcessAndThreadByThreadId( id() , process, thread ) );
+										  
+			CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL();      
+
+			CMemSpyThreadInfoItemBase* threadInfoItem = &threadInfoContainer.Item( type() );
+						
+			CMemSpyThreadInfoActiveObjects* activeObjectArray = static_cast< CMemSpyThreadInfoActiveObjects* >( threadInfoItem );			
+						
+		    // Begin a new data stream
+		    _LIT( KMemSpyContext, "Active Object List - " );
+		    _LIT( KMemSpyFolder, "Active Objects" );
+		    iEngine.Sink().DataStreamBeginL( KMemSpyContext, KMemSpyFolder );
+		    		    
+		    // Set prefix for overall listing
+		    iEngine.Sink().OutputPrefixSetLC( KMemSpyContext );
+
+		    // Create header
+		    CMemSpyEngineActiveObjectArray::OutputDataColumnsL( iEngine );
+		    
+		    // List items
+		    const TInt count = activeObjectArray->Array().Count();
+		    for(TInt i=0; i<count; i++)
+		        {
+		        const CMemSpyEngineActiveObject& object = activeObjectArray->Array().At( i );
+		        //
+		        object.OutputDataL( iEngine );
+		        }
+
+		    // Tidy up
+		    CleanupStack::PopAndDestroy(); // prefix
+
+		    // End data stream		    		    
+		    iEngine.Sink().DataStreamEndL();		    
+			
+			break;
+			}
+			
+		// --- Kernel Heap related functions ---
+		case EMemSpyClientServerOpGetHeap:
+			{
+			TMemSpyHeapInfo heapInfo;			
+			iEngine.HelperHeap().GetHeapInfoKernelL( heapInfo );
+			TMemSpyHeapData data = iEngine.HelperHeap().NewHeapRawInfo( heapInfo );
+			
+			TPckgBuf<TMemSpyHeapData> buffer(data);
+			aMessage.WriteL(0, buffer);
+			
+			break;
+			}
+		
+		case EMemSpyClientServerOpGetMemoryTrackingCycleCount:
+			aMessage.WriteL(0, TPckgBuf<TInt>(iEngine.HelperSysMemTracker().CompletedCycles().Count()));
+			break;
+			
+		case EMemSpyClientServerOpGetMemoryTrackingCycles:
+			{
+			const RPointerArray<CMemSpyEngineHelperSysMemTrackerCycle>& list = iEngine.HelperSysMemTracker().CompletedCycles();
+
+			TPckgBuf<TInt> a0;
+			aMessage.ReadL(0, a0);
+			TInt realCount = Min(a0(), list.Count());
+			
+			for (TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyMemoryTrackingCycleData))
+				{
+				CMemSpyProcess& process = iEngine.Container().At(i);
+				TMemSpyMemoryTrackingCycleData data;
+				data.iCycleNumber = list[i]->CycleNumber();
+				data.iCaption.Copy(list[i]->Caption().Left(KMaxFullName));
+				data.iTime = list[i]->Time();
+				data.iFreeMemory = list[i]->MemoryFree();
+				data.iMemoryDelta = list[i]->MemoryDelta();
+				data.iPreviousCycleDiff = list[i]->MemoryFreePreviousCycle();
+				
+				TPckgBuf<TMemSpyMemoryTrackingCycleData> buffer(data);
+				aMessage.WriteL(1, buffer, offset);
+				}
+			
+			a0 = list.Count();
+			aMessage.WriteL(0, a0);
+
+		break;
+		}
+	case EMemSpyClientServerOpIsSwmtRunning:
+		{
+		TPckgBuf<TBool> running(iEngine.HelperSysMemTracker().IsActive());
+		aMessage.WriteL(0, running);
+		break;
+		}
+			
+		
+	case EMemSpyClientServerOpNotifyDeviceWideOperationProgress:
+		{
+		if (!Server().CurrentOperationTracker())
+			{
+			User::Leave(KErrNotReady);
+			}
+		
+		Server().CurrentOperationTracker()->AddNotificationL(aMessage);
+		break;
+		}
+		
+	case EMemSpyClientServerOpCancelDeviceWideOperation:
+		if (!Server().CurrentOperationTracker())
+			{
+			User::Leave(KErrNotReady);
+			}
+		
+		Server().CurrentOperationTracker()->Cancel();
+		break;
+		}
+    }
+
+// ---------------------------------------------------------
+// DoCmdServiceL( const RMessage2& aMessage )
+// ---------------------------------------------------------
+//
+void CMemSpyEngineSession::DoCmdServiceL( const RMessage2& aMessage )
     {
     TInt error = KErrNone;
 
@@ -382,16 +1115,31 @@
 void CMemSpyEngineSession::HandleThreadAgnosticOpL( TInt aFunction, const RMessage2& aMessage )
     {
     TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - START" ) );
+    
     //
     if  ( aFunction ==  EMemSpyClientServerOpHeapInfoCompact )
         {
         TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpHeapInfoCompact") );
-        iEngine.HelperHeap().OutputHeapInfoForDeviceL();
+        if (aMessage.Function() & KMemSpyOpFlagsAsyncOperation)
+        	{
+			StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EEntireDeviceHeapInfoCompact, aMessage);
+        	}
+        else
+        	{
+			iEngine.HelperHeap().OutputHeapInfoForDeviceL();
+        	}
         }
     else if ( aFunction ==  EMemSpyClientServerOpStackInfoCompact )
         {
         TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpStackInfoCompact") );
-        iEngine.HelperStack().OutputStackInfoForDeviceL();
+        if (aMessage.Function() & KMemSpyOpFlagsAsyncOperation)
+			{
+			StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EEntireDeviceStackInfoCompact, aMessage);
+			}
+		else
+			{
+			iEngine.HelperStack().OutputStackInfoForDeviceL();
+			}
         }
     else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingTimerStart )
         {
@@ -481,12 +1229,31 @@
     else if ( aFunction == EMemSpyClientServerOpSwitchOutputSinkTrace )
         {
         TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSwitchOutputSinkTrace") );
-        iEngine.InstallSinkL( ESinkTypeDebug );
+        iEngine.InstallDebugSinkL();
         }
     else if ( aFunction == EMemSpyClientServerOpSwitchOutputSinkFile )
         {
         TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSwitchOutputSinkFile") );
-        iEngine.InstallSinkL( ESinkTypeFile );
+        // Read file name from message.
+        TFileName fileName;
+        RBuf buf;
+		buf.CleanupClosePushL();
+		
+		TInt len = aMessage.GetDesLength( 0 );
+		if ( len > 0 )
+			{
+			buf.CreateL( len );
+			aMessage.ReadL( 0, buf, 0 );
+			
+			iEngine.InstallFileSinkL( buf );           
+			}
+		else
+			{
+			iEngine.InstallFileSinkL( KNullDesC );
+			}
+		
+		CleanupStack::PopAndDestroy( &buf );
+        
         }
     else if ( aFunction == EMemSpyClientServerOpEnumerateKernelContainer )
         {
@@ -517,6 +1284,46 @@
         TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpDisableAknIconCache") );
         iEngine.HelperRAM().SetAknIconCacheStatusL( EFalse );
         }
+    else if ( aFunction == EMemSpyClientServerOpSummaryInfo )
+    	{
+		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSummaryInfo") );
+		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityGeneralSummary, aMessage);
+    	}
+    else if ( aFunction == EMemSpyClientServerOpSummaryInfoDetailed )
+		{
+		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSummaryInfoDetailed") );
+		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityGeneralDetailed, aMessage);
+		}
+    else if ( aFunction == EMemSpyClientServerOpHeapInfo )
+		{
+		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpHeapInfo") );
+		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityHeapInfo, aMessage);
+		}
+    else if ( aFunction == EMemSpyClientServerOpHeapCellListing )
+		{
+		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpHeapCellListing") );
+		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityHeapCellListing, aMessage);
+		}
+    else if ( aFunction == EMemSpyClientServerOpHeapData )
+		{
+		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpHeapData") );
+		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityHeapData, aMessage);
+		}
+    else if ( aFunction == EMemSpyClientServerOpStackInfo )
+		{
+		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpStackInfo") );
+		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityStackInfo, aMessage);
+		}
+    else if ( aFunction == EMemSpyClientServerOpStackDataUser )
+		{
+		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpStackDataUser") );
+		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityStackDataUser, aMessage);
+		}
+    else if ( aFunction == EMemSpyClientServerOpStackDataKernel )
+		{
+		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpStackDataKernel") );
+		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityStackDataKernel, aMessage);
+		}
     else
         {
         TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - [device-wide operation] => invoking UI") );
@@ -526,7 +1333,108 @@
     TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - END" ) );
     }
 
+void CMemSpyEngineSession::StartDeviceWideOperationL(CMemSpyDeviceWideOperations::TOperation aOperation, const RMessage2& aMessage)
+	{
+	if (Server().CurrentOperationTracker())
+		{
+		User::Leave(KErrInUse);
+		}
+	
+	Server().SetCurrentOperationTracker(CMemSpyDwOperationTracker::NewL(aOperation, aMessage, Server()));
+	}
+
+
+
+
+
 
 
 
 
+CMemSpyDwOperationTracker* CMemSpyDwOperationTracker::NewL(CMemSpyDeviceWideOperations::TOperation aOperation, 
+		const RMessage2& aOperationMessage, CMemSpyEngineServer& aServer)
+	{
+	CMemSpyDwOperationTracker* self = new (ELeave) CMemSpyDwOperationTracker(aOperationMessage, aServer);
+	CleanupStack::PushL( self );
+	self->ConstructL(aOperation);
+	CleanupStack::Pop( self );
+	return self;
+	}
+	
+CMemSpyDwOperationTracker::~CMemSpyDwOperationTracker()
+	{
+	delete iOperation;
+	delete iPendingNotifications;
+	}
+
+CMemSpyDwOperationTracker::CMemSpyDwOperationTracker(const RMessage2& aOperationMessage, CMemSpyEngineServer& aServer) : 
+		iOperationMessage(aOperationMessage),
+		iServer(aServer),
+		iPendingNotifications(0),
+		iOperation(0),
+		iProgress(0)
+	{
+	}
+
+
+void CMemSpyDwOperationTracker::ConstructL(CMemSpyDeviceWideOperations::TOperation aOperation)
+	{
+	iPendingNotifications = new (ELeave) CArrayFixFlat<RMessage2>(3);
+	iOperation = CMemSpyDeviceWideOperations::NewL(iServer.Engine(), *this, aOperation);
+	}
+
+void CMemSpyDwOperationTracker::AddNotificationL(const RMessage2& aMessage)
+	{
+	iPendingNotifications->AppendL(aMessage);
+	}
+
+void CMemSpyDwOperationTracker::Cancel()
+	{
+	iOperation->Cancel();
+	}
+
+void CMemSpyDwOperationTracker::HandleDeviceWideOperationEvent(TEvent aEvent, TInt aParam1, const TDesC& aParam2)
+	{
+	switch( aEvent )
+		{
+	case MMemSpyDeviceWideOperationsObserver::EOperationCompleted:
+	case MMemSpyDeviceWideOperationsObserver::EOperationCancelled:
+		iServer.SetCurrentOperationTracker(0);
+		
+		for (TInt i=0; i<iPendingNotifications->Count(); i++)
+			{
+			iPendingNotifications->At(i).Complete(KErrCancel);
+			}
+		
+		if (iOperationMessage.Function() & KMemSpyOpFlagsAsyncOperation)
+			{
+			iOperationMessage.Complete(
+				aEvent == MMemSpyDeviceWideOperationsObserver::EOperationCompleted ? KErrNone : KErrCancel);
+			}
+		
+		iPendingNotifications->Reset();
+		
+		delete this;
+		break;
+		
+	case MMemSpyDeviceWideOperationsObserver::EOperationProgressEnd:
+		{
+		iProgress += aParam1;
+		for (TInt i=0; i<iPendingNotifications->Count(); i++)
+			{
+			TInt err;
+			TRAP(err, iPendingNotifications->At(i).WriteL(0, TPckgBuf<TInt>( iProgress * 100 / iOperation->TotalOperationSize() )));
+			TRAP(err, iPendingNotifications->At(i).WriteL(1, aParam2));
+			if (err != KErrNone)
+				{
+				// TODO: iPendingProgressNotifications->At(i).Panic()
+				}
+			iPendingNotifications->At(i).Complete(KErrNone);
+			}
+		iPendingNotifications->Reset();
+		break;
+		}
+		
+		}
+	
+	}
--- a/memspy/Engine/Source/DeviceWideOps/MemSpyDeviceWideOperations.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/DeviceWideOps/MemSpyDeviceWideOperations.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -286,9 +286,10 @@
         break;
     case EPerEntityHeapData:
         // Complete op by outputting kernel heap data
-        pType.Set( KMemSpyUiThreadNameKernel );
-        iObserver.HandleDeviceWideOperationEvent( MMemSpyDeviceWideOperationsObserver::EOperationProgressStart, 0, pType );
-        iEngine.HelperHeap().OutputHeapDataKernelL();
+        // TODO: Uncomment after kernel heap dump is fixed
+//        pType.Set( KMemSpyUiThreadNameKernel );
+//        iObserver.HandleDeviceWideOperationEvent( MMemSpyDeviceWideOperationsObserver::EOperationProgressStart, 0, pType );
+//        iEngine.HelperHeap().OutputHeapDataKernelL();
         break;
     default:
         break;
--- a/memspy/Engine/Source/Helpers/MemSpyEngineHelperActiveObject.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/Helpers/MemSpyEngineHelperActiveObject.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -101,7 +101,7 @@
     //RDebug::Printf("CMemSpyEngineHelperActiveObject::ActiveObjectListLC() - allocated cell header length is: %d", iHeapInfo.iHeapCellHeaderLengthAllocated);
 
     // Do we have a ROM-based scheduler pointer?
-    if  ( scheduler != NULL && iHeapInfo.Type() == TMemSpyHeapInfo::ETypeRHeap )
+    if  ( scheduler != NULL && iHeapInfo.Type() != TMemSpyHeapInfo::ETypeUnknown )
         {
         //RDebug::Printf("CMemSpyEngineHelperActiveObject::ActiveObjectListLC() - scheduler: 0x%08x", scheduler);
 
@@ -149,9 +149,9 @@
     //RDebug::Printf("CMemSpyEngineHelperActiveObject::SchedulerHeapCellDataLC() - err: %d, cellLength: %d, cellAllocationNumber: %d, cellType: %d", err, cellLength, cellAllocationNumber, cellType);
     User::LeaveIfError( err );
     
-    if  ( cellType == EMemSpyDriverGoodAllocatedCell )
+	if (cellType & EMemSpyDriverAllocatedCellMask)
         {
-        const TInt payloadLength = cellLength - iHeapInfo.AsRHeap().MetaData().HeaderSizeAllocated();
+        const TInt payloadLength = cellLength;
         HBufC8* data = HBufC8::NewLC( payloadLength );
         TPtr8 pData( data->Des() );
         //
@@ -281,9 +281,9 @@
     //RDebug::Printf("CMemSpyEngineHelperActiveObject::ReadActiveObjectDataL() - err: %d, cellLength: %d, cellAllocationNumber: %d, cellType: %d", err, cellLength, cellAllocationNumber, cellType);
     User::LeaveIfError( err );
     
-    if  ( cellType == EMemSpyDriverGoodAllocatedCell )
+    if (cellType & EMemSpyDriverAllocatedCellMask)
         {
-        const TInt payloadLength = cellLength - iHeapInfo.AsRHeap().MetaData().HeaderSizeAllocated();
+        const TInt payloadLength = cellLength;
         //RDebug::Printf("CMemSpyEngineHelperActiveObject::ReadActiveObjectDataL() - payloadLength: %d", payloadLength);
 
         // const TInt payloadLength = Max( 512, cellLength - iHeapInfo.iHeapCellHeaderLengthAllocated ); // Prevent negative payload lengths?
--- a/memspy/Engine/Source/Helpers/MemSpyEngineHelperFbServ.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/Helpers/MemSpyEngineHelperFbServ.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -300,12 +300,11 @@
     // Get the heap info - we need this for verification purposes
     TMemSpyHeapInfo info;
     TInt err = iEngine.Driver().GetHeapInfoUser( info, aFbServThread.Id() );
-    if ( err == KErrNone && info.Type() != TMemSpyHeapInfo::ETypeRHeap )
+    if ( err == KErrNone && info.Type() == TMemSpyHeapInfo::ETypeUnknown )
         {
         err = KErrNotSupported;
         }
     User::LeaveIfError( err );
-    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC() - allocated cell header length is: %d", info.AsRHeap().MetaData().HeaderSizeAllocated() ));
 
     // Now walk the heap!
     err = iEngine.Driver().WalkHeapInit( aFbServThread.Id() );
@@ -324,13 +323,12 @@
             err = iEngine.Driver().WalkHeapNextCell( aFbServThread.Id(), cellType, cellAddress, cellLength, cellNestingLevel, cellAllocationNumber, cellHeaderSize, cellPayloadAddress );
             TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC() - cellIndex[%d] err: %d, cellLength: %d, cellAllocationNumber: %d, cellType: %d", cellIndex, err, cellLength, cellAllocationNumber, cellType));
 
-            if  ( err == KErrNone && cellType == EMemSpyDriverGoodAllocatedCell )
+            if  ( err == KErrNone && (cellType & EMemSpyDriverAllocatedCellMask))
                 {
                 // We know we are looking for a relatively large *allocated* cell.
-                if  ( cellLength >= KFbServExpectedMinimumCellSize && cellLength <= KFbServExpectedMaximumCellSize && cellType == EMemSpyDriverGoodAllocatedCell )
+                if  ( cellLength >= KFbServExpectedMinimumCellSize && cellLength <= KFbServExpectedMaximumCellSize )
                     {
-                    const TInt payloadLength = cellLength - info.AsRHeap().MetaData().HeaderSizeAllocated();
-                    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC() - cell was long enough. Full cell len: %d, header: %d, therefore dataLen: %d", cellLength, info.AsRHeap().MetaData().HeaderSizeAllocated(), payloadLength));
+                    const TInt payloadLength = cellLength;
 
                     // This is *probably* the right cell. Let's get the data and check.
                     HBufC8* data = HBufC8::NewLC( payloadLength );
@@ -345,9 +343,9 @@
                         //iEngine.Sink().OutputBinaryDataL( KHeapDumpDataFormat, pData.Ptr(), (const TUint8*) cellAddress, pData.Length() );
                     
                         // Check the data
-                        const TUint heapSize = info.AsRHeap().ObjectData().Size();
-                        const TUint heapBaseAddress = (TUint) info.AsRHeap().ObjectData().Base();
-                        const TBool correctHeapCellLocated = VerifyCorrectHeapCellL( *data, cellAddress, cellPayloadAddress, heapBaseAddress, heapSize );
+                        const TUint heapMaxSize = info.AsRHeap().MetaData().iMaxHeapSize;
+                        const TUint heapBaseAddress = (TUint) info.AsRHeap().MetaData().ChunkBaseAddress();
+                        const TBool correctHeapCellLocated = VerifyCorrectHeapCellL( *data, cellAddress, cellPayloadAddress, heapBaseAddress, heapMaxSize );
                         TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC() - verified: %d", correctHeapCellLocated));
 
                         if  ( correctHeapCellLocated )
@@ -404,7 +402,7 @@
     TInt err = iEngine.Driver().WalkHeapGetCellInfo( aCellAddress, cellType, cellLength, cellNestingLevel, cellAllocationNumber, cellHeaderSize, cellPayloadAddress );
     TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - err: %d, cellAddress: 0x%08x, cellLength: %d, cellAllocationNumber: %d, cellType: %d", err, aCellAddress, cellLength, cellAllocationNumber, cellType));
 
-    if  ( err == KErrNone && cellType == EMemSpyDriverGoodAllocatedCell )
+	if (err == KErrNone && (cellType & EMemSpyDriverAllocatedCellMask))
         {
         // Check that the cell size meets our expectations - it should be a CObjectCon cell.
         const TInt expectedCellSize = sizeof(CObjectCon*) + cellHeaderSize;
@@ -520,7 +518,7 @@
     TInt err = iEngine.Driver().WalkHeapGetCellInfo( aArrayCellAddress, cellType, cellLength, cellNestingLevel, cellAllocationNumber, cellHeaderSize, cellPayloadAddress );
     TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC() - err: %d, cellAddress: 0x%08x, cellLength: %d, cellAllocationNumber: %d, cellType: %d", err, aArrayCellAddress, cellLength, cellAllocationNumber, cellType));
 
-    if  ( err == KErrNone && cellType == EMemSpyDriverGoodAllocatedCell )
+    if (err == KErrNone && (cellType & EMemSpyDriverAllocatedCellMask))
         {
         // Check that the cell size meets our expectations. 
         // The cell should be a very specific length
@@ -577,13 +575,13 @@
     }
 
 
-TBool CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL( const TDesC8& aData, TAny* aCellAddress, TAny* aPayloadAddress, TUint aHeapStartingAddress, TUint aHeapSize )
+TBool CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL( const TDesC8& aData, TAny* aCellAddress, TAny* aPayloadAddress, TUint aHeapStartingAddress, TUint aHeapMaxSize )
     {
     (void) aPayloadAddress;
     (void) aCellAddress;
-    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - START - aDataLen: %d, aCellAddress: 0x%08x, aPayloadAddress: 0x%08x, aHeapStartingAddress: 0x%08x, aHeapSize: %d", aData.Length(), aCellAddress, aPayloadAddress, aHeapStartingAddress, aHeapSize ));
+    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - START - aDataLen: %d, aCellAddress: 0x%08x, aPayloadAddress: 0x%08x, aHeapStartingAddress: 0x%08x, aHeapSize: %d", aData.Length(), aCellAddress, aPayloadAddress, aHeapStartingAddress, aHeapMaxSize ));
 
-    const TUint KFbServHeapCeilingAddress = aHeapStartingAddress + aHeapSize;
+    const TUint KFbServHeapCeilingAddress = aHeapStartingAddress + aHeapMaxSize;
 
     // Whether we can use this cell's data...
     TBool correctCell = EFalse;
@@ -746,7 +744,7 @@
     TInt err = iEngine.Driver().WalkHeapGetCellInfo( aCellAddress, cellType, cellLength, cellNestingLevel, cellAllocationNumber, cellHeaderSize, cellPayloadAddress );
     TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - err: %d, cellAddress: 0x%08x, cellLength: %d, cellAllocationNumber: %d, cellType: %d", err, aCellAddress, cellLength, cellAllocationNumber, cellType));
 
-    if  ( err == KErrNone && cellType == EMemSpyDriverGoodAllocatedCell )
+    if (err == KErrNone && (cellType & EMemSpyDriverAllocatedCellMask))
         {
         // Check that the cell size meets our expectations - it should be a CBitmapObject, but without the additional "this" pointer
         // which we have tacked onto the object.
--- a/memspy/Engine/Source/Helpers/MemSpyEngineHelperHeap.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/Helpers/MemSpyEngineHelperHeap.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -45,6 +45,7 @@
 _LIT( KCellTypeBadAllocatedCellAddress,  "[Bad Allocated Cell Address]");
 _LIT( KCellTypeBadFreeCellAddress,       "[Bad Free Cell Address]     ");
 _LIT( KCellTypeBadFreeCellSize,          "[Bad Free Cell Size]        ");
+_LIT( KCellTypeBad,                      "[Bad Cell]                  ");
 _LIT( KCellTypeUnknown,                  "[Unknown!]                  ");
 _LIT( KCellListLineFormat, "%S cell: 0x%08x, cellLen: %8d, allocNum: %8d, nestingLev: %8d, cellData: 0x%08x, cellDataAddr: 0x%08x, headerSize: %02d");
 _LIT( KMemSpyMarkerHeapData, "<%SMEMSPY_HEAP_DATA_%03d>" );
@@ -104,7 +105,7 @@
         {
         UpdateSharedHeapInfoL( aThread.Process().Id(), aThread.Id(), heapInfo );
         }
-    if  ( error == KErrNone && heapInfo.Type() == TMemSpyHeapInfo::ETypeRHeap )
+    if  ( error == KErrNone && heapInfo.Type() != TMemSpyHeapInfo::ETypeUnknown )
         {
         // Get thread name for context
         const TFullName pName( aThread.FullName() );
@@ -159,36 +160,43 @@
                 TUint fourByteCellData = 0;
                 TPtrC pType(KNullDesC);
                 //
-                switch(cellType)
-                    {
-                case EMemSpyDriverGoodAllocatedCell:
-                    {
+				if (cellType & EMemSpyDriverAllocatedCellMask)
+					{
                     r = iEngine.Driver().WalkHeapReadCellData( cellAddress, cellData, 4 );
                     if  ( r == KErrNone )
                         {
                         fourByteCellData = DescriptorAsDWORD( cellData );
                         }
                     pType.Set(KCellTypeGoodAllocatedCell);
-                    break;
                     }
-                case EMemSpyDriverGoodFreeCell:
+				else if (cellType & EMemSpyDriverFreeCellMask)
+					{
                     pType.Set(KCellTypeGoodFreeCell);
-                    break;
-                case EMemSpyDriverBadAllocatedCellSize:
-                    pType.Set(KCellTypeBadAllocatedCellSize);
-                    break;
-                case EMemSpyDriverBadAllocatedCellAddress:
-                    pType.Set(KCellTypeBadAllocatedCellAddress);
-                    break;
-                case EMemSpyDriverBadFreeCellAddress:
-                    pType.Set(KCellTypeBadFreeCellAddress);
-                    break;
-                case EMemSpyDriverBadFreeCellSize:
-                    pType.Set(KCellTypeBadFreeCellSize);
-                    break;
-                default:
+					}
+				else if (cellType & EMemSpyDriverBadCellMask)
+					{
+					switch (cellType)
+						{
+					case EMemSpyDriverHeapBadAllocatedCellSize:
+						pType.Set(KCellTypeBadAllocatedCellSize);
+						break;
+					case EMemSpyDriverHeapBadAllocatedCellAddress:
+						pType.Set(KCellTypeBadAllocatedCellAddress);
+						break;
+					case EMemSpyDriverHeapBadFreeCellAddress:
+						pType.Set(KCellTypeBadFreeCellAddress);
+						break;
+					case EMemSpyDriverHeapBadFreeCellSize:
+						pType.Set(KCellTypeBadFreeCellSize);
+						break;
+					default:
+						pType.Set(KCellTypeBad);
+						break;
+						}
+					}
+				else
+					{
                     pType.Set(KCellTypeUnknown);
-                    break;
                     }
 
                 if  ( r == KErrNone )
@@ -241,31 +249,30 @@
     // Make sure the process is suspended for the entire time we are manipulating it's heap
     iEngine.ProcessSuspendLC( aThread.Process().Id() );
 
-    // Get the heap info, including free cell information
-    RArray<TMemSpyDriverFreeCell> freeCells;
-    CleanupClosePushL( freeCells );
+    // Get the heap info, including cell information
+    RArray<TMemSpyDriverCell> cells;
+    CleanupClosePushL( cells );
     TMemSpyHeapInfo heapInfo;
     TRACE( RDebug::Printf( "CMemSpyEngineHelperHeap::OutputHeapDataUserL() - checksum1: 0x%08x", heapInfo.AsRHeap().Statistics().StatsFree().Checksum() ) );
-    GetHeapInfoUserL( aThread.Process().Id(), aThread.Id(), heapInfo, &freeCells );
+    GetHeapInfoUserL(aThread.Process().Id(), aThread.Id(), heapInfo, &cells, ETrue);
     TRACE( RDebug::Printf( "CMemSpyEngineHelperHeap::OutputHeapDataUserL() - checksum2: 0x%08x", heapInfo.AsRHeap().Statistics().StatsFree().Checksum() ) );
 
     // Get the heap data
     const TFullName pName( aThread.FullName() );
-    OutputHeapDataUserL( aThread.Process().Id(), aThread.Id(), pName, heapInfo, aCreateDataStream, &freeCells );
-    CleanupStack::PopAndDestroy( &freeCells );
+    OutputHeapDataUserL( aThread.Process().Id(), aThread.Id(), pName, heapInfo, aCreateDataStream, &cells );
+    CleanupStack::PopAndDestroy( &cells );
 
     // Resume process
     CleanupStack::PopAndDestroy();
     }
 
 
-EXPORT_C void CMemSpyEngineHelperHeap::OutputHeapDataUserL( const TProcessId& aPid, const TThreadId& aTid, const TDesC& aThreadName, const TMemSpyHeapInfo& aInfo, const RArray<TMemSpyDriverFreeCell>* aFreeCells )
+EXPORT_C void CMemSpyEngineHelperHeap::OutputHeapDataUserL(const TProcessId& aPid, const TThreadId& aTid, const TDesC& aThreadName, const TMemSpyHeapInfo& aInfo, const RArray<TMemSpyDriverCell>* aCells)
     {
-    OutputHeapDataUserL( aPid, aTid, aThreadName, aInfo, ETrue, aFreeCells );
+    OutputHeapDataUserL(aPid, aTid, aThreadName, aInfo, ETrue, aCells);
     }
 
-
-void CMemSpyEngineHelperHeap::OutputHeapDataUserL( const TProcessId& aPid, const TThreadId& aTid, const TDesC& aThreadName, const TMemSpyHeapInfo& aInfo, TBool aCreateDataStream, const RArray<TMemSpyDriverFreeCell>* aFreeCells )
+void CMemSpyEngineHelperHeap::OutputHeapDataUserL( const TProcessId& aPid, const TThreadId& aTid, const TDesC& aThreadName, const TMemSpyHeapInfo& aInfo, TBool aCreateDataStream, const RArray<TMemSpyDriverCell>* aCells )
     {
     TBuf<KMaxFullName + 100> printFormat;
 
@@ -291,7 +298,7 @@
     iEngine.Sink().OutputPrefixSetFormattedLC( KMemSpyPrefixHeapData, &aThreadName );
 
     // Info section
-    OutputHeapInfoL( aInfo, aThreadName, aFreeCells );
+    OutputHeapInfoL( aInfo, aThreadName, aCells );
 
     // Code segments (needed for map file reading...)
     _LIT(KCellListCodeSegInfoFormat, "CodeSegs - ");
@@ -315,14 +322,25 @@
     TRACE( RDebug::Printf( "CMemSpyEngineHelperHeap::OutputHeapDataUserL() - checksum: 0x%08x", checksum ) );
 
     TInt r = iEngine.Driver().GetHeapData( aTid, checksum, pData, readAddress, remaining );
-    if  ( r == KErrNone )
+	TUint prevEndAddress = readAddress + pData.Length();
+    if (r == KErrNone)
         {
-        while ( r == KErrNone )
+        while (r == KErrNone)
             {
+			if (readAddress > prevEndAddress)
+				{
+				// We've hit a discontinuity, ie one or more unmapped pages
+				_LIT(KBreak, "........");
+				iEngine.Sink().OutputLineL(KBreak);
+				}
             _LIT(KHeapDumpDataFormat, "%S");
-            iEngine.Sink().OutputBinaryDataL( KHeapDumpDataFormat, pData.Ptr(), (const TUint8*) readAddress, pData.Length() );
-            if  ( remaining > 0 )
-                r = iEngine.Driver().GetHeapDataNext( aTid, pData, readAddress, remaining );
+            iEngine.Sink().OutputBinaryDataL(KHeapDumpDataFormat, pData.Ptr(), (const TUint8*) readAddress, pData.Length());
+			readAddress += pData.Length();
+            if (remaining > 0)
+				{
+				prevEndAddress = readAddress;
+                r = iEngine.Driver().GetHeapDataNext(aTid, pData, readAddress, remaining);
+				}
             else
                 break;
             }
@@ -365,11 +383,9 @@
 
 
 
-
-
-EXPORT_C void CMemSpyEngineHelperHeap::OutputHeapInfoL( const TMemSpyHeapInfo& aInfo, const TDesC& aThreadName, const RArray<TMemSpyDriverFreeCell>* aFreeCells )
-    {
-    CMemSpyEngineOutputList* list = NewHeapSummaryExtendedLC( aInfo, aFreeCells );
+EXPORT_C void CMemSpyEngineHelperHeap::OutputHeapInfoL( const TMemSpyHeapInfo& aInfo, const TDesC& aThreadName, const RArray<TMemSpyDriverCell>* aCells )
+	{
+    CMemSpyEngineOutputList* list = NewHeapSummaryExtendedLC(aInfo, aCells);
 
     // Format the thread name according to upper/lower case request parameters
     _LIT( KOverallCaption1, "HEAP INFO FOR THREAD '%S'");
@@ -416,7 +432,6 @@
     {
     const TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
     const TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
-    const TMemSpyHeapObjectDataRHeap& rHeapObjectData = rHeapInfo.ObjectData();
     const TMemSpyHeapStatisticsRHeap& rHeapStats = rHeapInfo.Statistics();
 
     // Example:
@@ -456,20 +471,20 @@
                                          aIndex,
                                          aInfo.Tid(),
                                          rHeapMetaData.ChunkHandle(),
-                                         rHeapObjectData.Base(),
-                                         rHeapObjectData.Size(),
-                                         rHeapObjectData.iMinLength,
-                                         rHeapObjectData.iMaxLength,
-                                         rHeapObjectData.iFree.next,
-                                         rHeapObjectData.iFree.len,
+                                         /*rHeapObjectData.Base(),*/ rHeapMetaData.iAllocatorAddress,
+                                         /*rHeapObjectData.Size(),*/ rHeapMetaData.iHeapSize,
+                                         /*rHeapObjectData.iMinLength,*/ rHeapMetaData.iMinHeapSize,
+                                         /*rHeapObjectData.iMaxLength,*/ rHeapMetaData.iMaxHeapSize,
+                                         /*rHeapObjectData.iFree.next,*/ NULL,
+                                         /*rHeapObjectData.iFree.len,*/ 0,
                                          rHeapStats.StatsFree().TypeCount(),
                                          rHeapStats.StatsFree().TypeSize(),
                                          rHeapStats.StatsFree().SlackSpaceCellSize(),
                                          rHeapStats.StatsFree().LargestCellSize(),
                                          rHeapStats.StatsAllocated().LargestCellSize(),
-                                         rHeapObjectData.iCellCount,
-                                         rHeapObjectData.iMinCell,
-                                         rHeapObjectData.iTotalAllocSize,
+                                         /*rHeapObjectData.iCellCount,*/ rHeapStats.StatsAllocated().TypeCount(),
+                                         /*rHeapObjectData.iMinCell,*/ 0,
+                                         /*rHeapObjectData.iTotalAllocSize,*/ rHeapStats.StatsAllocated().TypeSize(),
                                          rHeapMetaData.IsSharedHeap(),
                                          &KFmtFields,
                                          aIndex
@@ -519,7 +534,7 @@
         // Get kernel heap info
         GetHeapInfoKernelL( info );
 
-        if ( info.Type() == TMemSpyHeapInfo::ETypeRHeap )
+        if ( info.Type() != TMemSpyHeapInfo::ETypeUnknown )
             {
             TName threadName;
             MemSpyEngineUtils::GetKernelHeapThreadAndProcessNames( threadName, processName );
@@ -546,7 +561,7 @@
                     {
                     UpdateSharedHeapInfoL( process.Id(), thread.Id(), info );
                     }
-                if  ( error == KErrNone && info.Type() == TMemSpyHeapInfo::ETypeRHeap )
+                if  ( error == KErrNone && info.Type() != TMemSpyHeapInfo::ETypeUnknown )
                     {
                     OutputCSVEntryL( index++, info, threadName, processName );
                     }
@@ -577,16 +592,21 @@
 
 
 
-EXPORT_C void CMemSpyEngineHelperHeap::GetHeapInfoUserL( const TProcessId& aProcess, const TThreadId& aThread, TMemSpyHeapInfo& aInfo, RArray<TMemSpyDriverFreeCell>* aFreeCells )
+EXPORT_C void CMemSpyEngineHelperHeap::GetHeapInfoUserL(const TProcessId& aProcess, const TThreadId& aThread, TMemSpyHeapInfo& aInfo, RArray<TMemSpyDriverFreeCell>* aFreeCells)
+    {
+	GetHeapInfoUserL(aProcess, aThread, aInfo, aFreeCells, EFalse);
+	}
+
+EXPORT_C void CMemSpyEngineHelperHeap::GetHeapInfoUserL(const TProcessId& aProcess, const TThreadId& aThread, TMemSpyHeapInfo& aInfo, RArray<TMemSpyDriverCell>* aCells, TBool aCollectAllocatedCellsAsWellAsFree)
     {
     iEngine.ProcessSuspendLC( aProcess );
     TRACE( RDebug::Printf( "CMemSpyEngineHelperHeap::GetHeapInfoUserL() - checksum1: 0x%08x", aInfo.AsRHeap().Statistics().StatsFree().Checksum() ) );
     
     TInt r = KErrNone;
     //
-    if  ( aFreeCells )
+    if  (aCells)
         {
-        r = iEngine.Driver().GetHeapInfoUser( aInfo, aThread, *aFreeCells );
+        r = iEngine.Driver().GetHeapInfoUser( aInfo, aThread, *aCells, aCollectAllocatedCellsAsWellAsFree);
         }
     else
         {
@@ -736,9 +756,11 @@
     _LIT(KHeaderDump, "Heap Data");
     iEngine.Sink().OutputSectionHeadingL( KHeaderDump, '-' );
 
-    _LIT(KHeapDumpDataFormat, "%S");
+    /*TOMSCI TODO this stuff needs fixing
+	_LIT(KHeapDumpDataFormat, "%S");
     const TUint8* heapBaseAddress = info.AsRHeap().ObjectData().Base();
     iEngine.Sink().OutputBinaryDataL( KHeapDumpDataFormat, data->Ptr(), heapBaseAddress, data->Length() );
+	*/
 
     CleanupStack::PopAndDestroy(); // clear prefix
     CleanupStack::PopAndDestroy( data );
@@ -795,22 +817,29 @@
         _LIT( KItem0_Type_Unknown, "Unknown" );
         list->AddItemL( KItem0, KItem0_Type_Unknown );
         }
-    else if ( aInfo.Type() == TMemSpyHeapInfo::ETypeRHeap )
+    else
         {
         const TMemSpyHeapInfoRHeap& rHeap = aInfo.AsRHeap();
         const TMemSpyHeapMetaDataRHeap& metaData = rHeap.MetaData();
-        const TMemSpyHeapObjectDataRHeap& objectData = rHeap.ObjectData();
         const TMemSpyHeapStatisticsRHeap& statistics = rHeap.Statistics();
 
         _LIT( KItem0_Type_RHeap, "RHeap" );
-        list->AddItemL( KItem0, KItem0_Type_RHeap );
+        _LIT( KItem0_Type_RHybridHeap, "RHybridHeap" );
+		if (aInfo.Type() == TMemSpyHeapInfo::ETypeRHeap)
+			{
+	        list->AddItemL( KItem0, KItem0_Type_RHeap );
+			}
+		else
+			{
+	        list->AddItemL( KItem0, KItem0_Type_RHybridHeap );
+			}
 
         // Heap size is the size of the heap minus the size of the embedded (in-place) RHeap. 
         _LIT( KItem1, "Heap size" );
-        list->AddItemL( KItem1, objectData.Size() );
+        list->AddItemL(KItem1, metaData.iHeapSize);
 
-        _LIT( KItem8b, "Heap base address" );
-        list->AddItemHexL( KItem8b, (TUint) objectData.Base() );
+        _LIT( KItem8b, "Allocator address" );
+        list->AddItemHexL( KItem8b, (TUint)metaData.iAllocatorAddress );
         
         _LIT( KItem1b, "Shared" );
         list->AddItemYesNoL( KItem1b, metaData.IsSharedHeap() );
@@ -845,34 +874,21 @@
         // Fragmentation is a measurement of free space scattered throughout the heap, but ignoring
         // any slack space at the end (which can often be recovered, to the granularity of one page of ram)
         _LIT( KItem8a, "Fragmentation" );
-        list->AddItemPercentageL( KItem8a, objectData.Size(), ( statistics.StatsFree().TypeSize()  - statistics.StatsFree().SlackSpaceCellSize() ) );
-
-        _LIT( KItem13, "Header size (A)" );
-        list->AddItemL( KItem13, metaData.HeaderSizeAllocated() );
-
-        _LIT( KItem14, "Header size (F)" );
-        list->AddItemL( KItem14, metaData.HeaderSizeFree() );
+        list->AddItemPercentageL( KItem8a, metaData.iHeapSize, ( statistics.StatsFree().TypeSize()  - statistics.StatsFree().SlackSpaceCellSize() ) );
 
-        _LIT( KItem9a, "Overhead (alloc)" );
-        const TInt allocOverhead = metaData.HeaderSizeAllocated() * statistics.StatsAllocated().TypeCount();
-        list->AddItemL( KItem9a, allocOverhead );
-
-        _LIT( KItem9b, "Overhead (free)" );
-        const TInt freeOverhead = metaData.HeaderSizeFree() * statistics.StatsFree().TypeCount();
-        list->AddItemL( KItem9b, freeOverhead );
 
         _LIT( KItem9c, "Overhead (total)" );
-        const TInt totalOverhead = freeOverhead + allocOverhead;
+		const TInt totalOverhead = metaData.iHeapSize - statistics.StatsAllocated().TypeSize();
         list->AddItemL( KItem9c, totalOverhead );
 
         _LIT( KItem9d, "Overhead" );
-        list->AddItemPercentageL( KItem9d, objectData.Size(), totalOverhead  );
+        list->AddItemPercentageL( KItem9d, metaData.iHeapSize, totalOverhead  );
 
         _LIT( KItem10, "Min. length" );
-        list->AddItemL( KItem10, objectData.iMinLength );
+        list->AddItemL( KItem10, metaData.iMinHeapSize );
 
         _LIT( KItem11, "Max. length" );
-        list->AddItemL( KItem11, objectData.iMaxLength );
+        list->AddItemL( KItem11, metaData.iMaxHeapSize );
 
         _LIT( KItem12, "Debug Allocator Library" );
         list->AddItemYesNoL( KItem12, metaData.IsDebugAllocator() );
@@ -882,23 +898,78 @@
     }
 
 
-EXPORT_C CMemSpyEngineOutputList* CMemSpyEngineHelperHeap::NewHeapSummaryExtendedLC( const TMemSpyHeapInfo& aInfo, const RArray<TMemSpyDriverFreeCell>* aFreeCells )
-    {
+EXPORT_C CMemSpyEngineOutputList* CMemSpyEngineHelperHeap::NewHeapSummaryExtendedLC( const TMemSpyHeapInfo& aInfo, const RArray<TMemSpyDriverCell>* aCells )
+	{
     CMemSpyEngineOutputList* list = CMemSpyEngineOutputList::NewLC( iEngine.Sink() );
     //
     AppendMetaDataL( aInfo, *list );
-    AppendObjectDataL( aInfo, *list );
     AppendStatisticsL( aInfo, *list );
     //
-    if  ( aFreeCells )
+    if  ( aCells )
         {
-        AppendFreeCellsL( *aFreeCells, *list );
+        AppendCellsL( *aCells, *list );
         }
     //
     return list;
     }
 
 
+//cigasto: not formatted - raw heap info 
+EXPORT_C TMemSpyHeapData CMemSpyEngineHelperHeap::NewHeapRawInfo( const TMemSpyHeapInfo& aInfo )
+	{
+	_LIT(KUnknown, "Unknown");
+	TMemSpyHeapData list;
+	list.iType.Copy(KUnknown);
+
+	// Heap type	
+	if (aInfo.Type() != TMemSpyHeapInfo::ETypeUnknown)
+		{
+		const TMemSpyHeapInfoRHeap& rHeap = aInfo.AsRHeap();
+		const TMemSpyHeapMetaDataRHeap& metaData = rHeap.MetaData();
+		const TMemSpyHeapStatisticsRHeap& statistics = rHeap.Statistics();
+
+		_LIT(KRHeap, "RHeap");
+		_LIT(KRHybridHeap, "RHybridHeap");
+		switch (aInfo.Type())
+			{
+			case TMemSpyHeapInfo::ETypeRHeap:
+				list.iType.Copy(KRHeap);
+				break;
+			case TMemSpyHeapInfo::ETypeRHybridHeap:
+				list.iType.Copy(KRHybridHeap);
+				break;
+			default:
+				break;
+			}
+
+	    // Heap size is the total amount of memory committed to the heap, which includes the size of the embedded (in-place) RHeap/RHybridHeap.
+	    list.iSize = metaData.iHeapSize;
+	    list.iBaseAddress = (TUint)metaData.iAllocatorAddress; // TODO we can't do the base address any more, allocator address is the closest thing
+	    list.iShared = metaData.IsSharedHeap();
+	    list.iChunkSize = metaData.ChunkSize();
+	    list.iAllocationsCount = statistics.StatsAllocated().TypeCount();
+	    list.iFreeCount = statistics.StatsFree().TypeCount();
+	    list.iBiggestAllocation = statistics.StatsAllocated().LargestCellSize();
+	    list.iBiggestFree = statistics.StatsFree().LargestCellSize();
+	    list.iTotalAllocations =  statistics.StatsAllocated().TypeSize();	        
+	    list.iTotalFree =  statistics.StatsFree().TypeSize();
+	    list.iSlackFreeSpace = statistics.StatsFree().SlackSpaceCellSize();
+	    list.iFragmentation = statistics.StatsFree().TypeSize() - statistics.StatsFree().SlackSpaceCellSize(); //to calculate percentage value use iSize as 100% value
+	    list.iHeaderSizeA = 0; //metaData.HeaderSizeAllocated();
+	    list.iHeaderSizeF = 0; //metaData.HeaderSizeFree();
+	    TInt allocOverhead = rHeap.Overhead(); //metaData.HeaderSizeAllocated() * statistics.StatsAllocated().TypeCount();
+	    list.iAllocationOverhead = allocOverhead;
+	    //TInt freeOverhead = metaData.HeaderSizeFree() * statistics.StatsFree().TypeCount();
+	    list.iFreeOverhead = 0; // TODO there is no way of calculating this
+	    list.iTotalOverhead = allocOverhead; // freeOverhead + allocOverhead
+	    list.iOverhead = allocOverhead; //freeOverhead + allocOverhead; //to calculate percentage value use iSize as 100% value    
+	    list.iMinLength = metaData.iMinHeapSize;
+	    list.iMaxLength = metaData.iMaxHeapSize;
+	    list.iDebugAllocatorLibrary = metaData.IsDebugAllocator();
+		}
+
+	return list;
+	}
 
 
 
@@ -952,7 +1023,7 @@
 
     // Type
     _LIT( KMetaData_Type,  "Type:" );
-    if ( aInfo.Type() != TMemSpyHeapInfo::ETypeRHeap )
+    if ( aInfo.Type() == TMemSpyHeapInfo::ETypeUnknown )
         {
         _LIT( KMetaData_Type_Unknown,  "Unknown" );
         aList.AddItemL( KMetaData_Type, KMetaData_Type_Unknown );
@@ -963,15 +1034,23 @@
     
         // Type
         _LIT( KMetaData_Type_RHeap,  "Symbian OS RHeap" );
-        aList.AddItemL( KMetaData_Type, KMetaData_Type_RHeap );
+        _LIT( KMetaData_Type_RHybridHeap,  "Symbian OS RHybridHeap" );
+		if (aInfo.Type() == TMemSpyHeapInfo::ETypeRHeap)
+			{
+	        aList.AddItemL( KMetaData_Type, KMetaData_Type_RHeap );
+			}
+		else
+			{
+			aList.AddItemL( KMetaData_Type, KMetaData_Type_RHybridHeap );
+			}
 
         // VTable
-        _LIT( KMetaData_VTable,  "VTable:" );
-        aList.AddItemHexL( KMetaData_VTable, metaData.VTable() );
+        //_LIT( KMetaData_VTable,  "VTable:" );
+        //aList.AddItemHexL( KMetaData_VTable, metaData.VTable() );
 
         // Object size
-        _LIT( KMetaData_ObjectSize,  "Object Size:" );
-        aList.AddItemL( KMetaData_ObjectSize, metaData.ClassSize() );
+        //_LIT( KMetaData_ObjectSize,  "Object Size:" );
+        //aList.AddItemL( KMetaData_ObjectSize, metaData.ClassSize() );
 
         // Chunk name
         _LIT( KMetaData_ChunkName,  "Chunk Name:" );
@@ -990,14 +1069,6 @@
         _LIT( KMetaData_DebugAllocator,  "Debug Allocator:" );
         aList.AddItemYesNoL( KMetaData_DebugAllocator, metaData.IsDebugAllocator() );
 
-        // Cell header overhead (free cells)
-        _LIT( KMetaData_CellHeaderOverheadFree,  "Overhead (Free):" );
-        aList.AddItemL( KMetaData_CellHeaderOverheadFree, metaData.HeaderSizeFree() );
-
-        // Cell header overhead (allocated cells)
-        _LIT( KMetaData_CellHeaderOverheadAlloc,  "Overhead (Alloc):" );
-        aList.AddItemL( KMetaData_CellHeaderOverheadAlloc, metaData.HeaderSizeAllocated() );
-
         // Shared Heap
         _LIT( KMetaData_Shared,  "Shared:" );
         aList.AddItemYesNoL( KMetaData_Shared, metaData.IsSharedHeap() );
@@ -1009,90 +1080,9 @@
     aList.AddBlankItemL( 1 );
     }
 
-
-void CMemSpyEngineHelperHeap::AppendObjectDataL( const TMemSpyHeapInfo& aInfo, CMemSpyEngineOutputList& aList )
-    {
-    if ( aInfo.Type() == TMemSpyHeapInfo::ETypeRHeap )
-        {
-        const TMemSpyHeapInfoRHeap& rHeap = aInfo.AsRHeap();
-        const TMemSpyHeapObjectDataRHeap& objectData = rHeap.ObjectData();
-
-        // Make caption
-        _LIT( KOverallCaption1, "RAllocator" );
-        aList.AddItemL( KOverallCaption1 );
-        aList.AddUnderlineForPreviousItemL( '=', 0 );
-
-        // RAllocator
-        _LIT( KObjectData_RAllocator_iAccessCount,  "RAllocator::iAccessCount" );
-        aList.AddItemL( KObjectData_RAllocator_iAccessCount, objectData.iAccessCount );
-        _LIT( KObjectData_RAllocator_iHandleCount,  "RAllocator::iHandleCount" );
-        aList.AddItemL( KObjectData_RAllocator_iHandleCount, objectData.iHandleCount );
-        _LIT( KObjectData_RAllocator_iHandles,  "RAllocator::iHandles" );
-        aList.AddItemL( KObjectData_RAllocator_iHandles, objectData.iHandles );
-        _LIT( KObjectData_RAllocator_iFlags,  "RAllocator::iFlags" );
-        aList.AddItemHexL( KObjectData_RAllocator_iFlags, objectData.iFlags );
-        _LIT( KObjectData_RAllocator_iCellCount,  "RAllocator::iCellCount" );
-        aList.AddItemL( KObjectData_RAllocator_iCellCount, objectData.iCellCount );
-        _LIT( KObjectData_RAllocator_iTotalAllocSize,  "RAllocator::iTotalAllocSize" );
-        aList.AddItemL( KObjectData_RAllocator_iTotalAllocSize, objectData.iTotalAllocSize );
-
-        aList.AddBlankItemL( 1 );
-
-        // Make caption
-        _LIT( KOverallCaption2, "RHeap" );
-        aList.AddItemL( KOverallCaption2 );
-        aList.AddUnderlineForPreviousItemL( '=', 0 );
-
-        // RHeap
-        _LIT( KObjectData_RHeap_iMinLength,  "RHeap::iMinLength" );
-        aList.AddItemL( KObjectData_RHeap_iMinLength, objectData.iMinLength );
-        _LIT( KObjectData_RHeap_iMaxLength,  "RHeap::iMaxLength" );
-        aList.AddItemL( KObjectData_RHeap_iMaxLength, objectData.iMaxLength );
-        _LIT( KObjectData_RHeap_iOffset,  "RHeap::iOffset" );
-        aList.AddItemL( KObjectData_RHeap_iOffset, objectData.iOffset );
-        _LIT( KObjectData_RHeap_iGrowBy,  "RHeap::iGrowBy" );
-        aList.AddItemL( KObjectData_RHeap_iGrowBy, objectData.iGrowBy );
-        _LIT( KObjectData_RHeap_iChunkHandle,  "RHeap::iChunkHandle" );
-        aList.AddItemHexL( KObjectData_RHeap_iChunkHandle, objectData.iChunkHandle );
-        _LIT( KObjectData_RHeap_iBase,  "RHeap::iBase" );
-        aList.AddItemL( KObjectData_RHeap_iBase, objectData.iBase );
-        _LIT( KObjectData_RHeap_iTop,  "RHeap::iTop" );
-        aList.AddItemL( KObjectData_RHeap_iTop, objectData.iTop );
-        _LIT( KObjectData_RHeap_iAlign,  "RHeap::iAlign" );
-        aList.AddItemL( KObjectData_RHeap_iAlign, objectData.iAlign );
-        _LIT( KObjectData_RHeap_iMinCell,  "RHeap::iMinCell" );
-        aList.AddItemL( KObjectData_RHeap_iMinCell, objectData.iMinCell );
-        _LIT( KObjectData_RHeap_iPageSize,  "RHeap::iPageSize" );
-        aList.AddItemL( KObjectData_RHeap_iPageSize, objectData.iPageSize );
-        _LIT( KObjectData_RHeap_iFree_next,  "RHeap::iFree.next" );
-        aList.AddItemL( KObjectData_RHeap_iFree_next, objectData.iFree.next );
-        _LIT( KObjectData_RHeap_iFree_len,  "RHeap::iFree.len" );
-        aList.AddItemL( KObjectData_RHeap_iFree_len, objectData.iFree.len );
-        _LIT( KObjectData_RHeap_iNestingLevel,  "RHeap::iNestingLevel" );
-        aList.AddItemL( KObjectData_RHeap_iNestingLevel, objectData.iNestingLevel );
-        _LIT( KObjectData_RHeap_iAllocCount,  "RHeap::iAllocCount" );
-        aList.AddItemL( KObjectData_RHeap_iAllocCount, objectData.iAllocCount );
-        _LIT( KObjectData_RHeap_iFailType,  "RHeap::iFailType" );
-        aList.AddItemL( KObjectData_RHeap_iFailType, (TInt) objectData.iFailType );
-        _LIT( KObjectData_RHeap_iFailRate,  "RHeap::iFailRate" );
-        aList.AddItemL( KObjectData_RHeap_iFailRate, objectData.iFailRate );
-        _LIT( KObjectData_RHeap_iFailed,  "RHeap::iFailed" );
-        aList.AddItemTrueFalseL( KObjectData_RHeap_iFailed, objectData.iFailed );
-        _LIT( KObjectData_RHeap_iFailAllocCount,  "RHeap::iFailAllocCount" );
-        aList.AddItemL( KObjectData_RHeap_iFailAllocCount, objectData.iFailAllocCount );
-        _LIT( KObjectData_RHeap_iRand,  "RHeap::iRand" );
-        aList.AddItemL( KObjectData_RHeap_iRand, objectData.iRand );
-        _LIT( KObjectData_RHeap_iTestData,  "RHeap::iTestData" );
-        aList.AddItemL( KObjectData_RHeap_iTestData, objectData.iTestData );
-
-        aList.AddBlankItemL( 1 );
-        }
-    }
-
-
 void CMemSpyEngineHelperHeap::AppendStatisticsL( const TMemSpyHeapInfo& aInfo, CMemSpyEngineOutputList& aList )
     {
-    if ( aInfo.Type() == TMemSpyHeapInfo::ETypeRHeap )
+    if (aInfo.Type() != TMemSpyHeapInfo::ETypeUnknown)
         {
         const TMemSpyHeapInfoRHeap& rHeap = aInfo.AsRHeap();
         const TMemSpyHeapStatisticsRHeap& rHeapStats = rHeap.Statistics();
@@ -1112,10 +1102,13 @@
         aList.AddItemL( KStatsData_CellSize, rHeapStats.StatsFree().TypeSize() );
         aList.AddItemL( KStatsData_LargestCellAddress, rHeapStats.StatsFree().LargestCellAddress() );
         aList.AddItemL( KStatsData_LargestCellSize, rHeapStats.StatsFree().LargestCellSize() );
-        _LIT( KStatsData_Free_SlackCellAddress,  "Slack:" );
-        aList.AddItemL( KStatsData_Free_SlackCellAddress, rHeapStats.StatsFree().SlackSpaceCellAddress() );
-        _LIT( KStatsData_Free_SlackCellSize,  "Slack size:" );
-        aList.AddItemL( KStatsData_Free_SlackCellSize, rHeapStats.StatsFree().SlackSpaceCellSize() );
+		if (aInfo.Type() == TMemSpyHeapInfo::ETypeRHeap)
+			{
+			_LIT( KStatsData_Free_SlackCellAddress,  "Slack:" );
+			aList.AddItemL( KStatsData_Free_SlackCellAddress, rHeapStats.StatsFree().SlackSpaceCellAddress() );
+			_LIT( KStatsData_Free_SlackCellSize,  "Slack size:" );
+			aList.AddItemL( KStatsData_Free_SlackCellSize, rHeapStats.StatsFree().SlackSpaceCellSize() );
+			}
         _LIT( KStatsData_Free_Checksum,  "Checksum:" );
         aList.AddItemHexL( KStatsData_Free_Checksum, rHeapStats.StatsFree().Checksum() );
 
@@ -1132,44 +1125,61 @@
         aList.AddItemL( KStatsData_LargestCellSize, rHeapStats.StatsAllocated().LargestCellSize() );
 
         aList.AddBlankItemL( 1 );
-
-        // Common
-        _LIT( KOverallCaption3, "Common Statistics" );
-        aList.AddItemL( KOverallCaption3 );
-        aList.AddUnderlineForPreviousItemL( '=', 0 );
-
-        _LIT( KStatsData_Common_TotalCellCount,  "Total cell count:" );
-        aList.AddItemL( KStatsData_Common_TotalCellCount, rHeapStats.StatsCommon().TotalCellCount() );
-
-        _LIT( KStatsData_Common_TotalSize,  "Total cell size:" );
-        aList.AddItemL( KStatsData_Common_TotalSize, rHeapStats.StatsAllocated().TypeSize() + rHeapStats.StatsFree().TypeSize() );
-
-        aList.AddBlankItemL( 1 );
-        }
+         }
     }
 
 
-void CMemSpyEngineHelperHeap::AppendFreeCellsL( const RArray<TMemSpyDriverFreeCell>& aFreeCells, CMemSpyEngineOutputList& aList )
+void CMemSpyEngineHelperHeap::AppendCellsL(const RArray<TMemSpyDriverCell>& aCells, CMemSpyEngineOutputList& aList)
     {
-    // Free space
+    // For reasons that may or may not turn out to be sensible, we separate free and allocated cells in the output data
+
     _LIT( KOverallCaption1, "Free Cell List" );
     aList.AddItemL( KOverallCaption1 );
     aList.AddUnderlineForPreviousItemL( '=', 0 );
 
     TBuf<128> caption;
     _LIT( KCaptionFormat, "FC %04d" );
-    _LIT( KValueFormat, "0x%08x %8d %1d" );
+    _LIT( KValueFormat, "0x%08x %8d %d" );
 
-    const TInt count = aFreeCells.Count();
+	TBool foundAllocatedCells = EFalse;
+    const TInt count = aCells.Count();
     for( TInt i=0; i<count; i++ )
         {
-        const TMemSpyDriverFreeCell& cell = aFreeCells[ i ];
-        caption.Format( KCaptionFormat, i + 1 );
-        aList.AddItemFormatL( caption, KValueFormat, cell.iAddress, cell.iLength, cell.iType );
+        const TMemSpyDriverCell& cell = aCells[ i ];
+		if (cell.iType & EMemSpyDriverAllocatedCellMask)
+			{
+			foundAllocatedCells = ETrue;
+			}
+		else if (cell.iType & EMemSpyDriverFreeCellMask)
+			{
+	        caption.Format( KCaptionFormat, i + 1 );
+		    aList.AddItemFormatL( caption, KValueFormat, cell.iAddress, cell.iLength, cell.iType );
+			}
         }
+
+	if (foundAllocatedCells)
+		{
+        aList.AddBlankItemL( 1 );
+		_LIT( KOverallCaption1, "Allocated Cell List" );
+		aList.AddItemL( KOverallCaption1 );
+		aList.AddUnderlineForPreviousItemL( '=', 0 );
+
+		TBuf<128> caption;
+		_LIT( KCaptionFormat, "AC %04d" );
+		_LIT( KValueFormat, "0x%08x %8d %d" );
+
+		for (TInt i = 0; i < count; i++)
+			{
+			const TMemSpyDriverCell& cell = aCells[ i ];
+			if (cell.iType & EMemSpyDriverAllocatedCellMask)
+				{
+				caption.Format( KCaptionFormat, i + 1 );
+				aList.AddItemFormatL( caption, KValueFormat, cell.iAddress, cell.iLength, cell.iType );
+				}
+			}
+		}
     }
 
-
 void CMemSpyEngineHelperHeap::UpdateSharedHeapInfoL( const TProcessId& aProcess, const TThreadId& aThread, TMemSpyHeapInfo& aInfo )
     {
     RArray<TThreadId> threads;
--- a/memspy/Engine/Source/Helpers/MemSpyEngineHelperKernelContainers.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/Helpers/MemSpyEngineHelperKernelContainers.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -247,6 +247,16 @@
     {
     return iType;
     }
+
+EXPORT_C TInt CMemSpyEngineGenericKernelObjectList::Size() const
+    {
+    return iSize;
+    }
+
+EXPORT_C TInt CMemSpyEngineGenericKernelObjectList::ItemsCount() const
+	{
+	return iItems.Count();
+	}
     
 
 EXPORT_C TPtrC CMemSpyEngineGenericKernelObjectList::TypeAsString( TMemSpyDriverContainerType aType )
@@ -392,7 +402,7 @@
     AddItemL( aItem.iHandle );
     iItems.AppendL( aItem );
     //
-    UpdateNameL();
+    //UpdateNameL();
     }
 
 
--- a/memspy/Engine/Source/Helpers/MemSpyEngineHelperStack.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/Helpers/MemSpyEngineHelperStack.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -250,36 +250,22 @@
 
         if  ( r == KErrNone )
             {
-            if ( aType == EMemSpyDriverDomainUser ) {
-                while ( r == KErrNone )
+            while ( r == KErrNone )
+                {
+                iEngine.Sink().OutputBinaryDataL( KStackDataPrefix, pData.Ptr(), (const TUint8*) info.iUserStackBase, pData.Length() );
+                //
+                if  ( remaining > 0 )
                     {
-                    iEngine.Sink().OutputBinaryDataL( KStackDataPrefix, pData.Ptr(), (const TUint8*) info.iUserStackBase, pData.Length() );
-                    //
-                    if  ( remaining > 0 )
-                        {
-                        info.iUserStackBase += pData.Length();
-                        r = iEngine.Driver().GetStackDataNext( aThread.Id(), pData, remaining, aType, aEntireStack );
-                        }
-                    else
-                        {
-                        break;
-                        }
+                    info.iUserStackBase += pData.Length();
+                    r = iEngine.Driver().GetStackDataNext( aThread.Id(), pData, remaining, aType, aEntireStack );
                     }
+                else
+                    {
+                    break;
+                    }
+                }
             }
-            else if ( aType == EMemSpyDriverDomainKernel ) {
-                while ( r == KErrNone ) {
-                
-                    iEngine.Sink().OutputBinaryDataL( KStackDataPrefix, pData.Ptr(), (const TUint8*) info.iSupervisorStackBase, pData.Length() );
-                    //
-                    if  ( remaining > 0 ) {
-                        info.iSupervisorStackBase += pData.Length();
-                        r = iEngine.Driver().GetStackDataNext( aThread.Id(), pData, remaining, aType, aEntireStack );
-                    }
-                    else {
-                         break;
-                    }
-               }
-            }
+
         }
     CleanupStack::PopAndDestroy( data );
 
@@ -290,7 +276,6 @@
     iEngine.Sink().OutputLineFormattedL( KMemSpyMarkerStackData, &KMemSpySinkTagClose, (TUint) aThread.Id() );
     iEngine.Sink().DataStreamEndL();
     }
-}    
 
 
 EXPORT_C void CMemSpyEngineHelperStack::OutputStackInfoForDeviceL()
--- a/memspy/Engine/Source/MemSpyEngine.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/MemSpyEngine.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -67,6 +67,10 @@
     return self;
     }
 
+EXPORT_C CMemSpyEngine* CMemSpyEngine::NewL( RFs& aFsSession, TBool aStartServer )
+    {
+    return NewL(aFsSession);
+    }
 
 EXPORT_C RFs& CMemSpyEngine::FsSession()
     {
@@ -118,9 +122,18 @@
 
 EXPORT_C void CMemSpyEngine::InstallSinkL( TMemSpySinkType aType )
     {
-    iImp->InstallSinkL( aType );
+    iImp->InstallSinkL( aType, KNullDesC );
     }
 
+EXPORT_C void CMemSpyEngine::InstallDebugSinkL()
+    {
+    iImp->InstallSinkL( ESinkTypeDebug, KNullDesC );
+    }
+
+EXPORT_C void CMemSpyEngine::InstallFileSinkL( const TDesC& aRootFolder )
+    {
+    iImp->InstallSinkL( ESinkTypeFile, aRootFolder );
+    }
 
 EXPORT_C void CMemSpyEngine::ListOpenFilesL()
     {
--- a/memspy/Engine/Source/MemSpyEngineImp.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/MemSpyEngineImp.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -52,6 +52,11 @@
 #include <memspy/engine/memspyenginehelperwindowserver.h>
 #include <memspy/engine/memspyenginehelpercondvar.h>
 
+#ifdef _DEBUG
+#define LOG(args...) RDebug::Printf(args)
+#else
+#define LOG(args...)
+#endif
 
 CMemSpyEngineImp::CMemSpyEngineImp( RFs& aFsSession, CMemSpyEngine& aEngine )
 :   iFsSession( aFsSession ), iEngine( aEngine )
@@ -61,18 +66,14 @@
 
 CMemSpyEngineImp::~CMemSpyEngineImp()
     {
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::~CMemSpyEngineImp() - START" );
-#endif
+    LOG( "CMemSpyEngineImp::~CMemSpyEngineImp() - START" );
 
     if  ( iMidwife )
         {
         iMidwife->RemoveObserver( *this );
         }
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::~CMemSpyEngineImp() - deleting helpers..." );
-#endif
+    LOG( "CMemSpyEngineImp::~CMemSpyEngineImp() - deleting helpers..." );
     delete iHelperSysMemTracker;
     delete iServer;
     delete iHelperKernelContainers;
@@ -94,52 +95,37 @@
     
     iHelperWindowServerLoader.Close();
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::~CMemSpyEngineImp() - deleting utilities..." );
-#endif
+    LOG( "CMemSpyEngineImp::~CMemSpyEngineImp() - deleting utilities..." );
     delete iChunkWatcher;
     delete iUndertaker;
     delete iMidwife;
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::~CMemSpyEngineImp() - destroying containers..." );
-#endif
+    LOG( "CMemSpyEngineImp::~CMemSpyEngineImp() - destroying containers..." );
     iContainers.ResetAndDestroy();
     iContainers.Close();
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::~CMemSpyEngineImp() - destroying driver..." );
-#endif
+    LOG( "CMemSpyEngineImp::~CMemSpyEngineImp() - destroying driver..." );
     if  ( iMemSpyDriver )
         {
         iMemSpyDriver->Close();
         delete iMemSpyDriver;
         }
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::~CMemSpyEngineImp() - destroying sink..." );
-#endif
+    LOG( "CMemSpyEngineImp::~CMemSpyEngineImp() - destroying sink..." );
     delete iSink;
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::~CMemSpyEngineImp() - END" );
-#endif
+    LOG( "CMemSpyEngineImp::~CMemSpyEngineImp() - END" );
     }
 
 
 void CMemSpyEngineImp::ConstructL()
     {
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructL() - START" );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructL() - START" );
     //
     iFsSession.SetSessionPath( _L("\\") );
     
-    // Starting the server before the driver connection is made
-    // ensures that only one instance of MemSpy can run (either the S60
-    // UI or the console UI ).
     iServer = CMemSpyEngineServer::NewL( iEngine );
-    //
+    
     iMemSpyDriver = new(ELeave) RMemSpyDriverClient();
     const TInt error = Driver().Open();
     User::LeaveIfError( error );
@@ -163,96 +149,60 @@
     iHelperSysMemTracker = CMemSpyEngineHelperSysMemTracker::NewL( iEngine );
     iMidwife->AddObserverL( *this );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructL() - END" );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructL() - END" );
     }
 
 
 void CMemSpyEngineImp::ConstructHelpersL()
     {
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - START" );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - START" );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - Heap..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - Heap..." );
     iHelperHeap = CMemSpyEngineHelperHeap::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - Stack..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - Stack..." );
     iHelperStack = CMemSpyEngineHelperStack::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - Code Segments..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - Code Segments..." );
     iHelperCodeSegment = CMemSpyEngineHelperCodeSegment::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - Chunk..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - Chunk..." );
     iHelperChunk = CMemSpyEngineHelperChunk::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - Thread..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - Thread..." );
     iHelperThread = CMemSpyEngineHelperThread::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - Process..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - Process..." );
     iHelperProcess = CMemSpyEngineHelperProcess::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - Server..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - Server..." );
     iHelperServer = CMemSpyEngineHelperServer::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - AO..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - AO..." );
     iHelperActiveObject = CMemSpyEngineHelperActiveObject::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - Kernel Containers..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - Kernel Containers..." );
     iHelperKernelContainers = CMemSpyEngineHelperKernelContainers::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - File System..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - File System..." );
     iHelperFileSystem = CMemSpyEngineHelperFileSystem::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - ECOM..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - ECOM..." );
     iHelperECom = CMemSpyEngineHelperECom::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - FBSERV..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - FBSERV..." );
     iHelperFbServ = CMemSpyEngineHelperFbServ::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - ROM..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - ROM..." );
     iHelperROM = CMemSpyEngineHelperROM::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - RAM..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - RAM..." );
     iHelperRAM = CMemSpyEngineHelperRAM::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - WindowServer..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - WindowServer..." );
     
     TInt err = iHelperWindowServerLoader.Load( _L("memspywindowserverhelper.dll") );
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - WindowServer load err: %d", err );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - WindowServer load err: %d", err );
     if ( !err )
         {
 #ifdef __WINS__ // ordinal is different 
@@ -262,18 +212,19 @@
 #endif
         if ( entry != NULL )
             {
-            iHelperWindowServer = (MMemSpyEngineHelperWindowServer*) entry();
+			typedef MMemSpyEngineHelperWindowServer* (*TEntryFn)(void);
+			TRAP(err, iHelperWindowServer = ((TEntryFn)entry)());
+			if (err)
+				{
+				LOG("err from memspywindowserverhelper.dll - %d", err);
+				}
             }
         }
     
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - CondVar..." );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - CondVar..." );
     iHelperCondVar = CMemSpyEngineHelperCondVar::NewL( iEngine );
 
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::ConstructHelpersL() - END" );
-#endif
+    LOG( "CMemSpyEngineImp::ConstructHelpersL() - END" );
     }
 
 
@@ -334,12 +285,14 @@
     return iSink->Type();
     }
 
+void CMemSpyEngineImp::InstallSinkL( TMemSpySinkType aType )
+	{
+	InstallSinkL( aType, KNullDesC );
+	}
 
-void CMemSpyEngineImp::InstallSinkL( TMemSpySinkType aType )
+void CMemSpyEngineImp::InstallSinkL( TMemSpySinkType aType, const TDesC& aRootFolder )
     {
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::InstallSinkL() - START - switching sink from %d to %d...", (iSink != NULL ? iSink->Type() : -1), aType );
-#endif
+    LOG( "CMemSpyEngineImp::InstallSinkL() - START - switching sink from %d to %d...", (iSink != NULL ? iSink->Type() : -1), aType );
     //
     CMemSpyEngineOutputSink* sink = NULL;
     //
@@ -349,16 +302,14 @@
         sink = CMemSpyEngineOutputSinkDebug::NewL( iEngine );
         break;
     case ESinkTypeFile:
-        sink = CMemSpyEngineOutputSinkFile::NewL( iEngine );
+        sink = CMemSpyEngineOutputSinkFile::NewL( iEngine, aRootFolder );
         break;
         }
     //
     delete iSink;
     iSink = sink;
     //
-#ifdef _DEBUG
-    RDebug::Printf( "CMemSpyEngineImp::InstallSinkL() - END - sink type: %d", iSink->Type() );
-#endif
+    LOG( "CMemSpyEngineImp::InstallSinkL() - END - sink type: %d", iSink->Type() );
     }
 
 
--- a/memspy/Engine/Source/MemSpyEngineUtils.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/MemSpyEngineUtils.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -274,7 +274,7 @@
 
 EXPORT_C TMemSpyPercentText MemSpyEngineUtils::FormatPercentage( TReal aOneHundredPercentValue, TReal aValue )
     {
-    const TReal value = (TInt) (( aValue / aOneHundredPercentValue) * 100.0);
+    const TReal value = (( aValue / aOneHundredPercentValue) * 100.0);
     
     _LIT(KPercentFormat, "%3.2f %%");
 
@@ -365,6 +365,7 @@
 EXPORT_C void MemSpyEngineUtils::GetFolderL( RFs& aFsSession, TDes& aFolder, const CMemSpyEngineSinkMetaData& aMetaData, const TDriveNumber* aForceDrive )
     {
     const TChar KMemSpyDirectorySeparator = '\\';
+    const TChar KMemSpyDriveSeparator = ':';
 
     TDriveList drives;
     User::LeaveIfError( aFsSession.DriveList( drives ) );
@@ -379,7 +380,26 @@
         }
     else
         {
-        logDrive = MemSpyEngineUtils::LocateSuitableDrive( aFsSession );
+		// check if drive is specified in root path
+		if ( aMetaData.Root().Length() > 2 && aMetaData.Root()[1] == KMemSpyDriveSeparator )
+			{
+			TChar drive = aMetaData.Root()[0];
+			
+			// check if drive is valid
+			if (drives.Locate(drive) != KErrNone)
+				{
+				TDriveUnit driveUnit( aMetaData.Root().Left(1) );
+				logDrive = static_cast<TDriveNumber>(static_cast<TInt>(driveUnit));
+				}
+			else
+				{
+				logDrive = MemSpyEngineUtils::LocateSuitableDrive( aFsSession );
+				}
+			}
+		else
+			{
+			logDrive = MemSpyEngineUtils::LocateSuitableDrive( aFsSession );
+			}
         }
 
     // Prepare the drive buffer
@@ -389,7 +409,35 @@
     // Prepare the drive name
     TDriveUnit driveUnit( logDrive );
     pFileName.Append( driveUnit.Name() );
-    pFileName.Append( KMemSpyLogRootPath );
+    
+    if ( aMetaData.Root().Length() == 0 )
+    	{
+		pFileName.Append( KMemSpyLogRootPath );
+    	}
+    else
+    	{
+		TPtrC root( aMetaData.Root() );
+		// check if root path contains drive (e.g. c:) and remove it
+		if ( root.Length() > 2 && root[1] == KMemSpyDriveSeparator )
+			{
+			root.Set( root.Mid( 2 ) );
+			}
+		// check if root starts with \ and remove it
+		if ( root.Length() > 1 && root[0] == KMemSpyDirectorySeparator )
+			{
+			root.Set( root.Mid( 1 ) );
+			}
+		
+		// append root path
+		pFileName.Append( KMemSpyDirectorySeparator );
+		pFileName.Append( root );
+		
+		// add trailing slash if necessary
+		if ( root[root.Length() - 1] != KMemSpyDirectorySeparator )
+			{
+			pFileName.Append( KMemSpyDirectorySeparator );
+			}
+    	}
 
     // Add any custom folder information
     if  ( aMetaData.Folder().Length() > 0 )
--- a/memspy/Engine/Source/Sink/MemSpyEngineOutputList.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/Sink/MemSpyEngineOutputList.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -102,8 +102,18 @@
         for( TInt j=0; j<count; j++ )
             {
             const CMemSpyEngineOutputListItem* item = iItems[ j ];
-            maxLengthCaption = Max( maxLengthCaption, item->Caption().Length() );
-            maxLengthValue = Max( maxLengthValue, item->Value().Length() );
+			if (item->Value().Length())
+				{
+	            maxLengthCaption = Max( maxLengthCaption, item->Caption().Length() );
+	            maxLengthValue = Max( maxLengthValue, item->Value().Length() );
+				}
+			else
+				{
+				// If something doesn't have a value (ie it's a section header, represented as just a caption) then the caption
+				// shouldn't be factored into the maxcaptionlength. But consider it in maxlengthValue to make sure we actually
+				// make the overall buffers big enough
+				maxLengthValue = Max( maxLengthValue, item->Caption().Length() );
+				}
             }
 
         // Second pass - real this time - to print the values
@@ -121,7 +131,15 @@
             HBufC* value = MemSpyEngineUtils::CleanupTextLC( item->Value() );
 
             // Now format the final line, with padding.
-            pLine.Justify( *caption, maxLengthCaption + 3, ELeft, TChar(' ') );
+			if (value->Length()) 
+				{
+	            pLine.Justify( *caption, maxLengthCaption + 3, ELeft, TChar(' ') );
+				}
+			else
+				{
+				// items without value (ie just captions, ie section headers) aren't constrained by the maxLengthCaption restriction
+				pLine.Copy(*caption);
+				}
             pLine.Append( *value );
             CleanupStack::PopAndDestroy( 2, caption );
 
--- a/memspy/Engine/Source/Sink/MemSpyEngineOutputSink.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/Sink/MemSpyEngineOutputSink.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -380,6 +380,7 @@
 
 EXPORT_C CMemSpyEngineSinkMetaData::~CMemSpyEngineSinkMetaData()
     {
+	delete iRoot;
     delete iContext;
     delete iFolder;
     delete iExtension;
@@ -387,8 +388,9 @@
     }
 
 
-void CMemSpyEngineSinkMetaData::ConstructL( const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, const TTime& aFolderTime )
+void CMemSpyEngineSinkMetaData::ConstructL( const TDesC& aRoot, const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, const TTime& aFolderTime )
     {
+	iRoot = aRoot.AllocL();
     iContext = aContext.AllocL();
     iFolder = aFolder.AllocL();
     iExtension = aExtension.AllocL();
@@ -407,15 +409,24 @@
     return CMemSpyEngineSinkMetaData::NewL( KNullDesC, KNullDesC, KNullDesC, ETrue, ETrue );
     }
 
+EXPORT_C CMemSpyEngineSinkMetaData* CMemSpyEngineSinkMetaData::NewL(  const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, TBool aOverwrite, TBool aUseFileTimeStamp )
+	{
+	return NewL( KNullDesC, aContext, aFolder, aExtension, aOverwrite, aUseFileTimeStamp );
+	}
 
-EXPORT_C CMemSpyEngineSinkMetaData* CMemSpyEngineSinkMetaData::NewL( const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, TBool aOverwrite, TBool aUseFileTimeStamp )
+EXPORT_C CMemSpyEngineSinkMetaData* CMemSpyEngineSinkMetaData::NewL( const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, TBool aOverwrite, TBool aUseFileTimeStamp, const TTime& aFolderTimeStamp )
+    {
+    return NewL( KNullDesC, aContext, aFolder, aExtension, aOverwrite, aUseFileTimeStamp, aFolderTimeStamp );
+    }
+
+EXPORT_C CMemSpyEngineSinkMetaData* CMemSpyEngineSinkMetaData::NewL( const TDesC& aRoot, const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, TBool aOverwrite, TBool aUseFileTimeStamp )
     {
     // Create a dummy time, we'll clear it after ConstructL() returns...
     TTime now; now.HomeTime();
 
     CMemSpyEngineSinkMetaData* self = new(ELeave) CMemSpyEngineSinkMetaData( aOverwrite, aUseFileTimeStamp );
     CleanupStack::PushL( self );
-    self->ConstructL( aContext, aFolder, aExtension, now );
+    self->ConstructL( aRoot, aContext, aFolder, aExtension, now );
     CleanupStack::Pop( self );
 
     // Clear folder time stamp
@@ -423,14 +434,11 @@
     return self;
     }
 
-
-EXPORT_C CMemSpyEngineSinkMetaData* CMemSpyEngineSinkMetaData::NewL( const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, TBool aOverwrite, TBool aUseFileTimeStamp, const TTime& aFolderTimeStamp )
+EXPORT_C CMemSpyEngineSinkMetaData* CMemSpyEngineSinkMetaData::NewL( const TDesC& aRoot, const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, TBool aOverwrite, TBool aUseFileTimeStamp, const TTime& aFolderTimeStamp )
     {
     CMemSpyEngineSinkMetaData* self = new(ELeave) CMemSpyEngineSinkMetaData( aOverwrite, aUseFileTimeStamp );
     CleanupStack::PushL( self );
-    self->ConstructL( aContext, aFolder, aExtension, aFolderTimeStamp );
+    self->ConstructL( aRoot, aContext, aFolder, aExtension, aFolderTimeStamp );
     CleanupStack::Pop( self );
     return self;
     }
-
-
--- a/memspy/Engine/Source/Sink/MemSpyEngineOutputSinkFile.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/Sink/MemSpyEngineOutputSinkFile.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -41,6 +41,8 @@
 CMemSpyEngineOutputSinkFile::~CMemSpyEngineOutputSinkFile()
     {
     TRACE( RDebug::Printf( "CMemSpyEngineOutputSinkFile::~CMemSpyEngineOutputSinkFile() - START" ) );
+    
+    delete iRoot;
 
     TRACE( RDebug::Printf( "CMemSpyEngineOutputSinkFile::~CMemSpyEngineOutputSinkFile() - destroying normal logs..." ) );
     iLogs.ResetAndDestroy();
@@ -56,9 +58,11 @@
     }
 
 
-void CMemSpyEngineOutputSinkFile::ConstructL()
+void CMemSpyEngineOutputSinkFile::ConstructL( const TDesC& aRootFolder )
     {
     TRACE( RDebug::Printf( "CMemSpyEngineOutputSinkFile::ConstructL() - START" ) );
+    
+    iRoot = aRootFolder.AllocL();
 
     BaseConstructL();
 
@@ -78,11 +82,11 @@
     }
 
 
-CMemSpyEngineOutputSinkFile* CMemSpyEngineOutputSinkFile::NewL( CMemSpyEngine& aEngine )
+CMemSpyEngineOutputSinkFile* CMemSpyEngineOutputSinkFile::NewL( CMemSpyEngine& aEngine, const TDesC& aRootFolder )
     {
     CMemSpyEngineOutputSinkFile* self = new(ELeave) CMemSpyEngineOutputSinkFile( aEngine );
     CleanupStack::PushL( self );
-    self->ConstructL();
+    self->ConstructL( aRootFolder );
     CleanupStack::Pop( self );
     return self;
     }
@@ -154,7 +158,7 @@
 
 void CMemSpyEngineOutputSinkFile::DataStreamBeginL( const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, TBool aOverwrite, TBool aUseTimeStamp )
     {
-    CMemSpyEngineSinkMetaData* meta = CMemSpyEngineSinkMetaData::NewL( aContext, aFolder, aExtension, aOverwrite, aUseTimeStamp );
+    CMemSpyEngineSinkMetaData* meta = CMemSpyEngineSinkMetaData::NewL( iRoot->Des(), aContext, aFolder, aExtension, aOverwrite, aUseTimeStamp );
     CleanupStack::PushL( meta );
 
     TRACE( RDebug::Printf( "CMemSpyEngineOutputSinkFile::DataStreamBeginL() - START - log count: %d, iFileServerSuspended: %d", iLogs.Count(), iFileServerSuspended ) );
@@ -409,7 +413,7 @@
 
     // Make emtpy meta data
     ASSERT( !iMetaData );
-    iMetaData = CMemSpyEngineSinkMetaData::NewL( KNullDesC, KNullDesC, KNullDesC, ETrue, ETrue );
+    iMetaData = CMemSpyEngineSinkMetaData::NewL( KNullDesC, KNullDesC, KNullDesC, KNullDesC, ETrue, ETrue );
 
     // Prepare common details
     CommonConstructL();
--- a/memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTracker.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTracker.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -129,7 +129,7 @@
     }
 
 
-void CMemSpyEngineHelperSysMemTracker::CheckForChangesNowL()
+EXPORT_C void CMemSpyEngineHelperSysMemTracker::CheckForChangesNowL()
     {
     iImp->CheckForChangesNowL();
     }
--- a/memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTrackerEntryHeap.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTrackerEntryHeap.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -216,15 +216,8 @@
 
 TBool CMemSpyEngineHelperSysMemTrackerEntryHeap::HaveFreeCellsChanged() const
     {
-    TBool changed = 
-        ( iCurrent.AsRHeap().ObjectData().iFree.next != iLast.AsRHeap().ObjectData().iFree.next ) ||
-        ( iCurrent.AsRHeap().ObjectData().iFree.len != iLast.AsRHeap().ObjectData().iFree.len );
-    //
-    if ( !changed )
-        {
-        changed |= ( iCurrent.AsRHeap().Statistics().StatsFree().TypeCount() != iLast.AsRHeap().Statistics().StatsFree().TypeCount() );
-        changed |= ( iCurrent.AsRHeap().Statistics().StatsFree().SlackSpaceCellSize() != iLast.AsRHeap().Statistics().StatsFree().SlackSpaceCellSize() );
-        }
+    TBool changed = ( iCurrent.AsRHeap().Statistics().StatsFree().TypeCount() != iLast.AsRHeap().Statistics().StatsFree().TypeCount() ) ||
+		( iCurrent.AsRHeap().Statistics().StatsFree().TypeSize() != iLast.AsRHeap().Statistics().StatsFree().TypeSize() );
     //
     return changed;
     }
@@ -296,7 +289,7 @@
 
 void CMemSpyEngineHelperSysMemTrackerCycleChangeHeap::OutputHeaderL( CMemSpyEngineOutputSink& aSink, CMemSpyEngineHelperSysMemTrackerCycle& /*aCycle*/ )
     {
-    _LIT( KHeaderHeap, "Type, Thread, Chunk, Handle, Base Addr, Size, Min, Max, 1st Free Addr, 1st Free Len, Alloc Count, Alloc Space, Free Count, Free Space, Free Slack, F.Largest, A.Largest, Attribs");
+    _LIT( KHeaderHeap, "Type, Thread, Chunk, Handle, Heap Addr, Size, Min, Max, 1st Free Addr, 1st Free Len, Alloc Count, Alloc Space, Free Count, Free Space, Free Slack, F.Largest, A.Largest, Attribs");
     aSink.OutputLineL( KHeaderHeap );
     }
 
@@ -315,7 +308,6 @@
     TPtr pBuf(buf->Des());
 
     const TMemSpyHeapMetaDataRHeap& metaData = iCurrent.AsRHeap().MetaData();
-    const TMemSpyHeapObjectDataRHeap& objectData = iCurrent.AsRHeap().ObjectData();
     const TMemSpyHeapStatisticsRHeap& stats = iCurrent.AsRHeap().Statistics();
 
     // Strip any process & thread
@@ -326,12 +318,12 @@
                  iThreadName, 
                  &pChunkName,
                  metaData.ChunkHandle(),
-                 objectData.Base(),
+                 /*objectData.Base(),*/ metaData.iAllocatorAddress,
                  metaData.ChunkSize(),
-                 objectData.iMinLength,
-                 objectData.iMaxLength,
-                 objectData.iFree.next,
-                 objectData.iFree.len,
+                 /*objectData.iMinLength,*/ metaData.iMinHeapSize,
+                 /*objectData.iMaxLength,*/ metaData.iMaxHeapSize,
+                 /*objectData.iFree.next,*/ NULL, //TODO
+                 /*objectData.iFree.len,*/ 0,
                  stats.StatsAllocated().TypeCount(),
                  stats.StatsAllocated().TypeSize(),
                  stats.StatsFree().TypeCount(),
@@ -371,18 +363,22 @@
         {
         // Starts a data Stream
         aCycle.DataStreamBeginL( aSink, *iThreadName );
+        
+        TInt err = KErrNone;
 
         if  ( IsKernel() )
             {
-            engine.HelperHeap().OutputHeapDataKernelL( KMemSpyEngineSinkDoNotCreateOwnDataStream );
+            TRAP(err, engine.HelperHeap().OutputHeapDataKernelL( KMemSpyEngineSinkDoNotCreateOwnDataStream ));
             }
         else if ( thread )
             {
-            engine.HelperHeap().OutputHeapDataUserL( *thread, KMemSpyEngineSinkDoNotCreateOwnDataStream ); 
+            TRAP(err, engine.HelperHeap().OutputHeapDataUserL( *thread, KMemSpyEngineSinkDoNotCreateOwnDataStream )); 
             }
 
         // End the stream (commit the file)
         aCycle.DataStreamEndL( aSink );
+        
+        User::LeaveIfError(err);
         }
     }
 
--- a/memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTrackerEntryManager.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/SysMemTracker/MemSpyEngineHelperSysMemTrackerEntryManager.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -443,12 +443,13 @@
     }
 #endif
 
-    if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryBitmapHandles )
-        {
-        RDebug::Print( KMemSpyKeepaliveMessage );
-        // Bitmap
-        CreateSeedItemsBitmapL( *chunks );        
-        }
+// TODO: Uncomment when  bitmap handels are fixed
+//    if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryBitmapHandles )
+//        {
+//        RDebug::Print( KMemSpyKeepaliveMessage );
+//        // Bitmap
+//        CreateSeedItemsBitmapL( *chunks );        
+//        }
 
 #ifdef SYSMEMTRACKERLOGGING
     {
@@ -479,12 +480,13 @@
     }
 #endif
 
-    if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryKernelHeap )
-        {
-        RDebug::Print( KMemSpyKeepaliveMessage );
-        // Look for kernel heaps
-        CreateSeedItemsHeapKernelL( *chunks );
-        }
+//  TODO: Uncomment after fix
+//    if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryKernelHeap )
+//        {
+//        RDebug::Print( KMemSpyKeepaliveMessage );
+//        // Look for kernel heaps
+//        CreateSeedItemsHeapKernelL( *chunks );
+//        }
 
 #ifdef SYSMEMTRACKERLOGGING
     {
@@ -551,12 +553,13 @@
     }
 #endif
 
-    if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryUserStacks )
-        {
-        RDebug::Print( KMemSpyKeepaliveMessage );
-        // Stacks ($DAT)
-        CreateSeedItemsStacksL( *chunks );        
-        }
+//    TODO: Uncomment after fix
+//    if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryUserStacks )
+//        {
+//        RDebug::Print( KMemSpyKeepaliveMessage );
+//        // Stacks ($DAT)
+//        CreateSeedItemsStacksL( *chunks );        
+//        }
 
 #ifdef SYSMEMTRACKERLOGGING
      {
@@ -569,12 +572,13 @@
     }
 #endif
 
-    if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryGlobalData )
-        {
-        RDebug::Print( KMemSpyKeepaliveMessage );
-        // Global data (DLL$DATA)
-        CreateSeedItemsGlobalDataL( *chunks );        
-        }
+//  TODO: Uncomment after fix
+//    if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryGlobalData )
+//        {
+//        RDebug::Print( KMemSpyKeepaliveMessage );
+//        // Global data (DLL$DATA)
+//        CreateSeedItemsGlobalDataL( *chunks );        
+//        }
 
  #ifdef SYSMEMTRACKERLOGGING
     {
--- a/memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectContainer.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectContainer.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -773,9 +773,9 @@
         for( TInt i=0; i<leftCount; i++ )
             {
             const TMemSpyHeapInfo& info = leftInfos[ i ];
-            if ( info.Type() == TMemSpyHeapInfo::ETypeRHeap )
+            if ( info.Type() != TMemSpyHeapInfo::ETypeUnknown )
                 {
-                leftSize += (TInt) info.AsRHeap().ObjectData().Size();
+                leftSize += (TInt) info.AsRHeap().MetaData().iHeapSize;
                 }
             }
         CleanupStack::PopAndDestroy( &leftInfos );
@@ -789,9 +789,9 @@
         for( TInt i=0; i<rightCount; i++ )
             {
             const TMemSpyHeapInfo& info = rightInfos[ i ];
-            if ( info.Type() == TMemSpyHeapInfo::ETypeRHeap )
+            if ( info.Type() == TMemSpyHeapInfo::ETypeUnknown )
                 {
-                rightSize += (TInt) info.AsRHeap().ObjectData().Size();
+                rightSize += (TInt) info.AsRHeap().MetaData().iHeapSize;
                 }
             }
         CleanupStack::PopAndDestroy( &rightInfos );
--- a/memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectProcess.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectProcess.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -515,6 +515,25 @@
     return iInfo->VID();
     }
 
+EXPORT_C TProcessPriority CMemSpyProcess::Priority() const
+	{
+	return iPriority;
+	}
+
+EXPORT_C TExitCategoryName CMemSpyProcess::ExitCategory() const
+	{
+	return iExitCategory;
+	}
+
+EXPORT_C TInt CMemSpyProcess::ExitReason() const
+	{
+	return iExitReason;
+	}
+
+EXPORT_C TExitType CMemSpyProcess::ExitType() const
+	{
+	return iExitType;
+	}
 
 EXPORT_C TUidType CMemSpyProcess::UIDs() const
     {
--- a/memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectThread.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectThread.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -387,6 +387,11 @@
     return  isDead;
     }
 
+EXPORT_C TThreadPriority CMemSpyThread::Priority() const
+	{
+	return iPriority;
+	}
+
 
 void CMemSpyThread::RefreshL()
     {
--- a/memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectThreadInfoObjects.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectThreadInfoObjects.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -123,6 +123,17 @@
     return TPtrC( item->Combined() );
     }
 
+EXPORT_C TPtrC CMemSpyThreadInfoItemBase::Caption(TInt aIndex ) const
+	{
+	CItem* item = iItems[ aIndex ];
+	return TPtrC( item->Caption() );
+	}
+
+EXPORT_C TPtrC CMemSpyThreadInfoItemBase::Value(TInt aIndex ) const
+	{
+	CItem* item = iItems[ aIndex ];
+	return TPtrC( item->Value() );
+	}
 
 EXPORT_C CMemSpyEngine& CMemSpyThreadInfoItemBase::Engine() const
     {
--- a/memspy/Engine/eabi/MemSpyEngineu.def	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/eabi/MemSpyEngineu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -536,4 +536,21 @@
 	_ZTI49CMemSpyEngineHelperSysMemTrackerEntryWindowServer @ 535 NONAME ; #<TI>#
 	_ZTV49CMemSpyEngineHelperSysMemTrackerEntryWindowServer @ 536 NONAME ; #<VT>#
 	_ZN13CMemSpyEngine29IsHelperWindowServerSupportedEv @ 537 NONAME
+	_ZN23CMemSpyEngineHelperHeap14NewHeapRawInfoERK15TMemSpyHeapInfo @ 538 NONAME
+	_ZNK36CMemSpyEngineGenericKernelObjectList10ItemsCountEv @ 539 NONAME
+	_ZNK36CMemSpyEngineGenericKernelObjectList4SizeEv @ 540 NONAME
+	_ZNK13CMemSpyThread8PriorityEv @ 541 NONAME
+	_ZN13CMemSpyEngine4NewLER3RFsi @ 542 NONAME
+	_ZNK14CMemSpyProcess10ExitReasonEv @ 543 NONAME
+	_ZNK14CMemSpyProcess12ExitCategoryEv @ 544 NONAME
+	_ZNK14CMemSpyProcess8ExitTypeEv @ 545 NONAME
+	_ZNK14CMemSpyProcess8PriorityEv @ 546 NONAME
+	_ZNK25CMemSpyThreadInfoItemBase5ValueEi @ 547 NONAME
+	_ZNK25CMemSpyThreadInfoItemBase7CaptionEi @ 548 NONAME
+	_ZN13CMemSpyEngine16InstallFileSinkLERK7TDesC16 @ 549 NONAME
+	_ZN13CMemSpyEngine17InstallDebugSinkLEv @ 550 NONAME
+	_ZN25CMemSpyEngineSinkMetaData4NewLERK7TDesC16S2_S2_S2_ii @ 551 NONAME
+	_ZN25CMemSpyEngineSinkMetaData4NewLERK7TDesC16S2_S2_S2_iiRK5TTime @ 552 NONAME
+	_ZN32CMemSpyEngineHelperSysMemTracker19CheckForChangesNowLEv @ 553 NONAME
+	_ZN23CMemSpyEngineHelperHeap16GetHeapInfoUserLERK10TProcessIdRK9TThreadIdR15TMemSpyHeapInfoP6RArrayI21TMemSpyDriverFreeCellEi @ 554 NONAME
 
--- a/memspy/Engine/group/MemSpyEngine.mmp	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/Engine/group/MemSpyEngine.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -113,15 +113,18 @@
 
 OS_LAYER_SYSTEMINCLUDE
 
+APP_LAYER_SYSTEMINCLUDE
+
 LIBRARY			euser.lib 
 LIBRARY			MemSpyDriverClient.lib hal.lib estor.lib
 LIBRARY			efsrv.lib bafl.lib fbscli.lib
 LIBRARY			ecom.lib xmlframework.lib charconv.lib
-
+LIBRARY			apgrfx.lib
+LIBRARY	 		ws32.lib
 
 
 #include "MemSpyEngine.config"
 
+//EXPORTUNFROZEN
 
 
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/bwins/MemSpyClientu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,184 @@
+EXPORTS
+	?CpuUse@CMemSpyApiThread@@QBEHXZ @ 1 NONAME ; int CMemSpyApiThread::CpuUse(void) const
+	?Name@CMemSpyApiKernelObjectItem@@QBEABVTDesC8@@XZ @ 2 NONAME ; class TDesC8 const & CMemSpyApiKernelObjectItem::Name(void) const
+	?GetThreadInfoItemsL@RMemSpySession@@QAEXAAV?$RArray@PAVCMemSpyApiThreadInfoItem@@@@VTThreadId@@W4TMemSpyThreadInfoItemType@@@Z @ 3 NONAME ; void RMemSpySession::GetThreadInfoItemsL(class RArray<class CMemSpyApiThreadInfoItem *> &, class TThreadId, enum TMemSpyThreadInfoItemType)
+	?Description@TMemSpyDeviceWideOperationProgress@@QBEABVTDesC16@@XZ @ 4 NONAME ; class TDesC16 const & TMemSpyDeviceWideOperationProgress::Description(void) const
+	?TotalOverhead@CMemSpyApiHeap@@QAEHXZ @ 5 NONAME ; int CMemSpyApiHeap::TotalOverhead(void)
+	?OutputDetailedPhoneInfo@RMemSpySession@@QAEXAAVTRequestStatus@@@Z @ 6 NONAME ; void RMemSpySession::OutputDetailedPhoneInfo(class TRequestStatus &)
+	?UniqueID@CMemSpyApiKernelObjectItem@@QBEHXZ @ 7 NONAME ; int CMemSpyApiKernelObjectItem::UniqueID(void) const
+	?OutputHeapData@RMemSpySession@@QAEXAAVTRequestStatus@@@Z @ 8 NONAME ; void RMemSpySession::OutputHeapData(class TRequestStatus &)
+	?SessionType@CMemSpyApiKernelObjectItem@@QBE?AW4TIpcSessionType@@XZ @ 9 NONAME ; enum TIpcSessionType CMemSpyApiKernelObjectItem::SessionType(void) const
+	?VID@CMemSpyApiThread@@QBEHXZ @ 10 NONAME ; int CMemSpyApiThread::VID(void) const
+	?OutputStackInfoL@RMemSpySession@@QAEXVTThreadId@@@Z @ 11 NONAME ; void RMemSpySession::OutputStackInfoL(class TThreadId)
+	?GetOutputSink@RMemSpySession@@QAEXW4TMemSpySinkType@@@Z @ 12 NONAME ; void RMemSpySession::GetOutputSink(enum TMemSpySinkType)
+	?FreeMemory@CMemSpyApiMemoryTrackingCycle@@QBEAB_JXZ @ 13 NONAME ; long long const & CMemSpyApiMemoryTrackingCycle::FreeMemory(void) const
+	?ProcessNumberUsing@CMemSpyApiThread@@QBEHXZ @ 14 NONAME ; int CMemSpyApiThread::ProcessNumberUsing(void) const
+	?PreviousCycleDiff@CMemSpyApiMemoryTrackingCycle@@QBE_JXZ @ 15 NONAME ; long long CMemSpyApiMemoryTrackingCycle::PreviousCycleDiff(void) const
+	?OutputStackDataL@RMemSpySession@@QAEXVTThreadId@@W4TMemSpyDriverDomainType@@@Z @ 16 NONAME ; void RMemSpySession::OutputStackDataL(class TThreadId, enum TMemSpyDriverDomainType)
+	?OutputThreadHeapDataL@RMemSpySession@@QAEXVTThreadId@@@Z @ 17 NONAME ; void RMemSpySession::OutputThreadHeapDataL(class TThreadId)
+	?ExitType@CMemSpyApiProcess@@QBE?AW4TExitType@@XZ @ 18 NONAME ; enum TExitType CMemSpyApiProcess::ExitType(void) const
+	?SwitchOutputToFileL@RMemSpySession@@QAEXABVTDesC16@@@Z @ 19 NONAME ; void RMemSpySession::SwitchOutputToFileL(class TDesC16 const &)
+	?OutputHeapCellListing@RMemSpySession@@QAEXAAVTRequestStatus@@@Z @ 20 NONAME ; void RMemSpySession::OutputHeapCellListing(class TRequestStatus &)
+	?SetThreadPriorityL@RMemSpySession@@QAEXVTThreadId@@H@Z @ 21 NONAME ; void RMemSpySession::SetThreadPriorityL(class TThreadId, int)
+	?Restrictions@CMemSpyApiKernelObjectItem@@QBEIXZ @ 22 NONAME ; unsigned int CMemSpyApiKernelObjectItem::Restrictions(void) const
+	?Id@CMemSpyApiKernelObjectItem@@QBEHXZ @ 23 NONAME ; int CMemSpyApiKernelObjectItem::Id(void) const
+	?Count@CMemSpyApiKernelObjectItem@@QBEHXZ @ 24 NONAME ; int CMemSpyApiKernelObjectItem::Count(void) const
+	?ControllingOwner@CMemSpyApiKernelObjectItem@@QBEIXZ @ 25 NONAME ; unsigned int CMemSpyApiKernelObjectItem::ControllingOwner(void) const
+	?SwmtResetTracking@RMemSpySession@@QAEXXZ @ 26 NONAME ; void RMemSpySession::SwmtResetTracking(void)
+	?Version@CMemSpyApiKernelObjectItem@@QBE?AVTVersion@@XZ @ 27 NONAME ; class TVersion CMemSpyApiKernelObjectItem::Version(void) const
+	?SwitchToProcess@RMemSpySession@@QAEHVTProcessId@@H@Z @ 28 NONAME ; int RMemSpySession::SwitchToProcess(class TProcessId, int)
+	?MaxSize@CMemSpyApiKernelObjectItem@@QBEHXZ @ 29 NONAME ; int CMemSpyApiKernelObjectItem::MaxSize(void) const
+	?IsSwmtRunningL@RMemSpySession@@QAEHXZ @ 30 NONAME ; int RMemSpySession::IsSwmtRunningL(void)
+	?EndThread@RMemSpySession@@QAEHVTThreadId@@W4TMemSpyEndType@@@Z @ 31 NONAME ; int RMemSpySession::EndThread(class TThreadId, enum TMemSpyEndType)
+	?AddressOfOwningProcess@CMemSpyApiKernelObjectItem@@QAEPAEXZ @ 32 NONAME ; unsigned char * CMemSpyApiKernelObjectItem::AddressOfOwningProcess(void)
+	?ExitReason@CMemSpyApiProcess@@QBEHXZ @ 33 NONAME ; int CMemSpyApiProcess::ExitReason(void) const
+	?MsgCount@CMemSpyApiKernelObjectItem@@QBEHXZ @ 34 NONAME ; int CMemSpyApiKernelObjectItem::MsgCount(void) const
+	?AllocationsCount@CMemSpyApiHeap@@QAEHXZ @ 35 NONAME ; int CMemSpyApiHeap::AllocationsCount(void)
+	?WaitCount@CMemSpyApiKernelObjectItem@@QBEHXZ @ 36 NONAME ; int CMemSpyApiKernelObjectItem::WaitCount(void) const
+	?SID@CMemSpyApiProcess@@QBEKXZ @ 37 NONAME ; unsigned long CMemSpyApiProcess::SID(void) const
+	?GetKernelObjectsL@RMemSpySession@@QAEXAAV?$RArray@PAVCMemSpyApiKernelObject@@@@@Z @ 38 NONAME ; void RMemSpySession::GetKernelObjectsL(class RArray<class CMemSpyApiKernelObject *> &)
+	?CycleNumber@CMemSpyApiMemoryTrackingCycle@@QBEHXZ @ 39 NONAME ; int CMemSpyApiMemoryTrackingCycle::CycleNumber(void) const
+	?Size@CMemSpyApiKernelObject@@QBE_JXZ @ 40 NONAME ; long long CMemSpyApiKernelObject::Size(void) const
+	?SetSwmtCategoriesL@RMemSpySession@@QAEXH@Z @ 41 NONAME ; void RMemSpySession::SetSwmtCategoriesL(int)
+	?CancelDeviceWideOperationL@RMemSpySession@@QAEXXZ @ 42 NONAME ; void RMemSpySession::CancelDeviceWideOperationL(void)
+	?TotalAllocations@CMemSpyApiHeap@@QAEHXZ @ 43 NONAME ; int CMemSpyApiHeap::TotalAllocations(void)
+	?Name@CMemSpyApiProcess@@QBEABVTDesC16@@XZ @ 44 NONAME ; class TDesC16 const & CMemSpyApiProcess::Name(void) const
+	?DumpKernelHeap@RMemSpySession@@QAEXXZ @ 45 NONAME ; void RMemSpySession::DumpKernelHeap(void)
+	?GetKernelObjects@RMemSpySession@@QAEHAAV?$RArray@PAVCMemSpyApiKernelObject@@@@@Z @ 46 NONAME ; int RMemSpySession::GetKernelObjects(class RArray<class CMemSpyApiKernelObject *> &)
+	?Priority@CMemSpyApiProcess@@QBE?AW4TProcessPriority@@XZ @ 47 NONAME ; enum TProcessPriority CMemSpyApiProcess::Priority(void) const
+	?HeaderSizeF@CMemSpyApiHeap@@QAEHXZ @ 48 NONAME ; int CMemSpyApiHeap::HeaderSizeF(void)
+	?OutputCompactStackInfoL@RMemSpySession@@QAEXXZ @ 49 NONAME ; void RMemSpySession::OutputCompactStackInfoL(void)
+	?MsgLimit@CMemSpyApiKernelObjectItem@@QBEHXZ @ 50 NONAME ; int CMemSpyApiKernelObjectItem::MsgLimit(void) const
+	?AddressOfDataBssStackChunk@CMemSpyApiKernelObjectItem@@QAEPAEXZ @ 51 NONAME ; unsigned char * CMemSpyApiKernelObjectItem::AddressOfDataBssStackChunk(void)
+	?Top@CMemSpyApiKernelObjectItem@@QBEHXZ @ 52 NONAME ; int CMemSpyApiKernelObjectItem::Top(void) const
+	?Resetting@CMemSpyApiKernelObjectItem@@QBEEXZ @ 53 NONAME ; unsigned char CMemSpyApiKernelObjectItem::Resetting(void) const
+	?HeaderSizeA@CMemSpyApiHeap@@QAEHXZ @ 54 NONAME ; int CMemSpyApiHeap::HeaderSizeA(void)
+	?OutputHeapData@RMemSpySession@@QAEXXZ @ 55 NONAME ; void RMemSpySession::OutputHeapData(void)
+	?TotalAccessCount@CMemSpyApiKernelObjectItem@@QBEGXZ @ 56 NONAME ; unsigned short CMemSpyApiKernelObjectItem::TotalAccessCount(void) const
+	?Changes@CMemSpyApiKernelObjectItem@@QBEIXZ @ 57 NONAME ; unsigned int CMemSpyApiKernelObjectItem::Changes(void) const
+	??0RMemSpySession@@QAE@XZ @ 58 NONAME ; RMemSpySession::RMemSpySession(void)
+	?OutputUserStackData@RMemSpySession@@QAEXAAVTRequestStatus@@@Z @ 59 NONAME ; void RMemSpySession::OutputUserStackData(class TRequestStatus &)
+	?AddressOfServer@CMemSpyApiKernelObjectItem@@QAEPAEXZ @ 60 NONAME ; unsigned char * CMemSpyApiKernelObjectItem::AddressOfServer(void)
+	?SetSwmtConfig@RMemSpySession@@QAEXVTMemSpyEngineHelperSysMemTrackerConfig@@@Z @ 61 NONAME ; void RMemSpySession::SetSwmtConfig(class TMemSpyEngineHelperSysMemTrackerConfig)
+	?Size@CMemSpyApiHeap@@QAEHXZ @ 62 NONAME ; int CMemSpyApiHeap::Size(void)
+	??1CMemSpyApiKernelObject@@QAE@XZ @ 63 NONAME ; CMemSpyApiKernelObject::~CMemSpyApiKernelObject(void)
+	?GetInfoItemType@RMemSpySession@@QAEHHVTThreadId@@AAW4TMemSpyThreadInfoItemType@@@Z @ 64 NONAME ; int RMemSpySession::GetInfoItemType(int, class TThreadId, enum TMemSpyThreadInfoItemType &)
+	??1CMemSpyApiHeap@@QAE@XZ @ 65 NONAME ; CMemSpyApiHeap::~CMemSpyApiHeap(void)
+	?SetSwmtHeapDumpsEnabledL@RMemSpySession@@QAEXH@Z @ 66 NONAME ; void RMemSpySession::SetSwmtHeapDumpsEnabledL(int)
+	?SetSwmtFilter@RMemSpySession@@QAEXABVTDesC16@@@Z @ 67 NONAME ; void RMemSpySession::SetSwmtFilter(class TDesC16 const &)
+	?Size@CMemSpyApiKernelObjectItem@@QBEKXZ @ 68 NONAME ; unsigned long CMemSpyApiKernelObjectItem::Size(void) const
+	?OutputThreadInfoHandlesL@RMemSpySession@@QAEXVTThreadId@@@Z @ 69 NONAME ; void RMemSpySession::OutputThreadInfoHandlesL(class TThreadId)
+	?OutputThreadHeapDataL@RMemSpySession@@QAEXABVTDesC16@@@Z @ 70 NONAME ; void RMemSpySession::OutputThreadHeapDataL(class TDesC16 const &)
+	?Type@CMemSpyApiKernelObject@@QBE?AW4TMemSpyDriverContainerType@@XZ @ 71 NONAME ; enum TMemSpyDriverContainerType CMemSpyApiKernelObject::Type(void) const
+	?Name@CMemSpyApiKernelObject@@QBEABVTDesC16@@XZ @ 72 NONAME ; class TDesC16 const & CMemSpyApiKernelObject::Name(void) const
+	?Fragmentation@CMemSpyApiHeap@@QAEHXZ @ 73 NONAME ; int CMemSpyApiHeap::Fragmentation(void)
+	?TimerType@CMemSpyApiKernelObjectItem@@QBE?AW4TMemSpyDriverTimerType@@XZ @ 74 NONAME ; enum TMemSpyDriverTimerType CMemSpyApiKernelObjectItem::TimerType(void) const
+	?Value@CMemSpyApiThreadInfoItem@@QBEABVTDesC16@@XZ @ 75 NONAME ; class TDesC16 const & CMemSpyApiThreadInfoItem::Value(void) const
+	?SecurityZone@CMemSpyApiKernelObjectItem@@QBEIXZ @ 76 NONAME ; unsigned int CMemSpyApiKernelObjectItem::SecurityZone(void) const
+	?CreatorId@CMemSpyApiKernelObjectItem@@QBEIXZ @ 77 NONAME ; unsigned int CMemSpyApiKernelObjectItem::CreatorId(void) const
+	?Order@CMemSpyApiKernelObjectItem@@QBEEXZ @ 78 NONAME ; unsigned char CMemSpyApiKernelObjectItem::Order(void) const
+	?NameDetail@CMemSpyApiKernelObjectItem@@QBEABVTDesC8@@XZ @ 79 NONAME ; class TDesC8 const & CMemSpyApiKernelObjectItem::NameDetail(void) const
+	?OutputStackInfo@RMemSpySession@@QAEXAAVTRequestStatus@@@Z @ 80 NONAME ; void RMemSpySession::OutputStackInfo(class TRequestStatus &)
+	?Handle@CMemSpyApiKernelObjectItem@@QBEPAXXZ @ 81 NONAME ; void * CMemSpyApiKernelObjectItem::Handle(void) const
+	?GetProcessesL@RMemSpySession@@QAEXAAV?$RArray@PAVCMemSpyApiProcess@@@@W4TSortType@@@Z @ 82 NONAME ; void RMemSpySession::GetProcessesL(class RArray<class CMemSpyApiProcess *> &, enum TSortType)
+	?ParseMask@CMemSpyApiKernelObjectItem@@QBEIXZ @ 83 NONAME ; unsigned int CMemSpyApiKernelObjectItem::ParseMask(void) const
+	?Attributes@CMemSpyApiKernelObjectItem@@QBEHXZ @ 84 NONAME ; int CMemSpyApiKernelObjectItem::Attributes(void) const
+	?MemoryDelta@CMemSpyApiMemoryTrackingCycle@@QBE_JXZ @ 85 NONAME ; long long CMemSpyApiMemoryTrackingCycle::MemoryDelta(void) const
+	?Caption@CMemSpyApiThreadInfoItem@@QBEABVTDesC16@@XZ @ 86 NONAME ; class TDesC16 const & CMemSpyApiThreadInfoItem::Caption(void) const
+	?DebugAllocatorLibrary@CMemSpyApiHeap@@QAEHXZ @ 87 NONAME ; int CMemSpyApiHeap::DebugAllocatorLibrary(void)
+	?Overhead@CMemSpyApiHeap@@QAEHXZ @ 88 NONAME ; int CMemSpyApiHeap::Overhead(void)
+	?ForceSwmtUpdate@RMemSpySession@@QAEXAAVTRequestStatus@@@Z @ 89 NONAME ; void RMemSpySession::ForceSwmtUpdate(class TRequestStatus &)
+	?GetHeapL@RMemSpySession@@QAEPAVCMemSpyApiHeap@@XZ @ 90 NONAME ; class CMemSpyApiHeap * RMemSpySession::GetHeapL(void)
+	?OutputKernelStackData@RMemSpySession@@QAEXAAVTRequestStatus@@@Z @ 91 NONAME ; void RMemSpySession::OutputKernelStackData(class TRequestStatus &)
+	?AddressOfOwningThread@CMemSpyApiKernelObjectItem@@QAEPAEXZ @ 92 NONAME ; unsigned char * CMemSpyApiKernelObjectItem::AddressOfOwningThread(void)
+	?ThreadPriority@CMemSpyApiThread@@QBE?AW4TThreadPriority@@XZ @ 93 NONAME ; enum TThreadPriority CMemSpyApiThread::ThreadPriority(void) const
+	?GetHeap@RMemSpySession@@QAEPAVCMemSpyApiHeap@@XZ @ 94 NONAME ; class CMemSpyApiHeap * RMemSpySession::GetHeap(void)
+	??1CMemSpyApiMemoryTrackingCycle@@QAE@XZ @ 95 NONAME ; CMemSpyApiMemoryTrackingCycle::~CMemSpyApiMemoryTrackingCycle(void)
+	?AccessCount@CMemSpyApiKernelObjectItem@@QBEHXZ @ 96 NONAME ; int CMemSpyApiKernelObjectItem::AccessCount(void) const
+	?OutputHeapInfo@RMemSpySession@@QAEXAAVTRequestStatus@@@Z @ 97 NONAME ; void RMemSpySession::OutputHeapInfo(class TRequestStatus &)
+	?Time@CMemSpyApiMemoryTrackingCycle@@QBEABVTTime@@XZ @ 98 NONAME ; class TTime const & CMemSpyApiMemoryTrackingCycle::Time(void) const
+	?SetSwmtTimerIntervalL@RMemSpySession@@QAEXH@Z @ 99 NONAME ; void RMemSpySession::SetSwmtTimerIntervalL(int)
+	?MaxLength@CMemSpyApiHeap@@QAEHXZ @ 100 NONAME ; int CMemSpyApiHeap::MaxLength(void)
+	?OutputKernelHeapData@RMemSpySession@@QAEXAAVTRequestStatus@@@Z @ 101 NONAME ; void RMemSpySession::OutputKernelHeapData(class TRequestStatus &)
+	?AddressOfKernelOwner@CMemSpyApiKernelObjectItem@@QAEPAEXZ @ 102 NONAME ; unsigned char * CMemSpyApiKernelObjectItem::AddressOfKernelOwner(void)
+	??1CMemSpyApiThreadInfoItem@@QAE@XZ @ 103 NONAME ; CMemSpyApiThreadInfoItem::~CMemSpyApiThreadInfoItem(void)
+	?FreeCount@CMemSpyApiHeap@@QAEHXZ @ 104 NONAME ; int CMemSpyApiHeap::FreeCount(void)
+	?TotalFree@CMemSpyApiHeap@@QAEHXZ @ 105 NONAME ; int CMemSpyApiHeap::TotalFree(void)
+	?SwitchToThread@RMemSpySession@@QAEHVTThreadId@@H@Z @ 106 NONAME ; int RMemSpySession::SwitchToThread(class TThreadId, int)
+	?FreeOverhead@CMemSpyApiHeap@@QAEHXZ @ 107 NONAME ; int CMemSpyApiHeap::FreeOverhead(void)
+	?SwitchOutputToTraceL@RMemSpySession@@QAEXXZ @ 108 NONAME ; void RMemSpySession::SwitchOutputToTraceL(void)
+	?SlackFreeSpace@CMemSpyApiHeap@@QAEHXZ @ 109 NONAME ; int CMemSpyApiHeap::SlackFreeSpace(void)
+	?ForceSwmtUpdateL@RMemSpySession@@QAEXXZ @ 110 NONAME ; void RMemSpySession::ForceSwmtUpdateL(void)
+	?Priority@CMemSpyApiKernelObjectItem@@QBEHXZ @ 111 NONAME ; int CMemSpyApiKernelObjectItem::Priority(void) const
+	?ThreadCount@CMemSpyApiProcess@@QBEHXZ @ 112 NONAME ; int CMemSpyApiProcess::ThreadCount(void) const
+	?Caption@CMemSpyApiMemoryTrackingCycle@@QBEABVTDesC16@@XZ @ 113 NONAME ; class TDesC16 const & CMemSpyApiMemoryTrackingCycle::Caption(void) const
+	?RequestCount@CMemSpyApiThread@@QBEHXZ @ 114 NONAME ; int CMemSpyApiThread::RequestCount(void) const
+	?StopSwmtTimerL@RMemSpySession@@QAEXXZ @ 115 NONAME ; void RMemSpySession::StopSwmtTimerL(void)
+	??1CMemSpyApiProcess@@QAE@XZ @ 116 NONAME ; CMemSpyApiProcess::~CMemSpyApiProcess(void)
+	?MinLength@CMemSpyApiHeap@@QAEHXZ @ 117 NONAME ; int CMemSpyApiHeap::MinLength(void)
+	?ExitCategory@CMemSpyApiProcess@@QBE?AV?$TBuf@$0BA@@@XZ @ 118 NONAME ; class TBuf<16> CMemSpyApiProcess::ExitCategory(void) const
+	?Progress@TMemSpyDeviceWideOperationProgress@@QBEHXZ @ 119 NONAME ; int TMemSpyDeviceWideOperationProgress::Progress(void) const
+	?Count@CMemSpyApiKernelObject@@QBEHXZ @ 120 NONAME ; int CMemSpyApiKernelObject::Count(void) const
+	?StartPos@CMemSpyApiKernelObjectItem@@QBEHXZ @ 121 NONAME ; int CMemSpyApiKernelObjectItem::StartPos(void) const
+	?TimerState@CMemSpyApiKernelObjectItem@@QBE?AW4TMemSpyDriverTimerState@@XZ @ 122 NONAME ; enum TMemSpyDriverTimerState CMemSpyApiKernelObjectItem::TimerState(void) const
+	?BaseAddress@CMemSpyApiHeap@@QAEHXZ @ 123 NONAME ; int CMemSpyApiHeap::BaseAddress(void)
+	?ExitType@CMemSpyApiThread@@QBE?AW4TExitType@@XZ @ 124 NONAME ; enum TExitType CMemSpyApiThread::ExitType(void) const
+	?StartSwmtTimerL@RMemSpySession@@QAEXH@Z @ 125 NONAME ; void RMemSpySession::StartSwmtTimerL(int)
+	?Type@CMemSpyApiHeap@@QAEAAVTDesC16@@XZ @ 126 NONAME ; class TDesC16 & CMemSpyApiHeap::Type(void)
+	?Id@CMemSpyApiProcess@@QBE?AVTProcessId@@XZ @ 127 NONAME ; class TProcessId CMemSpyApiProcess::Id(void) const
+	?BiggestAllocation@CMemSpyApiHeap@@QAEHXZ @ 128 NONAME ; int CMemSpyApiHeap::BiggestAllocation(void)
+	??1CMemSpyApiKernelObjectItem@@QAE@XZ @ 129 NONAME ; CMemSpyApiKernelObjectItem::~CMemSpyApiKernelObjectItem(void)
+	?AllocationOverhead@CMemSpyApiHeap@@QAEHXZ @ 130 NONAME ; int CMemSpyApiHeap::AllocationOverhead(void)
+	?NameOfOwner@CMemSpyApiKernelObjectItem@@QBEABVTDesC8@@XZ @ 131 NONAME ; class TDesC8 const & CMemSpyApiKernelObjectItem::NameOfOwner(void) const
+	?OutputAllContainerContents@RMemSpySession@@QAEXXZ @ 132 NONAME ; void RMemSpySession::OutputAllContainerContents(void)
+	?OutputKernelObjectsL@RMemSpySession@@QAEXXZ @ 133 NONAME ; void RMemSpySession::OutputKernelObjectsL(void)
+	?ThreadSystemPermanentOrCritical@RMemSpySession@@QAEHVTThreadId@@H@Z @ 134 NONAME ; int RMemSpySession::ThreadSystemPermanentOrCritical(class TThreadId, int)
+	?Protection@CMemSpyApiKernelObjectItem@@QBEIXZ @ 135 NONAME ; unsigned int CMemSpyApiKernelObjectItem::Protection(void) const
+	?BiggestFree@CMemSpyApiHeap@@QAEHXZ @ 136 NONAME ; int CMemSpyApiHeap::BiggestFree(void)
+	?Attributes@CMemSpyApiThread@@QBEHXZ @ 137 NONAME ; int CMemSpyApiThread::Attributes(void) const
+	?Bottom@CMemSpyApiKernelObjectItem@@QBEHXZ @ 138 NONAME ; int CMemSpyApiKernelObjectItem::Bottom(void) const
+	?StartSwmtTimerL@RMemSpySession@@QAEXXZ @ 139 NONAME ; void RMemSpySession::StartSwmtTimerL(void)
+	?GetKernelObjectItemsL@RMemSpySession@@QAEXAAV?$RArray@PAVCMemSpyApiKernelObjectItem@@@@W4TMemSpyDriverContainerType@@@Z @ 140 NONAME ; void RMemSpySession::GetKernelObjectItemsL(class RArray<class CMemSpyApiKernelObjectItem *> &, enum TMemSpyDriverContainerType)
+	?NotifyDeviceWideOperationProgress@RMemSpySession@@QAEXAAVTMemSpyDeviceWideOperationProgress@@AAVTRequestStatus@@@Z @ 141 NONAME ; void RMemSpySession::NotifyDeviceWideOperationProgress(class TMemSpyDeviceWideOperationProgress &, class TRequestStatus &)
+	?OutputCompactHeapInfo@RMemSpySession@@QAEXAAVTRequestStatus@@@Z @ 142 NONAME ; void RMemSpySession::OutputCompactHeapInfo(class TRequestStatus &)
+	?OutputPhoneInfo@RMemSpySession@@QAEXXZ @ 143 NONAME ; void RMemSpySession::OutputPhoneInfo(void)
+	?ThreadHandles@CMemSpyApiThread@@QBEHXZ @ 144 NONAME ; int CMemSpyApiThread::ThreadHandles(void) const
+	?SvrSessionType@CMemSpyApiKernelObjectItem@@QBEEXZ @ 145 NONAME ; unsigned char CMemSpyApiKernelObjectItem::SvrSessionType(void) const
+	?SwitchOutputSinkL@RMemSpySession@@QAEXW4TMemSpySinkType@@@Z @ 146 NONAME ; void RMemSpySession::SwitchOutputSinkL(enum TMemSpySinkType)
+	?ChunkType@CMemSpyApiKernelObjectItem@@QBEIXZ @ 147 NONAME ; unsigned int CMemSpyApiKernelObjectItem::ChunkType(void) const
+	?Id@CMemSpyApiThread@@QBE?AVTThreadId@@XZ @ 148 NONAME ; class TThreadId CMemSpyApiThread::Id(void) const
+	?OutputPhoneInfo@RMemSpySession@@QAEXAAVTRequestStatus@@@Z @ 149 NONAME ; void RMemSpySession::OutputPhoneInfo(class TRequestStatus &)
+	?GetProcessIdByNameL@RMemSpySession@@QAE?AVTProcessId@@ABVTDesC16@@@Z @ 150 NONAME ; class TProcessId RMemSpySession::GetProcessIdByNameL(class TDesC16 const &)
+	?GetMemoryTrackingCyclesL@RMemSpySession@@QAEXAAV?$RArray@PAVCMemSpyApiMemoryTrackingCycle@@@@@Z @ 151 NONAME ; void RMemSpySession::GetMemoryTrackingCyclesL(class RArray<class CMemSpyApiMemoryTrackingCycle *> &)
+	?MapAttr@CMemSpyApiKernelObjectItem@@QBEIXZ @ 152 NONAME ; unsigned int CMemSpyApiKernelObjectItem::MapAttr(void) const
+	?OutputCompactStackInfo@RMemSpySession@@QAEXAAVTRequestStatus@@@Z @ 153 NONAME ; void RMemSpySession::OutputCompactStackInfo(class TRequestStatus &)
+	?VID@CMemSpyApiProcess@@QBEKXZ @ 154 NONAME ; unsigned long CMemSpyApiProcess::VID(void) const
+	?AddressOfCodeSeg@CMemSpyApiKernelObjectItem@@QAEPAEXZ @ 155 NONAME ; unsigned char * CMemSpyApiKernelObjectItem::AddressOfCodeSeg(void)
+	?GetThreadsL@RMemSpySession@@QAEXVTProcessId@@AAV?$RArray@PAVCMemSpyApiThread@@@@W4TSortType@@@Z @ 156 NONAME ; void RMemSpySession::GetThreadsL(class TProcessId, class RArray<class CMemSpyApiThread *> &, enum TSortType)
+	?ProcessId@CMemSpyApiThread@@QBE?AVTProcessId@@XZ @ 157 NONAME ; class TProcessId CMemSpyApiThread::ProcessId(void) const
+	?Type@CMemSpyApiKernelObjectItem@@QBE?AW4TMemSpyDriverContainerType@@XZ @ 158 NONAME ; enum TMemSpyDriverContainerType CMemSpyApiKernelObjectItem::Type(void) const
+	?ChunkSize@CMemSpyApiHeap@@QAEHXZ @ 159 NONAME ; int CMemSpyApiHeap::ChunkSize(void)
+	?UnitsMask@CMemSpyApiKernelObjectItem@@QBEIXZ @ 160 NONAME ; unsigned int CMemSpyApiKernelObjectItem::UnitsMask(void) const
+	?State@CMemSpyApiKernelObjectItem@@QBEEXZ @ 161 NONAME ; unsigned char CMemSpyApiKernelObjectItem::State(void) const
+	?Shared@CMemSpyApiHeap@@QAEHXZ @ 162 NONAME ; int CMemSpyApiHeap::Shared(void)
+	?SetSwmtAutoStartProcessList@RMemSpySession@@QAEXPAV?$CArrayFixFlat@VTUid@@@@@Z @ 163 NONAME ; void RMemSpySession::SetSwmtAutoStartProcessList(class CArrayFixFlat<class TUid> *)
+	?OutputCompactHeapInfoL@RMemSpySession@@QAEXXZ @ 164 NONAME ; void RMemSpySession::OutputCompactHeapInfoL(void)
+	?ProcessSystemPermanentOrCritical@RMemSpySession@@QAEHVTProcessId@@H@Z @ 165 NONAME ; int RMemSpySession::ProcessSystemPermanentOrCritical(class TProcessId, int)
+	?OutputKernelHeapDataL@RMemSpySession@@QAEXXZ @ 166 NONAME ; void RMemSpySession::OutputKernelHeapDataL(void)
+	?MapCount@CMemSpyApiKernelObjectItem@@QBEHXZ @ 167 NONAME ; int CMemSpyApiKernelObjectItem::MapCount(void) const
+	?OpenChannels@CMemSpyApiKernelObjectItem@@QAEHXZ @ 168 NONAME ; int CMemSpyApiKernelObjectItem::OpenChannels(void)
+	?EndProcess@RMemSpySession@@QAEHVTProcessId@@W4TMemSpyEndType@@@Z @ 169 NONAME ; int RMemSpySession::EndProcess(class TProcessId, enum TMemSpyEndType)
+	?ProcessPriority@CMemSpyApiThread@@QBE?AW4TProcessPriority@@XZ @ 170 NONAME ; enum TProcessPriority CMemSpyApiThread::ProcessPriority(void) const
+	?OutputAOListL@RMemSpySession@@QAEXVTThreadId@@W4TMemSpyThreadInfoItemType@@@Z @ 171 NONAME ; void RMemSpySession::OutputAOListL(class TThreadId, enum TMemSpyThreadInfoItemType)
+	?ThreadNumberUsing@CMemSpyApiThread@@QBEHXZ @ 172 NONAME ; int CMemSpyApiThread::ThreadNumberUsing(void) const
+	?OutputHeapInfoUserL@RMemSpySession@@QAEXVTThreadId@@@Z @ 173 NONAME ; void RMemSpySession::OutputHeapInfoUserL(class TThreadId)
+	?OutputThreadCellListL@RMemSpySession@@QAEXVTThreadId@@@Z @ 174 NONAME ; void RMemSpySession::OutputThreadCellListL(class TThreadId)
+	?GetThreadInfoItems@RMemSpySession@@QAEHAAV?$RArray@PAVCMemSpyApiThreadInfoItem@@@@VTThreadId@@W4TMemSpyThreadInfoItemType@@@Z @ 175 NONAME ; int RMemSpySession::GetThreadInfoItems(class RArray<class CMemSpyApiThreadInfoItem *> &, class TThreadId, enum TMemSpyThreadInfoItemType)
+	??1CMemSpyApiThread@@QAE@XZ @ 176 NONAME ; CMemSpyApiThread::~CMemSpyApiThread(void)
+	?Connect@RMemSpySession@@QAEHXZ @ 177 NONAME ; int RMemSpySession::Connect(void)
+	?SID@CMemSpyApiThread@@QBEHXZ @ 178 NONAME ; int CMemSpyApiThread::SID(void) const
+	?GetKernelObjectItems@RMemSpySession@@QAEHAAV?$RArray@PAVCMemSpyApiKernelObjectItem@@@@W4TMemSpyDriverContainerType@@@Z @ 179 NONAME ; int RMemSpySession::GetKernelObjectItems(class RArray<class CMemSpyApiKernelObjectItem *> &, enum TMemSpyDriverContainerType)
+	?ProcessHandles@CMemSpyApiThread@@QBEHXZ @ 180 NONAME ; int CMemSpyApiThread::ProcessHandles(void) const
+	?Name@CMemSpyApiThread@@QBEABVTDesC16@@XZ @ 181 NONAME ; class TDesC16 const & CMemSpyApiThread::Name(void) const
+	?IsDead@CMemSpyApiProcess@@QBEHXZ @ 182 NONAME ; int CMemSpyApiProcess::IsDead(void) const
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/eabi/MemSpyClientu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,192 @@
+EXPORTS
+	_ZN14CMemSpyApiHeap11BaseAddressEv @ 1 NONAME
+	_ZN14CMemSpyApiHeap11BiggestFreeEv @ 2 NONAME
+	_ZN14CMemSpyApiHeap11HeaderSizeAEv @ 3 NONAME
+	_ZN14CMemSpyApiHeap11HeaderSizeFEv @ 4 NONAME
+	_ZN14CMemSpyApiHeap12FreeOverheadEv @ 5 NONAME
+	_ZN14CMemSpyApiHeap13FragmentationEv @ 6 NONAME
+	_ZN14CMemSpyApiHeap13TotalOverheadEv @ 7 NONAME
+	_ZN14CMemSpyApiHeap14SlackFreeSpaceEv @ 8 NONAME
+	_ZN14CMemSpyApiHeap16AllocationsCountEv @ 9 NONAME
+	_ZN14CMemSpyApiHeap16TotalAllocationsEv @ 10 NONAME
+	_ZN14CMemSpyApiHeap17BiggestAllocationEv @ 11 NONAME
+	_ZN14CMemSpyApiHeap18AllocationOverheadEv @ 12 NONAME
+	_ZN14CMemSpyApiHeap21DebugAllocatorLibraryEv @ 13 NONAME
+	_ZN14CMemSpyApiHeap4SizeEv @ 14 NONAME
+	_ZN14CMemSpyApiHeap4TypeEv @ 15 NONAME
+	_ZN14CMemSpyApiHeap6SharedEv @ 16 NONAME
+	_ZN14CMemSpyApiHeap8OverheadEv @ 17 NONAME
+	_ZN14CMemSpyApiHeap9ChunkSizeEv @ 18 NONAME
+	_ZN14CMemSpyApiHeap9FreeCountEv @ 19 NONAME
+	_ZN14CMemSpyApiHeap9MaxLengthEv @ 20 NONAME
+	_ZN14CMemSpyApiHeap9MinLengthEv @ 21 NONAME
+	_ZN14CMemSpyApiHeap9TotalFreeEv @ 22 NONAME
+	_ZN14CMemSpyApiHeapD1Ev @ 23 NONAME
+	_ZN14CMemSpyApiHeapD2Ev @ 24 NONAME
+	_ZN14RMemSpySession10EndProcessE10TProcessId14TMemSpyEndType @ 25 NONAME
+	_ZN14RMemSpySession11GetThreadsLE10TProcessIdR6RArrayIP16CMemSpyApiThreadE9TSortType @ 26 NONAME
+	_ZN14RMemSpySession13GetOutputSinkE15TMemSpySinkType @ 27 NONAME
+	_ZN14RMemSpySession13GetProcessesLER6RArrayIP17CMemSpyApiProcessE9TSortType @ 28 NONAME
+	_ZN14RMemSpySession13OutputAOListLE9TThreadId25TMemSpyThreadInfoItemType @ 29 NONAME
+	_ZN14RMemSpySession13SetSwmtConfigE38TMemSpyEngineHelperSysMemTrackerConfig @ 30 NONAME
+	_ZN14RMemSpySession13SetSwmtFilterERK7TDesC16 @ 31 NONAME
+	_ZN14RMemSpySession14DumpKernelHeapEv @ 32 NONAME
+	_ZN14RMemSpySession14IsSwmtRunningLEv @ 33 NONAME
+	_ZN14RMemSpySession14OutputHeapDataER14TRequestStatus @ 34 NONAME
+	_ZN14RMemSpySession14OutputHeapDataEv @ 35 NONAME
+	_ZN14RMemSpySession14OutputHeapInfoER14TRequestStatus @ 36 NONAME
+	_ZN14RMemSpySession14StopSwmtTimerLEv @ 37 NONAME
+	_ZN14RMemSpySession14SwitchToThreadE9TThreadIdi @ 38 NONAME
+	_ZN14RMemSpySession15ForceSwmtUpdateER14TRequestStatus @ 39 NONAME
+	_ZN14RMemSpySession15GetInfoItemTypeEi9TThreadIdR25TMemSpyThreadInfoItemType @ 40 NONAME
+	_ZN14RMemSpySession15OutputPhoneInfoER14TRequestStatus @ 41 NONAME
+	_ZN14RMemSpySession15OutputPhoneInfoEv @ 42 NONAME
+	_ZN14RMemSpySession15OutputStackInfoER14TRequestStatus @ 43 NONAME
+	_ZN14RMemSpySession15StartSwmtTimerLEi @ 44 NONAME
+	_ZN14RMemSpySession15StartSwmtTimerLEv @ 45 NONAME
+	_ZN14RMemSpySession15SwitchToProcessE10TProcessIdi @ 46 NONAME
+	_ZN14RMemSpySession16ForceSwmtUpdateLEv @ 47 NONAME
+	_ZN14RMemSpySession16GetKernelObjectsER6RArrayIP22CMemSpyApiKernelObjectE @ 48 NONAME
+	_ZN14RMemSpySession16OutputStackDataLE9TThreadId23TMemSpyDriverDomainType @ 49 NONAME
+	_ZN14RMemSpySession16OutputStackInfoLE9TThreadId @ 50 NONAME
+	_ZN14RMemSpySession17GetKernelObjectsLER6RArrayIP22CMemSpyApiKernelObjectE @ 51 NONAME
+	_ZN14RMemSpySession17SwitchOutputSinkLE15TMemSpySinkType @ 52 NONAME
+	_ZN14RMemSpySession17SwmtResetTrackingEv @ 53 NONAME
+	_ZN14RMemSpySession18GetThreadInfoItemsER6RArrayIP24CMemSpyApiThreadInfoItemE9TThreadId25TMemSpyThreadInfoItemType @ 54 NONAME
+	_ZN14RMemSpySession18SetSwmtCategoriesLEi @ 55 NONAME
+	_ZN14RMemSpySession18SetThreadPriorityLE9TThreadIdi @ 56 NONAME
+	_ZN14RMemSpySession19GetProcessIdByNameLERK7TDesC16 @ 57 NONAME
+	_ZN14RMemSpySession19GetThreadInfoItemsLER6RArrayIP24CMemSpyApiThreadInfoItemE9TThreadId25TMemSpyThreadInfoItemType @ 58 NONAME
+	_ZN14RMemSpySession19OutputHeapInfoUserLE9TThreadId @ 59 NONAME
+	_ZN14RMemSpySession19OutputUserStackDataER14TRequestStatus @ 60 NONAME
+	_ZN14RMemSpySession19SwitchOutputToFileLERK7TDesC16 @ 61 NONAME
+	_ZN14RMemSpySession20GetKernelObjectItemsER6RArrayIP26CMemSpyApiKernelObjectItemE26TMemSpyDriverContainerType @ 62 NONAME
+	_ZN14RMemSpySession20OutputKernelHeapDataER14TRequestStatus @ 63 NONAME
+	_ZN14RMemSpySession20OutputKernelObjectsLEv @ 64 NONAME
+	_ZN14RMemSpySession20SwitchOutputToTraceLEv @ 65 NONAME
+	_ZN14RMemSpySession21GetKernelObjectItemsLER6RArrayIP26CMemSpyApiKernelObjectItemE26TMemSpyDriverContainerType @ 66 NONAME
+	_ZN14RMemSpySession21OutputCompactHeapInfoER14TRequestStatus @ 67 NONAME
+	_ZN14RMemSpySession21OutputHeapCellListingER14TRequestStatus @ 68 NONAME
+	_ZN14RMemSpySession21OutputKernelHeapDataLEv @ 69 NONAME
+	_ZN14RMemSpySession21OutputKernelStackDataER14TRequestStatus @ 70 NONAME
+	_ZN14RMemSpySession21OutputThreadCellListLE9TThreadId @ 71 NONAME
+	_ZN14RMemSpySession21OutputThreadHeapDataLE9TThreadId @ 72 NONAME
+	_ZN14RMemSpySession21OutputThreadHeapDataLERK7TDesC16 @ 73 NONAME
+	_ZN14RMemSpySession21SetSwmtTimerIntervalLEi @ 74 NONAME
+	_ZN14RMemSpySession22OutputCompactHeapInfoLEv @ 75 NONAME
+	_ZN14RMemSpySession22OutputCompactStackInfoER14TRequestStatus @ 76 NONAME
+	_ZN14RMemSpySession23OutputCompactStackInfoLEv @ 77 NONAME
+	_ZN14RMemSpySession23OutputDetailedPhoneInfoER14TRequestStatus @ 78 NONAME
+	_ZN14RMemSpySession24GetMemoryTrackingCyclesLER6RArrayIP29CMemSpyApiMemoryTrackingCycleE @ 79 NONAME
+	_ZN14RMemSpySession24OutputThreadInfoHandlesLE9TThreadId @ 80 NONAME
+	_ZN14RMemSpySession24SetSwmtHeapDumpsEnabledLEi @ 81 NONAME
+	_ZN14RMemSpySession26CancelDeviceWideOperationLEv @ 82 NONAME
+	_ZN14RMemSpySession26OutputAllContainerContentsEv @ 83 NONAME
+	_ZN14RMemSpySession27SetSwmtAutoStartProcessListEP13CArrayFixFlatI4TUidE @ 84 NONAME
+	_ZN14RMemSpySession31ThreadSystemPermanentOrCriticalE9TThreadIdi @ 85 NONAME
+	_ZN14RMemSpySession32ProcessSystemPermanentOrCriticalE10TProcessIdi @ 86 NONAME
+	_ZN14RMemSpySession33NotifyDeviceWideOperationProgressER34TMemSpyDeviceWideOperationProgressR14TRequestStatus @ 87 NONAME
+	_ZN14RMemSpySession7ConnectEv @ 88 NONAME
+	_ZN14RMemSpySession7GetHeapEv @ 89 NONAME
+	_ZN14RMemSpySession8GetHeapLEv @ 90 NONAME
+	_ZN14RMemSpySession9EndThreadE9TThreadId14TMemSpyEndType @ 91 NONAME
+	_ZN14RMemSpySessionC1Ev @ 92 NONAME
+	_ZN14RMemSpySessionC2Ev @ 93 NONAME
+	_ZN16CMemSpyApiThreadD1Ev @ 94 NONAME
+	_ZN16CMemSpyApiThreadD2Ev @ 95 NONAME
+	_ZN17CMemSpyApiProcessD1Ev @ 96 NONAME
+	_ZN17CMemSpyApiProcessD2Ev @ 97 NONAME
+	_ZN22CMemSpyApiKernelObjectD1Ev @ 98 NONAME
+	_ZN22CMemSpyApiKernelObjectD2Ev @ 99 NONAME
+	_ZN24CMemSpyApiThreadInfoItemD1Ev @ 100 NONAME
+	_ZN24CMemSpyApiThreadInfoItemD2Ev @ 101 NONAME
+	_ZN26CMemSpyApiKernelObjectItem12OpenChannelsEv @ 102 NONAME
+	_ZN26CMemSpyApiKernelObjectItem15AddressOfServerEv @ 103 NONAME
+	_ZN26CMemSpyApiKernelObjectItem16AddressOfCodeSegEv @ 104 NONAME
+	_ZN26CMemSpyApiKernelObjectItem20AddressOfKernelOwnerEv @ 105 NONAME
+	_ZN26CMemSpyApiKernelObjectItem21AddressOfOwningThreadEv @ 106 NONAME
+	_ZN26CMemSpyApiKernelObjectItem22AddressOfOwningProcessEv @ 107 NONAME
+	_ZN26CMemSpyApiKernelObjectItem26AddressOfDataBssStackChunkEv @ 108 NONAME
+	_ZN26CMemSpyApiKernelObjectItemD1Ev @ 109 NONAME
+	_ZN26CMemSpyApiKernelObjectItemD2Ev @ 110 NONAME
+	_ZN29CMemSpyApiMemoryTrackingCycleD1Ev @ 111 NONAME
+	_ZN29CMemSpyApiMemoryTrackingCycleD2Ev @ 112 NONAME
+	_ZNK16CMemSpyApiThread10AttributesEv @ 113 NONAME
+	_ZNK16CMemSpyApiThread12RequestCountEv @ 114 NONAME
+	_ZNK16CMemSpyApiThread13ThreadHandlesEv @ 115 NONAME
+	_ZNK16CMemSpyApiThread14ProcessHandlesEv @ 116 NONAME
+	_ZNK16CMemSpyApiThread14ThreadPriorityEv @ 117 NONAME
+	_ZNK16CMemSpyApiThread15ProcessPriorityEv @ 118 NONAME
+	_ZNK16CMemSpyApiThread17ThreadNumberUsingEv @ 119 NONAME
+	_ZNK16CMemSpyApiThread18ProcessNumberUsingEv @ 120 NONAME
+	_ZNK16CMemSpyApiThread2IdEv @ 121 NONAME
+	_ZNK16CMemSpyApiThread3SIDEv @ 122 NONAME
+	_ZNK16CMemSpyApiThread3VIDEv @ 123 NONAME
+	_ZNK16CMemSpyApiThread4NameEv @ 124 NONAME
+	_ZNK16CMemSpyApiThread6CpuUseEv @ 125 NONAME
+	_ZNK16CMemSpyApiThread8ExitTypeEv @ 126 NONAME
+	_ZNK16CMemSpyApiThread9ProcessIdEv @ 127 NONAME
+	_ZNK17CMemSpyApiProcess10ExitReasonEv @ 128 NONAME
+	_ZNK17CMemSpyApiProcess11ThreadCountEv @ 129 NONAME
+	_ZNK17CMemSpyApiProcess12ExitCategoryEv @ 130 NONAME
+	_ZNK17CMemSpyApiProcess2IdEv @ 131 NONAME
+	_ZNK17CMemSpyApiProcess3SIDEv @ 132 NONAME
+	_ZNK17CMemSpyApiProcess3VIDEv @ 133 NONAME
+	_ZNK17CMemSpyApiProcess4NameEv @ 134 NONAME
+	_ZNK17CMemSpyApiProcess8ExitTypeEv @ 135 NONAME
+	_ZNK17CMemSpyApiProcess8PriorityEv @ 136 NONAME
+	_ZNK22CMemSpyApiKernelObject4NameEv @ 137 NONAME
+	_ZNK22CMemSpyApiKernelObject4SizeEv @ 138 NONAME
+	_ZNK22CMemSpyApiKernelObject4TypeEv @ 139 NONAME
+	_ZNK22CMemSpyApiKernelObject5CountEv @ 140 NONAME
+	_ZNK24CMemSpyApiThreadInfoItem5ValueEv @ 141 NONAME
+	_ZNK24CMemSpyApiThreadInfoItem7CaptionEv @ 142 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem10AttributesEv @ 143 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem10NameDetailEv @ 144 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem10ProtectionEv @ 145 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem10TimerStateEv @ 146 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem11AccessCountEv @ 147 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem11NameOfOwnerEv @ 148 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem11SessionTypeEv @ 149 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem12RestrictionsEv @ 150 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem12SecurityZoneEv @ 151 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem14SvrSessionTypeEv @ 152 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem16ControllingOwnerEv @ 153 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem16TotalAccessCountEv @ 154 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem2IdEv @ 155 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem3TopEv @ 156 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem4NameEv @ 157 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem4SizeEv @ 158 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem4TypeEv @ 159 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem5CountEv @ 160 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem5OrderEv @ 161 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem5StateEv @ 162 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem6BottomEv @ 163 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem6HandleEv @ 164 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem7ChangesEv @ 165 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem7MapAttrEv @ 166 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem7MaxSizeEv @ 167 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem7VersionEv @ 168 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem8MapCountEv @ 169 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem8MsgCountEv @ 170 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem8MsgLimitEv @ 171 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem8PriorityEv @ 172 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem8StartPosEv @ 173 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem8UniqueIDEv @ 174 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9ChunkTypeEv @ 175 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9CreatorIdEv @ 176 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9ParseMaskEv @ 177 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9ResettingEv @ 178 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9TimerTypeEv @ 179 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9UnitsMaskEv @ 180 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9WaitCountEv @ 181 NONAME
+	_ZNK29CMemSpyApiMemoryTrackingCycle10FreeMemoryEv @ 182 NONAME
+	_ZNK29CMemSpyApiMemoryTrackingCycle11CycleNumberEv @ 183 NONAME
+	_ZNK29CMemSpyApiMemoryTrackingCycle11MemoryDeltaEv @ 184 NONAME
+	_ZNK29CMemSpyApiMemoryTrackingCycle17PreviousCycleDiffEv @ 185 NONAME
+	_ZNK29CMemSpyApiMemoryTrackingCycle4TimeEv @ 186 NONAME
+	_ZNK29CMemSpyApiMemoryTrackingCycle7CaptionEv @ 187 NONAME
+	_ZNK34TMemSpyDeviceWideOperationProgress11DescriptionEv @ 188 NONAME
+	_ZNK34TMemSpyDeviceWideOperationProgress8ProgressEv @ 189 NONAME
+	_ZNK17CMemSpyApiProcess6IsDeadEv @ 190 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/group/MemSpyClient.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+*/
+
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGETTYPE dll
+TARGET MemSpyClient.dll
+UID 0 0x2002EA8E
+VENDORID	VID_DEFAULT
+SMPSAFE
+
+CAPABILITY PowerMgmt SwEvent ReadUserData WriteUserData ReadDeviceData WriteDeviceData CommDD MultimediaDD DRM TrustedUI ProtServ DiskAdmin NetworkControl AllFiles NetworkServices LocalServices Location SurroundingsDD UserEnvironment
+
+SOURCEPATH ../src
+SOURCE 		memspysession.cpp 
+SOURCE 		memspyapiprocess.cpp 
+SOURCE 		memspyapikernelobject.cpp 
+SOURCE		memspyapiheap.cpp 
+SOURCE 		memspyapikernelobjectitem.cpp 
+SOURCE		memspyapithread.cpp 
+SOURCE		memspyapithreadinfoitem.cpp
+SOURCE		memspyapimemorytrackingcycle.cpp
+
+USERINCLUDE ../inc
+
+OS_LAYER_SYSTEMINCLUDE
+
+LIBRARY 		euser.lib
+LIBRARY			ecom.lib
+LIBRARY			efsrv.lib
+LIBRARY			estor.lib
+LIBRARY			bafl.lib
+LIBRARY			ws32.lib
+LIBRARY			cone.lib
+LIBRARY			eikcore.lib
+LIBRARY			fbscli.lib 
+LIBRARY 		PlatformEnv.lib
+LIBRARY         MemSpyEngine.lib
+
+//EXPORTUNFROZEN
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* 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:
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_EXPORTS
+// Public API
+../inc/memspysession.h OS_LAYER_PLATFORM_EXPORT_PATH(memspysession.h)
+../inc/memspyprocessdata.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/engine/memspyprocessdata.h)
+../inc/memspykernelobjectdata.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/engine/memspykernelobjectdata.h)
+../inc/memspyheapdata.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/engine/memspyheapdata.h)
+../inc/memspythreaddata.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/engine/memspythreaddata.h)
+../inc/memspythreadinfoitemdata.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/engine/memspythreadinfoitemdata.h)
+../inc/memspymemorytrackingcycledata.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/engine/memspymemorytrackingcycledata.h)
+
+../inc/memspyapiprocess.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/api/memspyapiprocess.h)
+../inc/memspyapikernelobject.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/api/memspyapikernelobject.h)
+../inc/memspyapikernelobjectitem.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/api/memspyapikernelobjectitem.h)
+../inc/memspyapiheap.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/api/memspyapiheap.h)
+../inc/memspyapithread.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/api/memspyapithread.h)
+../inc/memspyapithreadinfoitem.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/api/memspyapithreadinfoitem.h)
+../inc/memspyapimemorytrackingcycle.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/api/memspyapimemorytrackingcycle.h)
+
+PRJ_MMPFILES
+MemSpyClient.mmp
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspyapiheap.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,69 @@
+/*
+* 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 the declaration of  CMemSpyApiHeap class 
+*/
+
+#ifndef MEMSPYAPIHEAP_H
+#define MEMSPYAPIHEAP_H
+
+// System includes
+#include <e32base.h>
+
+class TMemSpyHeapData;
+
+NONSHARABLE_CLASS( CMemSpyApiHeap ) 
+	{
+public:
+	IMPORT_C ~CMemSpyApiHeap();
+	
+	static CMemSpyApiHeap* NewL(const TMemSpyHeapData& aData);
+
+	static CMemSpyApiHeap* NewLC(const TMemSpyHeapData& aData);
+	
+public: //API
+	IMPORT_C TDesC& Type();
+	IMPORT_C TInt Size();
+	IMPORT_C TInt BaseAddress();
+	IMPORT_C TBool Shared();
+	IMPORT_C TInt ChunkSize();
+	IMPORT_C TInt AllocationsCount();
+	IMPORT_C TInt FreeCount();
+	IMPORT_C TInt BiggestAllocation();
+	IMPORT_C TInt BiggestFree();
+	IMPORT_C TInt TotalAllocations();
+	IMPORT_C TInt TotalFree();
+	IMPORT_C TInt SlackFreeSpace();
+	IMPORT_C TInt Fragmentation(); // Percentage value, iSize is 100% - value for calculation
+	IMPORT_C TInt HeaderSizeA();
+	IMPORT_C TInt HeaderSizeF();
+	IMPORT_C TInt AllocationOverhead();
+	IMPORT_C TInt FreeOverhead();
+	IMPORT_C TInt TotalOverhead();
+	IMPORT_C TInt Overhead(); //Percentage value, iSize is 100% - value for calculation
+	IMPORT_C TInt MinLength();
+	IMPORT_C TInt MaxLength();
+	IMPORT_C TBool DebugAllocatorLibrary();
+	
+private:
+	CMemSpyApiHeap();
+	
+	void ConstructL(const TMemSpyHeapData& aData);
+		
+private:
+	TMemSpyHeapData *iHeapData;
+};
+
+	
+#endif // MEMSPYAPIHEAP_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspyapikernelobject.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,56 @@
+/*
+* 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 MEMSPYAPIPKERNELOBJECT_H
+#define MEMSPYAPIPKERNELOBJECT_H
+
+// System includes
+#include <e32base.h>
+
+#include <memspy/driver/memspydriverenumerationsshared.h>
+
+class TMemSpyKernelObjectData;
+
+NONSHARABLE_CLASS( CMemSpyApiKernelObject ) 
+	{
+public:
+	IMPORT_C ~CMemSpyApiKernelObject();
+	
+	static CMemSpyApiKernelObject* NewL(const TMemSpyKernelObjectData& aData);
+
+	static CMemSpyApiKernelObject* NewLC(const TMemSpyKernelObjectData& aData);
+	
+public:
+	IMPORT_C TMemSpyDriverContainerType Type() const;
+	
+	IMPORT_C const TDesC& Name() const;	
+						
+	IMPORT_C TInt Count() const;
+		
+	IMPORT_C TInt64 Size() const;
+	
+private:
+	CMemSpyApiKernelObject();
+	
+	void ConstructL(const TMemSpyKernelObjectData& aData);
+		
+private:
+	TMemSpyKernelObjectData *iKernelObjectData;
+};
+
+	
+#endif // MEMSPYAPIPKERNELOBJECT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspyapikernelobjectitem.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,128 @@
+/*
+* 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 the declaration of  CMemSpyProcess class 
+*/
+
+#ifndef MEMSPYAPIKERNELOBJECTITEM_H
+#define MEMSPYAPIKERNELOBJECTITEM_H
+
+// System includes
+#include <e32base.h>
+#include <memspy/driver/memspydriverenumerationsshared.h>
+
+class TMemSpyDriverHandleInfoGeneric;
+//class TMemSpyDriverContainerType;	
+//class TMemSpyDriverTimerType;
+//class TMemSpyDriverTimerState;
+
+NONSHARABLE_CLASS( CMemSpyApiKernelObjectItem ) 
+	{
+public:
+	IMPORT_C ~CMemSpyApiKernelObjectItem();
+	
+	static CMemSpyApiKernelObjectItem* NewL(const TMemSpyDriverHandleInfoGeneric& aData);
+
+	static CMemSpyApiKernelObjectItem* NewLC(const TMemSpyDriverHandleInfoGeneric& aData);
+	
+public:	
+	
+	IMPORT_C const TDesC8& Name() const;	
+	
+	IMPORT_C TAny* Handle() const;
+	
+	IMPORT_C TMemSpyDriverContainerType Type() const;
+	
+    // For Process, thread, chunk (owning process id), server (owning thread id)
+    IMPORT_C TInt Id() const;
+
+    // For Chunk, Library
+    IMPORT_C TUint32 Size() const;
+   
+    // For Semaphore, Mutex, Server
+    IMPORT_C TInt Count() const;
+
+    // For Mutex
+    IMPORT_C TInt WaitCount() const;
+
+    // For Server, Session
+    IMPORT_C TIpcSessionType SessionType() const;
+
+    // For Timer
+    IMPORT_C TMemSpyDriverTimerType TimerType() const;
+    IMPORT_C TMemSpyDriverTimerState TimerState() const;
+
+    // For Logical channel
+    IMPORT_C TInt OpenChannels();
+    
+    // For most of the object types
+    IMPORT_C const TDesC8& NameDetail() const; // Name
+    IMPORT_C TInt AccessCount() const;
+    IMPORT_C TInt UniqueID() const;
+    IMPORT_C TUint Protection() const;
+    IMPORT_C TUint8* AddressOfKernelOwner();
+    IMPORT_C TInt Priority() const;
+    IMPORT_C TUint8* AddressOfOwningProcess();
+    IMPORT_C TUint CreatorId() const;
+    IMPORT_C TUint SecurityZone() const;
+    IMPORT_C TInt Attributes() const;
+    IMPORT_C TUint8* AddressOfDataBssStackChunk();
+
+    // For Server, Session
+    IMPORT_C TUint8* AddressOfOwningThread();
+    IMPORT_C TUint8* AddressOfServer();
+    IMPORT_C TUint16 TotalAccessCount() const;
+    IMPORT_C TUint8 SvrSessionType() const;
+    IMPORT_C TInt MsgCount() const;
+    IMPORT_C TInt MsgLimit() const;
+    
+    // For chunk
+    IMPORT_C TInt MaxSize() const;
+    IMPORT_C TInt Bottom() const;
+    IMPORT_C TInt Top() const;
+    IMPORT_C TInt StartPos() const;
+    IMPORT_C TUint ControllingOwner() const;
+    IMPORT_C TUint Restrictions() const;
+    IMPORT_C TUint MapAttr() const;
+    IMPORT_C TUint ChunkType() const;
+    IMPORT_C const TDesC8& NameOfOwner() const; // chunk, server
+    
+    // For library
+    IMPORT_C TInt MapCount() const;
+    IMPORT_C TUint8 State() const;
+    IMPORT_C TUint8* AddressOfCodeSeg();
+    
+    // Semaphore, mutex, condvar
+    IMPORT_C TUint8 Resetting() const;
+    IMPORT_C TUint8 Order() const;
+    
+    // For Logical/Physical device
+    IMPORT_C TVersion Version() const;
+    IMPORT_C TUint ParseMask() const;
+    IMPORT_C TUint UnitsMask() const;
+    
+    // For change notifier
+    IMPORT_C TUint Changes() const;
+	
+private:
+	CMemSpyApiKernelObjectItem();
+	
+	void ConstructL(const TMemSpyDriverHandleInfoGeneric& aData);
+		
+private:
+	TMemSpyDriverHandleInfoGeneric *iItem;
+};
+
+	
+#endif // MEMSPYAPIKERNELOBJECTITEM_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspyapimemorytrackingcycle.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,52 @@
+/*
+* 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 MEMSPYAPIMEMORYTRACKINGCYCLE_H_
+#define MEMSPYAPIMEMORYTRACKINGCYCLE_H_
+
+#include <e32base.h>
+
+class TMemSpyMemoryTrackingCycleData;
+
+class CMemSpyApiMemoryTrackingCycle
+	{
+public: // API
+	IMPORT_C TInt CycleNumber() const;
+	IMPORT_C const TTime& Time() const;
+	IMPORT_C const TDesC& Caption() const;
+	IMPORT_C const TInt64& FreeMemory() const;
+	IMPORT_C TInt64 MemoryDelta() const;
+	IMPORT_C TInt64 PreviousCycleDiff() const;
+	
+public:
+	IMPORT_C ~CMemSpyApiMemoryTrackingCycle();
+	
+	static CMemSpyApiMemoryTrackingCycle* NewL(const TMemSpyMemoryTrackingCycleData& aData);
+
+	static CMemSpyApiMemoryTrackingCycle* NewLC(const TMemSpyMemoryTrackingCycleData& aData);
+	
+private:
+	CMemSpyApiMemoryTrackingCycle();
+	
+	void ConstructL(const TMemSpyMemoryTrackingCycleData& aData);
+	
+private:
+	TMemSpyMemoryTrackingCycleData* iData;
+	
+	};
+
+#endif /* MEMSPYAPIMEMORYTRACKINGCYCLE_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspyapiprocess.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,67 @@
+/*
+* 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 the declaration of  CMemSpyProcess class 
+*/
+
+#ifndef MEMSPYAPIPROCESS_H
+#define MEMSPYAPIPROCESS_H
+
+// System includes
+#include <e32base.h>
+
+class TMemSpyProcessData;
+
+NONSHARABLE_CLASS( CMemSpyApiProcess ) 
+	{
+public:
+	IMPORT_C ~CMemSpyApiProcess();
+	
+	static CMemSpyApiProcess* NewL(const TMemSpyProcessData& aData);
+
+	static CMemSpyApiProcess* NewLC(const TMemSpyProcessData& aData);
+	
+public:
+	IMPORT_C TProcessId Id() const;
+	
+	IMPORT_C const TDesC& Name() const;	
+	
+	IMPORT_C TExitCategoryName ExitCategory() const;
+	
+	IMPORT_C TInt ExitReason() const;
+	
+	IMPORT_C TExitType ExitType() const;
+	
+	IMPORT_C TInt ThreadCount() const;
+	
+	IMPORT_C TUint32 SID() const;
+	
+	IMPORT_C TUint32 VID() const;
+	
+	IMPORT_C TProcessPriority Priority() const;
+	
+	IMPORT_C TBool IsDead() const;
+	
+	
+private:
+	CMemSpyApiProcess();
+	
+	void ConstructL(const TMemSpyProcessData& aData);
+		
+private:
+	TMemSpyProcessData *iProcessData;
+};
+
+	
+#endif // MEMSPYAPIPROCESS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspyapithread.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,73 @@
+/*
+* 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 the declaration of  CMemSpyProcessWrapper class and TMemSpyProcess data class
+*/
+
+#ifndef MEMSPYAPITHREAD_H
+#define MEMSPYAPITHREAD_H
+
+// System includes
+#include <e32base.h>
+
+class TMemSpyThreadData;
+
+NONSHARABLE_CLASS( CMemSpyApiThread ) {
+
+public:
+	IMPORT_C ~CMemSpyApiThread();
+	
+	static CMemSpyApiThread* NewL(const TMemSpyThreadData& aData);
+
+	static CMemSpyApiThread* NewLC(const TMemSpyThreadData& aData);
+
+public:
+	IMPORT_C TThreadId Id() const;
+	IMPORT_C TProcessId ProcessId() const;
+	
+	IMPORT_C const TDesC& Name() const;
+		
+	IMPORT_C TInt SID() const;
+	
+	IMPORT_C TInt VID() const;
+	
+	IMPORT_C TThreadPriority ThreadPriority() const;
+	
+	IMPORT_C TProcessPriority ProcessPriority() const;
+	
+	IMPORT_C TInt RequestCount() const;
+	
+	IMPORT_C TInt ThreadHandles() const;
+	
+	IMPORT_C TInt ProcessHandles() const;
+	
+	IMPORT_C TInt ThreadNumberUsing() const;
+	
+	IMPORT_C TInt ProcessNumberUsing() const;
+	
+	IMPORT_C TInt Attributes() const;
+	
+	IMPORT_C TInt CpuUse() const;
+	
+	IMPORT_C TExitType ExitType() const;
+	
+private:
+	CMemSpyApiThread();	
+	
+	void ConstructL(const TMemSpyThreadData& aData);
+private:
+	TMemSpyThreadData* iThreadData;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspyapithreadinfoitem.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,50 @@
+/*
+* 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 the declaration of  CMemSpyProcess class 
+*/
+
+#ifndef MEMSPYAPITHREADINFOITEM_H
+#define MEMSPYAPITHREADINFOITEM_H
+
+// System includes
+#include <e32base.h>
+
+class TMemSpyThreadInfoItemData;
+
+NONSHARABLE_CLASS( CMemSpyApiThreadInfoItem ) 
+	{
+public:
+	IMPORT_C ~CMemSpyApiThreadInfoItem();
+	
+	static CMemSpyApiThreadInfoItem* NewL(const TMemSpyThreadInfoItemData& aData);
+
+	static CMemSpyApiThreadInfoItem* NewLC(const TMemSpyThreadInfoItemData& aData);
+	
+public:		
+	IMPORT_C const TDesC& Caption() const;	
+	
+	IMPORT_C const TDesC& Value() const;	
+	
+private:
+	CMemSpyApiThreadInfoItem();
+	
+	void ConstructL(const TMemSpyThreadInfoItemData& aData);
+		
+private:
+	TMemSpyThreadInfoItemData *iInfoItem;
+};
+
+	
+#endif // MEMSPYAPITHREADINFOITEM_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspyheapdata.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,64 @@
+/*
+* 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 the declaration of  TMemSpyProcessData class
+*/
+
+#ifndef MEMSPYHEAPDATA_H
+#define MEMSPYHEAPDATA_H
+
+#include <memspy/driver/memspydriverobjectsshared.h>
+
+// Constants
+const TInt KBuf = 16;
+
+// TMemSpyProcess data class holds data to be sent to the UI
+class TMemSpyHeapData 
+	{	
+public:
+	//constructor & destructor
+	inline TMemSpyHeapData()		
+	: iSize(0), iBaseAddress(0), iShared(EFalse), iChunkSize(0),
+	iAllocationsCount(0), iFreeCount(0), iBiggestAllocation(0), iBiggestFree(0), iTotalAllocations(0),
+    iTotalFree(0), iSlackFreeSpace(0), iFragmentation(0), iHeaderSizeA(0), iHeaderSizeF(0), iAllocationOverhead(0),
+    iFreeOverhead(0), iTotalOverhead(0), iOverhead(0), iMinLength(0), iMaxLength(0), iDebugAllocatorLibrary(EFalse)
+		{
+		}
+	
+public:
+	TBuf<KBuf> iType;
+	TUint iSize;
+	TLinAddr iBaseAddress;
+	TBool iShared;
+	TUint iChunkSize;
+	TUint iAllocationsCount;
+	TUint iFreeCount;
+	TUint iBiggestAllocation;
+	TUint iBiggestFree;
+    TUint iTotalAllocations;
+    TUint iTotalFree;
+    TUint iSlackFreeSpace;
+    TReal iFragmentation;
+    TUint iHeaderSizeA;
+    TUint iHeaderSizeF;
+    TUint iAllocationOverhead;
+    TUint iFreeOverhead;
+    TUint iTotalOverhead;
+    TReal iOverhead;
+    TInt iMinLength;
+    TInt iMaxLength;
+    TBool iDebugAllocatorLibrary;
+	};
+
+#endif // MEMSPYHEAPDATA_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspykernelobjectdata.h	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+* Contains the declaration of  TMemSpyProcessData class
+*/
+
+#ifndef MEMSPYKERNELOBJECTDATA_H
+#define MEMSPYKERNELOBJECTDATA_H
+
+#include <memspy/driver/memspydriverenumerationsshared.h>
+
+// Constants
+const TInt KBufSize = 128;
+
+// TMemSpyProcess data class holds data to be sent to the UI
+class TMemSpyKernelObjectData 
+	{	
+public:
+	//constructor & destructor
+	inline TMemSpyKernelObjectData()
+		: iCount(0), iSize(0)
+		{
+		}
+	
+public:    
+    TMemSpyDriverContainerType iType;
+    TFullName iName;
+    TInt iCount;
+    TInt64 iSize;
+	};
+
+#endif // MEMSPYKERNELOBJECTDATA_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspymemorytrackingcycledata.h	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+* 
+*/
+
+
+#ifndef MEMSPYMEMORYTRACKINGCYCLEDATA_H_
+#define MEMSPYMEMORYTRACKINGCYCLEDATA_H_
+
+struct TMemSpyMemoryTrackingCycleData
+	{
+	TInt iCycleNumber;
+	TTime iTime;
+	TFullName iCaption;
+	TInt64 iFreeMemory;
+	TInt64 iMemoryDelta;
+	TInt64 iPreviousCycleDiff;
+	};
+
+#endif /* MEMSPYMEMORYTRACKINGCYCLEDATA_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspyprocessdata.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,46 @@
+/*
+* 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 the declaration of  TMemSpyProcessData class
+*/
+
+#ifndef MEMSPYPROCESSDATA_H
+#define MEMSPYPROCESSDATA_H
+
+#include <memspy/driver/memspydriverobjectsshared.h>
+
+// TMemSpyProcess data class holds data to be sent to the UI
+class TMemSpyProcessData 
+	{	
+public:
+	//constructor & destructor
+	inline TMemSpyProcessData()
+		: iId(0), iThreadCount(0), iExitCategory(0), iExitReason(0)
+		{
+		}
+	
+public:
+    TProcessId iId;        
+    TFullName iName;
+    TProcessPriority iPriority;
+    TExitCategoryName iExitCategory;
+    TInt iExitReason;
+    TExitType iExitType;
+    TInt iThreadCount;
+    TUint32 iSID;
+    TUint32 iVID;
+    TBool iIsDead;
+	};
+
+#endif // MEMSPYPROCESSDATA_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspysession.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,248 @@
+/*
+* 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 MEMSPYSESSION_H
+#define MEMSPYSESSION_H
+
+
+// System includes
+#include <e32base.h>
+#include <u32std.h>
+
+//user includes
+#include <memspy/api/memspyapiprocess.h>
+
+#include <memspy/api/memspyapithread.h>
+#include <memspy/api/memspyapithreadinfoitem.h>
+#include <memspy/engine/memspythreadinfoitemdata.h>
+#include <memspy/engine/memspyengineobjectthreadinfoobjects.h>
+#include <memspy/engine/memspydevicewideoperations.h>
+
+#include <memspy/api/memspyapikernelobject.h>
+
+#include <memspy/api/memspyapikernelobjectitem.h> //for KernelObjectItems
+
+#include <memspy/api/memspyapiheap.h>
+
+#include <memspy/api/memspyapimemorytrackingcycle.h>
+
+#include <memspyengineclientinterface.h>
+#include <memspy/engine/memspyengineoutputsinktype.h>
+
+#include <memspy/engine/memspyenginehelpersysmemtrackerconfig.h>
+
+// Constants
+const TInt KMemSpyVersion           = 2;
+
+enum TSortType
+	{
+	ESortProcById,
+	ESortProcByName,
+	ESortProcByThreadCount,
+	ESortProcByCodeSegs,
+	ESortProcByHeapUsage,
+	ESortProcByStackUsage
+	};
+
+enum TMemSpyOutputType
+    {
+    EOutputTypeDebug = 0,
+    EOutputTypeFile
+    };
+
+class TMemSpyDeviceWideOperationProgress 
+	{
+public:
+	IMPORT_C TInt Progress() const;
+	IMPORT_C const TDesC& Description() const;
+	
+private:
+	TPckgBuf<TInt> iProgress;
+	TFullName iDescription;
+	
+friend class RMemSpySession;
+	};
+
+
+NONSHARABLE_CLASS( RMemSpySession ) : public RSessionBase
+    {
+public:
+    IMPORT_C RMemSpySession();
+    IMPORT_C TInt Connect();
+    
+public:	//API
+    //Thread speciifc operations
+    IMPORT_C void OutputKernelHeapDataL(); //EMemSpyClientServerOpHeapData
+    
+    IMPORT_C void OutputKernelHeapData(TRequestStatus& aStatus); //EMemSpyClientServerOpHeapData
+    
+    IMPORT_C void OutputThreadHeapDataL(TThreadId aThreadId); //EMemSpyClientServerOpHeapData
+    
+    IMPORT_C void OutputThreadHeapDataL(const TDesC& aThreadName); //EMemSpyClientServerOpHeapData
+    
+    IMPORT_C void OutputThreadCellListL(TThreadId aThreadId);//EMemSpyClientServerOpHeapCellListing    
+    
+    IMPORT_C void OutputHeapInfoUserL(TThreadId aThreadId);	//EMemSpyClientServerOpHeapInfo
+    
+    IMPORT_C void SwitchOutputSinkL( TMemSpySinkType aType); //EMemSpyClientServerOpSwitchOutputSinkFile / EMemSpyClientServerOpSwitchOutputSinkTrace
+    
+    IMPORT_C void SwitchOutputToTraceL(); // EMemSpyClientServerOpSwitchOutputSinkTrace
+    
+    IMPORT_C void SwitchOutputToFileL(const TDesC& aRootFolder); // EMemSpyClientServerOpSwitchOutputSinkFile
+    
+    IMPORT_C void OutputStackInfoL(TThreadId aThreadId); //EMemSpyClientServerOpStackInfo
+    
+    IMPORT_C void OutputStackDataL(TThreadId aThreadId, TMemSpyDriverDomainType aType ); //EMemSpyClientServerOpStackDataUser / EMemSpyClientServerOpStackDataKernel    
+    
+    IMPORT_C void OutputThreadInfoHandlesL(TThreadId aThreadId); //EMemSpyClientServerOpOutputInfoHandles
+    
+    IMPORT_C void OutputAOListL(TThreadId aId, TMemSpyThreadInfoItemType aType);	//EMemSpyClientServerOpOutputAOList    
+    
+    IMPORT_C void OutputKernelObjectsL();// EMemSpyClientServerOpEnumerateKernelContainerAll
+    
+    IMPORT_C void OutputCompactStackInfoL();// EMemSpyClientServerOpStackInfoCompact
+    
+    IMPORT_C void OutputCompactHeapInfoL();// EMemSpyClientServerOpHeapInfoCompact
+    
+    // Device Wide Operations
+    // Synchronous operations - for CLI
+    IMPORT_C void OutputHeapData();
+    
+    // Asynchronous operations
+    IMPORT_C void OutputPhoneInfo(TRequestStatus& aStatus);
+    
+    IMPORT_C void OutputDetailedPhoneInfo(TRequestStatus& aStatus);
+    
+    IMPORT_C void OutputHeapInfo(TRequestStatus& aStatus);
+    
+    IMPORT_C void OutputCompactHeapInfo(TRequestStatus &aStatus);
+    
+    IMPORT_C void OutputHeapCellListing(TRequestStatus& aStatus);
+    
+    IMPORT_C void OutputHeapData(TRequestStatus& aStatus);
+    
+    IMPORT_C void OutputStackInfo(TRequestStatus& aStatus);
+    
+    IMPORT_C void OutputCompactStackInfo(TRequestStatus &aStatus);
+    
+    IMPORT_C void OutputUserStackData(TRequestStatus& aStatus);
+    
+    IMPORT_C void OutputKernelStackData(TRequestStatus& aStatus);
+    
+    IMPORT_C void NotifyDeviceWideOperationProgress(TMemSpyDeviceWideOperationProgress &aProgress, TRequestStatus &aStatus);
+    
+    IMPORT_C void CancelDeviceWideOperationL();
+    
+    // Synchronous operations for MemSpyLauncher
+    IMPORT_C void OutputPhoneInfo();
+    
+    // "Ui" operations 
+    
+    IMPORT_C void GetProcessesL(RArray<CMemSpyApiProcess*> &aProcesses, TSortType aSortType = ESortProcById);
+    
+    IMPORT_C TProcessId GetProcessIdByNameL(const TDesC& aProcessName);
+    
+    IMPORT_C void GetThreadsL(TProcessId aProcessId, RArray<CMemSpyApiThread*> &aThreads, TSortType aSortType = ESortProcById);
+    
+    IMPORT_C TInt ProcessSystemPermanentOrCritical( TProcessId aId, TBool aValue ); //aValue -> return value
+    
+    IMPORT_C void SetThreadPriorityL(TThreadId aId, TInt aPriority);
+    
+    IMPORT_C TInt EndProcess( TProcessId aId, TMemSpyEndType aType );
+    
+    IMPORT_C TInt SwitchToProcess( TProcessId aId, TBool aBrought  );
+    
+    //SWMT operations
+    
+    IMPORT_C void GetMemoryTrackingCyclesL(RArray<CMemSpyApiMemoryTrackingCycle*>& aCycles);
+    
+    IMPORT_C void SetSwmtConfig( TMemSpyEngineHelperSysMemTrackerConfig aConfig );    
+    
+    IMPORT_C void SetSwmtAutoStartProcessList( CArrayFixFlat<TUid>* aList );
+    
+    IMPORT_C void SetSwmtFilter( const TDesC& aFilter );            
+    
+    IMPORT_C void SetSwmtCategoriesL(TInt aCategories);
+
+    IMPORT_C void SetSwmtHeapDumpsEnabledL(TBool aEnabled);
+    
+    IMPORT_C void SwmtResetTracking();
+    
+    IMPORT_C void GetOutputSink( TMemSpySinkType aType );
+           
+    IMPORT_C TBool IsSwmtRunningL();
+    
+    IMPORT_C void StartSwmtTimerL(TInt aPeriod);
+    
+    IMPORT_C void StartSwmtTimerL(); // for CLI
+    
+    IMPORT_C void SetSwmtTimerIntervalL(TInt aPeriod); //for CLI
+    
+    IMPORT_C void StopSwmtTimerL();
+    
+    IMPORT_C void ForceSwmtUpdateL();
+    
+    IMPORT_C void ForceSwmtUpdate(TRequestStatus& aStatus);
+    
+    //Threads operations
+    /**
+     * 
+     */
+    IMPORT_C void GetThreadsL(TProcessId aProcessId, RArray<CMemSpyApiProcess*> &aThreads, TSortType aSortType = ESortProcById);
+    
+    IMPORT_C TInt ThreadSystemPermanentOrCritical( TThreadId aId, TBool aValue );
+        
+    IMPORT_C TInt EndThread( TThreadId aId, TMemSpyEndType aType );
+    
+    IMPORT_C TInt SwitchToThread( TThreadId aId, TBool aBrought );
+    
+    IMPORT_C TInt GetInfoItemType( TInt aIndex, TThreadId aId, TMemSpyThreadInfoItemType &aType );
+    
+    IMPORT_C TInt GetThreadInfoItems( RArray<CMemSpyApiThreadInfoItem*> &aInfoItems, TThreadId aId, TMemSpyThreadInfoItemType aType );
+    
+    IMPORT_C void GetThreadInfoItemsL( RArray<CMemSpyApiThreadInfoItem*> &aInfoItems, TThreadId aId, TMemSpyThreadInfoItemType aType );
+        
+    
+    //KernelObjects operations
+    
+    IMPORT_C void GetKernelObjectsL( RArray<CMemSpyApiKernelObject*> &aKernelObjects );
+    
+    IMPORT_C TInt GetKernelObjects( RArray<CMemSpyApiKernelObject*> &aKernelObjects );
+    
+    IMPORT_C void GetKernelObjectItemsL( RArray<CMemSpyApiKernelObjectItem*> &aKernelObjectItems, TMemSpyDriverContainerType aForContainer );
+    
+    IMPORT_C TInt GetKernelObjectItems( RArray<CMemSpyApiKernelObjectItem*> &aKernelObjectItems, TMemSpyDriverContainerType aForContainer );
+    
+    IMPORT_C void OutputAllContainerContents();
+    
+    // Heap 
+    
+    IMPORT_C CMemSpyApiHeap* GetHeapL();
+    
+	IMPORT_C CMemSpyApiHeap* GetHeap();
+	
+	IMPORT_C void DumpKernelHeap();	
+	
+private:
+    TInt StartServer();       
+    
+    void SetOutputTypeL(TMemSpyOutputType aOutputType);
+    
+    };
+
+#endif // MEMSPYSESSION_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspythreaddata.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,50 @@
+/*
+* 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 MEMSPYTHREADDATA_H
+#define MEMSPYTHREADDATA_H
+
+//#include <kernel/arm/arm_types.h>
+
+class TMemSpyThreadData {
+public:
+	TMemSpyThreadData()
+	: iId(0), iPid(0), iSID(0), iVID(0), iRequestCount(0), iThreadHandles(0), iProcessHandles(0), iThreadNumberUsing(0), 
+	  iProcessNumberUsing(0), iAttributes(0), iCpuUse(0)
+		{
+		}
+	
+public:
+    TThreadId iId;
+    TProcessId iPid;    
+    TFullName iName;    //name without formatting. Formatting to be moved to the Avkon UI part
+    TInt iSID;
+    TInt iVID;
+    TThreadPriority iThreadPriority;
+    TProcessPriority iProcessPriority;
+    TInt iRequestCount;
+    TInt iThreadHandles;
+    TInt iProcessHandles;
+    TInt iThreadNumberUsing;
+    TInt iProcessNumberUsing;
+    TInt iAttributes;
+    TInt iCpuUse;        
+    TExitType iExitType;
+    RArray<TUint> iRegisters; //containts register contents of the thread (R00-R12, SP, LR, PC, Flags & DACR) - TUint for formating to HEX    
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspythreadinfoitemdata.h	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+* Contains the declaration of  TMemSpyProcessData class
+*/
+
+#ifndef MEMSPYTHREADINFOITEMDATA_H
+#define MEMSPYTHREADINFOITEMDATA_H
+
+#include <memspy/driver/memspydriverobjectsshared.h>
+
+// TMemSpyProcess data class holds data to be sent to the UI
+class TMemSpyThreadInfoItemData 
+	{	
+public:
+	//constructor & destructor
+	inline TMemSpyThreadInfoItemData()		
+		{
+		}
+	
+public:
+    TBuf<64> iCaption;
+    TBuf<32> iValue;
+	};
+
+#endif // MEMSPYTHREADINFOITEMDATA_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/src/memspyapiheap.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,162 @@
+/*
+* 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:
+*
+*/
+
+#include <memspy/api/memspyapiheap.h>
+#include <memspy/engine/memspyengine.h>
+#include <memspy/engine/memspyheapdata.h>
+
+
+CMemSpyApiHeap::CMemSpyApiHeap() 
+	: iHeapData(0)
+	{
+	}
+
+EXPORT_C CMemSpyApiHeap::~CMemSpyApiHeap()
+	{
+	delete iHeapData;
+	}
+
+void CMemSpyApiHeap::ConstructL(const TMemSpyHeapData& aData)
+	{
+	iHeapData = new (ELeave) TMemSpyHeapData(aData);
+	}
+
+CMemSpyApiHeap* CMemSpyApiHeap::NewL(const TMemSpyHeapData& aData)
+	{
+	CMemSpyApiHeap* self = CMemSpyApiHeap::NewLC(aData);
+	CleanupStack::Pop(self);
+	return (self);
+	}
+
+CMemSpyApiHeap* CMemSpyApiHeap::NewLC(const TMemSpyHeapData& aData)
+	{
+	CMemSpyApiHeap* self = new (ELeave) CMemSpyApiHeap;
+	CleanupStack::PushL(self);
+	self->ConstructL(aData);
+	return (self);
+	}
+
+//api methods
+EXPORT_C TDesC& CMemSpyApiHeap::Type()
+	{
+	return iHeapData->iType;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::Size()
+	{
+	return iHeapData->iSize;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::BaseAddress()
+	{
+	return iHeapData->iBaseAddress;
+	}
+
+EXPORT_C TBool CMemSpyApiHeap::Shared()
+	{
+	return iHeapData->iShared;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::ChunkSize()
+	{
+	return iHeapData->iChunkSize;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::AllocationsCount()
+	{
+	return iHeapData->iAllocationsCount;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::FreeCount()
+	{
+	return iHeapData->iFreeCount;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::BiggestAllocation()
+	{
+	return iHeapData->iBiggestAllocation;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::BiggestFree()
+	{
+	return iHeapData->iBiggestFree;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::TotalAllocations()
+	{
+	return iHeapData->iTotalAllocations;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::TotalFree()
+	{
+	return iHeapData->iTotalFree;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::SlackFreeSpace()
+	{
+	return iHeapData->iSlackFreeSpace;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::Fragmentation()
+	{
+	return iHeapData->iFragmentation;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::HeaderSizeA()
+	{
+	return iHeapData->iHeaderSizeA;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::HeaderSizeF()
+	{
+	return iHeapData->iHeaderSizeF;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::AllocationOverhead()
+	{
+	return iHeapData->iAllocationOverhead;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::FreeOverhead()
+	{
+	return iHeapData->iFreeOverhead;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::TotalOverhead()
+	{
+	return iHeapData->iTotalOverhead;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::Overhead()
+	{
+	return iHeapData->iOverhead;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::MinLength()
+	{
+	return iHeapData->iMinLength;
+	}
+
+EXPORT_C TInt CMemSpyApiHeap::MaxLength()
+	{
+	return iHeapData->iMaxLength;
+	}
+
+EXPORT_C TBool CMemSpyApiHeap::DebugAllocatorLibrary()
+	{
+	return iHeapData->iDebugAllocatorLibrary;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/src/memspyapikernelobject.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,72 @@
+/*
+* 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:
+*
+*/
+
+#include <memspy/api/memspyapikernelobject.h>
+#include <memspy/engine/memspykernelobjectdata.h>
+//#include <memspy/engine/memspyengineobjectprocess.h>
+//#include <memspy/engine/memspyengineobjectcontainer.h>
+
+
+EXPORT_C CMemSpyApiKernelObject::~CMemSpyApiKernelObject()
+	{
+	delete iKernelObjectData;
+	}
+
+
+CMemSpyApiKernelObject::CMemSpyApiKernelObject() : iKernelObjectData(0)
+	{
+	}
+
+CMemSpyApiKernelObject* CMemSpyApiKernelObject::NewL(const TMemSpyKernelObjectData& aData)
+	{
+	CMemSpyApiKernelObject* self = CMemSpyApiKernelObject::NewLC(aData);
+	CleanupStack::Pop(self);
+	return (self);
+	}
+
+CMemSpyApiKernelObject* CMemSpyApiKernelObject::NewLC(const TMemSpyKernelObjectData& aData)
+	{
+	CMemSpyApiKernelObject* self = new (ELeave) CMemSpyApiKernelObject;
+	CleanupStack::PushL(self);
+	self->ConstructL(aData);
+	return (self);
+	}
+
+void CMemSpyApiKernelObject::ConstructL(const TMemSpyKernelObjectData& aData)
+	{
+	iKernelObjectData = new (ELeave) TMemSpyKernelObjectData(aData);
+	}
+
+EXPORT_C TMemSpyDriverContainerType CMemSpyApiKernelObject::Type() const
+	{
+	return iKernelObjectData->iType;
+	}
+
+EXPORT_C const TDesC& CMemSpyApiKernelObject::Name() const
+	{
+	return iKernelObjectData->iName;
+	}
+					
+EXPORT_C TInt CMemSpyApiKernelObject::Count() const
+	{
+	return iKernelObjectData->iCount;
+	}
+	
+EXPORT_C TInt64 CMemSpyApiKernelObject::Size() const
+	{
+	return iKernelObjectData->iSize;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/src/memspyapikernelobjectitem.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,309 @@
+/*
+* 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:
+*
+*/
+
+#include <memspy/api/memspyapikernelobjectitem.h>
+#include <memspy/driver/memspydriverobjectsshared.h>
+
+EXPORT_C CMemSpyApiKernelObjectItem::~CMemSpyApiKernelObjectItem()
+	{
+	delete iItem;
+	}
+
+
+CMemSpyApiKernelObjectItem::CMemSpyApiKernelObjectItem() : iItem(0)
+	{
+	}
+
+CMemSpyApiKernelObjectItem* CMemSpyApiKernelObjectItem::NewL(const TMemSpyDriverHandleInfoGeneric& aData)
+	{
+	CMemSpyApiKernelObjectItem* self = CMemSpyApiKernelObjectItem::NewLC(aData);
+	CleanupStack::Pop(self);
+	return (self);
+	}
+
+CMemSpyApiKernelObjectItem* CMemSpyApiKernelObjectItem::NewLC(const TMemSpyDriverHandleInfoGeneric& aData)
+	{
+	CMemSpyApiKernelObjectItem* self = new (ELeave) CMemSpyApiKernelObjectItem;
+	CleanupStack::PushL(self);
+	self->ConstructL(aData);
+	return (self);
+	}
+
+void CMemSpyApiKernelObjectItem::ConstructL(const TMemSpyDriverHandleInfoGeneric& aData)
+	{
+	iItem = new (ELeave) TMemSpyDriverHandleInfoGeneric(aData);
+	}
+
+EXPORT_C const TDesC8& CMemSpyApiKernelObjectItem::Name() const
+	{
+	/*
+	TBuf<KMaxName> ret;	
+	ret.Copy( iItem->iName );
+	return ret;
+	*/
+	return iItem->iName;
+	}
+
+EXPORT_C TAny* CMemSpyApiKernelObjectItem::Handle() const
+	{	
+	return iItem->iHandle;
+	}
+
+EXPORT_C TMemSpyDriverContainerType CMemSpyApiKernelObjectItem::Type() const
+	{
+	return iItem->iType;
+	}
+
+// For Process, thread, chunk (owning process id), server (owning thread id)
+EXPORT_C TInt CMemSpyApiKernelObjectItem::Id() const
+	{
+	return iItem->iId;
+	}
+
+// For Chunk, Library
+EXPORT_C TUint32 CMemSpyApiKernelObjectItem::Size() const
+	{
+	return iItem->iSize;
+	}
+
+// For Semaphore, Mutex, Server
+EXPORT_C TInt CMemSpyApiKernelObjectItem::Count() const
+	{
+	return iItem->iCount;
+	}
+
+// For Mutex
+EXPORT_C TInt CMemSpyApiKernelObjectItem::WaitCount() const
+	{
+	return iItem->iWaitCount;
+	}
+
+// For Server, Session
+EXPORT_C TIpcSessionType CMemSpyApiKernelObjectItem::SessionType() const
+	{
+	return iItem->iSessionType;
+	}
+
+// For Timer
+EXPORT_C TMemSpyDriverTimerType CMemSpyApiKernelObjectItem::TimerType() const
+	{
+	return iItem->iTimerType;
+	}
+
+EXPORT_C TMemSpyDriverTimerState CMemSpyApiKernelObjectItem::TimerState() const
+	{
+	return iItem->iTimerState;
+	}
+
+// For Logical channel
+EXPORT_C TInt CMemSpyApiKernelObjectItem::OpenChannels()
+	{
+	return iItem->iOpenChannels;
+	}
+
+// For most of the object types
+EXPORT_C const TDesC8& CMemSpyApiKernelObjectItem::NameDetail() const
+	{
+	/*
+	TBuf<KMaxName> ret;
+	ret.Copy( iItem->iNameDetail );
+	return ret;
+	*/
+	return iItem->iNameDetail;
+	}
+
+EXPORT_C TInt CMemSpyApiKernelObjectItem::AccessCount() const
+	{
+	return iItem->iAccessCount;
+	}
+
+EXPORT_C TInt CMemSpyApiKernelObjectItem::UniqueID() const
+	{
+	return iItem->iUniqueID;
+	}
+
+EXPORT_C TUint CMemSpyApiKernelObjectItem::Protection() const
+	{
+	return iItem->iProtection;
+	}
+		
+EXPORT_C TUint8* CMemSpyApiKernelObjectItem::AddressOfKernelOwner()
+	{
+	return iItem->iAddressOfKernelOwner;
+	}
+
+EXPORT_C TInt CMemSpyApiKernelObjectItem::Priority() const
+	{
+	return iItem->iPriority;
+	}
+
+EXPORT_C TUint8* CMemSpyApiKernelObjectItem::AddressOfOwningProcess()
+	{
+	return iItem->iAddressOfOwningProcess;
+	}
+
+EXPORT_C TUint CMemSpyApiKernelObjectItem::CreatorId() const
+	{
+	return iItem->iCreatorId;
+	}
+
+EXPORT_C TUint CMemSpyApiKernelObjectItem::SecurityZone() const
+	{
+	return iItem->iSecurityZone;
+	}
+
+EXPORT_C TInt CMemSpyApiKernelObjectItem::Attributes() const
+	{
+	return iItem->iAttributes;
+	}
+
+EXPORT_C TUint8* CMemSpyApiKernelObjectItem::AddressOfDataBssStackChunk()
+	{
+	return iItem->iAddressOfDataBssStackChunk;
+	}
+
+// For Server, Session
+EXPORT_C TUint8* CMemSpyApiKernelObjectItem::AddressOfOwningThread()
+	{
+	return iItem->iAddressOfOwningThread;
+	}
+
+EXPORT_C TUint8* CMemSpyApiKernelObjectItem::AddressOfServer()
+	{
+	return iItem->iAddressOfServer;
+	}
+
+EXPORT_C TUint16 CMemSpyApiKernelObjectItem::TotalAccessCount() const
+	{
+	return iItem->iTotalAccessCount;
+	}
+
+EXPORT_C TUint8 CMemSpyApiKernelObjectItem::SvrSessionType() const
+	{
+	return iItem->iSvrSessionType;
+	}
+
+EXPORT_C TInt CMemSpyApiKernelObjectItem::MsgCount() const
+	{
+	return iItem->iMsgCount;
+	}
+
+EXPORT_C TInt CMemSpyApiKernelObjectItem::MsgLimit() const
+	{
+	return iItem->iMsgLimit;
+	}
+
+// For chunk
+EXPORT_C TInt CMemSpyApiKernelObjectItem::MaxSize() const
+	{
+	return iItem->iMaxSize;
+	}
+
+EXPORT_C TInt CMemSpyApiKernelObjectItem::Bottom() const
+	{
+	return iItem->iBottom;
+	}
+
+EXPORT_C TInt CMemSpyApiKernelObjectItem::Top() const
+	{
+	return iItem->iTop;
+	}
+
+EXPORT_C TInt CMemSpyApiKernelObjectItem::StartPos() const
+	{
+	return iItem->iStartPos;
+	}
+
+EXPORT_C TUint CMemSpyApiKernelObjectItem::ControllingOwner() const
+	{
+	return iItem->iControllingOwner;
+	}
+
+EXPORT_C TUint CMemSpyApiKernelObjectItem::Restrictions() const
+	{
+	return iItem->iRestrictions;
+	}
+
+EXPORT_C TUint CMemSpyApiKernelObjectItem::MapAttr() const
+	{
+	return iItem->iMapAttr;
+	}
+
+EXPORT_C TUint CMemSpyApiKernelObjectItem::ChunkType() const
+	{
+	return iItem->iChunkType;
+	}
+
+EXPORT_C const TDesC8& CMemSpyApiKernelObjectItem::NameOfOwner() const
+	{
+	/*
+	TBuf<KMaxName> ret;
+	ret.Copy( iItem->iNameOfOwner );
+	return ret;
+	*/
+	return iItem->iNameOfOwner;
+	}
+
+// For library
+EXPORT_C TInt CMemSpyApiKernelObjectItem::MapCount() const
+	{
+	return iItem->iMapCount;
+	}
+
+EXPORT_C TUint8 CMemSpyApiKernelObjectItem::State() const
+	{
+	return iItem->iState;
+	}
+
+EXPORT_C TUint8* CMemSpyApiKernelObjectItem::AddressOfCodeSeg()
+	{
+	return iItem->iAddressOfCodeSeg;
+	}
+
+// Semaphore, mutex, condvar
+EXPORT_C TUint8 CMemSpyApiKernelObjectItem::Resetting() const
+	{
+	return iItem->iResetting;
+	}
+
+EXPORT_C TUint8 CMemSpyApiKernelObjectItem::Order() const
+	{
+	return iItem->iOrder;
+	}
+
+// For Logical/Physical device
+EXPORT_C TVersion CMemSpyApiKernelObjectItem::Version() const
+	{
+	return iItem->iVersion;
+	}
+
+EXPORT_C TUint CMemSpyApiKernelObjectItem::ParseMask() const
+	{
+	return iItem->iParseMask;	
+	}
+
+EXPORT_C TUint CMemSpyApiKernelObjectItem::UnitsMask() const
+	{
+	return iItem->iUnitsMask;
+	}
+
+// For change notifier
+EXPORT_C TUint CMemSpyApiKernelObjectItem::Changes() const
+	{
+	return iItem->iChanges;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/src/memspyapimemorytrackingcycle.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,78 @@
+/*
+* 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:
+* 
+*/
+
+#include <memspy/api/memspyapimemorytrackingcycle.h>
+#include <memspy/engine/memspymemorytrackingcycledata.h>
+
+EXPORT_C TInt CMemSpyApiMemoryTrackingCycle::CycleNumber() const
+	{
+	return iData->iCycleNumber;	
+	}
+
+EXPORT_C const TTime& CMemSpyApiMemoryTrackingCycle::Time() const
+	{
+	return iData->iTime;	
+	}
+
+EXPORT_C const TDesC& CMemSpyApiMemoryTrackingCycle::Caption() const
+	{
+	return iData->iCaption;	
+	}
+
+EXPORT_C const TInt64& CMemSpyApiMemoryTrackingCycle::FreeMemory() const
+	{
+	return iData->iFreeMemory;
+	}
+
+EXPORT_C TInt64 CMemSpyApiMemoryTrackingCycle::MemoryDelta() const
+	{
+	return iData->iMemoryDelta;
+	}
+
+EXPORT_C TInt64 CMemSpyApiMemoryTrackingCycle::PreviousCycleDiff() const
+	{
+	return iData->iPreviousCycleDiff;
+	}
+
+EXPORT_C CMemSpyApiMemoryTrackingCycle::~CMemSpyApiMemoryTrackingCycle()
+	{
+	delete iData;
+	}
+
+CMemSpyApiMemoryTrackingCycle* CMemSpyApiMemoryTrackingCycle::NewL(const TMemSpyMemoryTrackingCycleData& aData)
+	{
+	CMemSpyApiMemoryTrackingCycle* self = CMemSpyApiMemoryTrackingCycle::NewLC(aData);
+	CleanupStack::Pop(self);
+	return (self);
+	}
+
+CMemSpyApiMemoryTrackingCycle* CMemSpyApiMemoryTrackingCycle::NewLC(const TMemSpyMemoryTrackingCycleData& aData)
+	{
+	CMemSpyApiMemoryTrackingCycle* self = new (ELeave) CMemSpyApiMemoryTrackingCycle;
+	CleanupStack::PushL(self);
+	self->ConstructL(aData);
+	return self;
+	}
+
+CMemSpyApiMemoryTrackingCycle::CMemSpyApiMemoryTrackingCycle()
+	{
+	}
+
+void CMemSpyApiMemoryTrackingCycle::ConstructL(const TMemSpyMemoryTrackingCycleData& aData)
+	{
+	iData = new (ELeave) TMemSpyMemoryTrackingCycleData(aData);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/src/memspyapiprocess.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,103 @@
+/*
+* 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:
+*
+*/
+
+#include <memspy/api/memspyapiprocess.h>
+#include <memspy/engine/memspyengine.h>
+#include <memspy/engine/memspyprocessdata.h>
+#include <memspy/engine/memspyengineobjectprocess.h>
+#include <memspy/engine/memspyengineobjectcontainer.h>
+
+
+EXPORT_C CMemSpyApiProcess::~CMemSpyApiProcess()
+	{
+	delete iProcessData;
+	}
+
+EXPORT_C TProcessId CMemSpyApiProcess::Id() const
+	{
+	return iProcessData->iId;
+	}
+
+EXPORT_C const TDesC& CMemSpyApiProcess::Name() const
+	{
+	return iProcessData->iName;
+	}
+
+EXPORT_C TExitCategoryName CMemSpyApiProcess::ExitCategory() const
+	{
+	return iProcessData->iExitCategory;
+	}
+	
+EXPORT_C TInt CMemSpyApiProcess::ExitReason() const
+	{
+	return iProcessData->iExitReason;
+	}
+	
+EXPORT_C TExitType CMemSpyApiProcess::ExitType() const
+	{
+	return iProcessData->iExitType;
+	}
+	
+EXPORT_C TInt CMemSpyApiProcess::ThreadCount() const
+	{
+	return iProcessData->iThreadCount;
+	}
+
+EXPORT_C TUint32 CMemSpyApiProcess::SID() const
+	{
+	return iProcessData->iSID;
+	}
+
+EXPORT_C TUint32 CMemSpyApiProcess::VID() const
+	{
+	return iProcessData->iSID;
+	}
+
+EXPORT_C TProcessPriority CMemSpyApiProcess::Priority() const
+	{
+	return iProcessData->iPriority;
+	}
+
+EXPORT_C TBool CMemSpyApiProcess::IsDead() const
+    {
+    return iProcessData->iIsDead;
+    }
+
+CMemSpyApiProcess::CMemSpyApiProcess() : iProcessData(0)
+	{
+	}
+
+void CMemSpyApiProcess::ConstructL(const TMemSpyProcessData& aData)
+	{
+	iProcessData = new (ELeave) TMemSpyProcessData(aData);
+	}
+
+CMemSpyApiProcess* CMemSpyApiProcess::NewL(const TMemSpyProcessData& aData)
+	{
+	CMemSpyApiProcess* self = CMemSpyApiProcess::NewLC(aData);
+	CleanupStack::Pop(self);
+	return (self);
+	}
+
+CMemSpyApiProcess* CMemSpyApiProcess::NewLC(const TMemSpyProcessData& aData)
+	{
+	CMemSpyApiProcess* self = new (ELeave) CMemSpyApiProcess;
+	CleanupStack::PushL(self);
+	self->ConstructL(aData);
+	return (self);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/src/memspyapithread.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,125 @@
+/*
+* 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:
+*
+*/
+
+#include <memspy/api/memspyapithread.h>
+#include <memspy/engine/memspythreaddata.h>
+
+
+EXPORT_C CMemSpyApiThread::~CMemSpyApiThread()
+	{
+	delete iThreadData;
+	}
+
+EXPORT_C TThreadId CMemSpyApiThread::Id() const
+	{
+	return iThreadData->iId;
+	}
+
+EXPORT_C TProcessId CMemSpyApiThread::ProcessId() const
+	{
+	return iThreadData->iPid;
+	}
+
+EXPORT_C const TDesC& CMemSpyApiThread::Name() const
+	{
+	return iThreadData->iName;
+	}
+
+EXPORT_C TInt CMemSpyApiThread::SID() const
+	{
+	return iThreadData->iSID;
+	}
+
+
+EXPORT_C TInt CMemSpyApiThread::VID() const
+	{
+	return iThreadData->iVID;
+	}
+
+EXPORT_C TThreadPriority CMemSpyApiThread::ThreadPriority() const
+	{
+	return iThreadData->iThreadPriority;
+	}
+
+EXPORT_C TProcessPriority CMemSpyApiThread::ProcessPriority() const
+	{
+	return iThreadData->iProcessPriority;
+	}
+
+EXPORT_C TInt CMemSpyApiThread::RequestCount() const
+	{
+	return iThreadData->iRequestCount;
+	}
+
+EXPORT_C TInt CMemSpyApiThread::ThreadHandles() const
+	{
+	return iThreadData->iThreadHandles;
+	}
+
+EXPORT_C TInt CMemSpyApiThread::ProcessHandles() const
+	{
+	return iThreadData->iProcessHandles;
+	}
+
+EXPORT_C TInt CMemSpyApiThread::ThreadNumberUsing() const
+	{
+	return iThreadData->iThreadNumberUsing;
+	}
+
+EXPORT_C TInt CMemSpyApiThread::ProcessNumberUsing() const
+	{
+	return iThreadData->iProcessNumberUsing;
+	}
+
+EXPORT_C TInt CMemSpyApiThread::Attributes() const
+	{
+	return iThreadData->iAttributes;
+	}
+
+EXPORT_C TInt CMemSpyApiThread::CpuUse() const
+	{
+	return iThreadData->iCpuUse;
+	}
+
+EXPORT_C TExitType CMemSpyApiThread::ExitType() const
+	{
+	return iThreadData->iExitType;
+	}
+
+CMemSpyApiThread::CMemSpyApiThread() : iThreadData(0)
+	{
+	}
+
+void CMemSpyApiThread::ConstructL(const TMemSpyThreadData& aData)
+	{
+	iThreadData = new (ELeave) TMemSpyThreadData(aData);
+	}
+
+CMemSpyApiThread* CMemSpyApiThread::NewL(const TMemSpyThreadData& aData)
+	{
+	CMemSpyApiThread* self = CMemSpyApiThread::NewLC(aData);
+	CleanupStack::Pop(self);
+	return (self);
+	}
+
+CMemSpyApiThread* CMemSpyApiThread::NewLC(const TMemSpyThreadData& aData)
+	{
+	CMemSpyApiThread* self = new (ELeave) CMemSpyApiThread;
+	CleanupStack::PushL(self);
+	self->ConstructL(aData);
+	return (self);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/src/memspyapithreadinfoitem.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,60 @@
+/*
+* 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:
+*
+*/
+
+#include <memspy/api/memspyapithreadinfoitem.h>
+#include <memspy/engine/memspyengine.h>
+#include <memspy/engine/memspythreadinfoitemdata.h>
+
+EXPORT_C CMemSpyApiThreadInfoItem::~CMemSpyApiThreadInfoItem()
+	{
+	delete iInfoItem;
+	}
+
+EXPORT_C const TDesC& CMemSpyApiThreadInfoItem::Caption() const
+	{
+	return iInfoItem->iCaption;
+	}
+
+EXPORT_C const TDesC& CMemSpyApiThreadInfoItem::Value() const
+	{
+	return iInfoItem->iValue;
+	}
+
+CMemSpyApiThreadInfoItem::CMemSpyApiThreadInfoItem() : iInfoItem(0)
+	{
+	}
+
+void CMemSpyApiThreadInfoItem::ConstructL(const TMemSpyThreadInfoItemData& aData)
+	{
+	iInfoItem = new (ELeave) TMemSpyThreadInfoItemData(aData);
+	}
+
+CMemSpyApiThreadInfoItem* CMemSpyApiThreadInfoItem::NewL(const TMemSpyThreadInfoItemData& aData)
+	{
+	CMemSpyApiThreadInfoItem* self = CMemSpyApiThreadInfoItem::NewLC(aData);
+	CleanupStack::Pop(self);
+	return (self);
+	}
+
+CMemSpyApiThreadInfoItem* CMemSpyApiThreadInfoItem::NewLC(const TMemSpyThreadInfoItemData& aData)
+	{
+	CMemSpyApiThreadInfoItem* self = new (ELeave) CMemSpyApiThreadInfoItem;
+	CleanupStack::PushL(self);
+	self->ConstructL(aData);
+	return (self);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/src/memspysession.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,706 @@
+/*
+* 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:
+*
+*/
+
+
+#include "memspysession.h"
+
+#include <memspyengineclientinterface.h>
+// API
+#include <memspy/engine/memspyprocessdata.h>
+#include <memspy/engine/memspythreaddata.h> 
+#include <memspy/engine/memspykernelobjectdata.h>
+#include <memspy/engine/memspyheapdata.h>
+#include <memspy/engine/memspymemorytrackingcycledata.h>
+//KernelObjects
+#include <memspy/driver/memspydriverenumerationsshared.h>
+// IMPLEMENTATION
+
+EXPORT_C RMemSpySession::RMemSpySession()
+    {
+    }
+
+
+EXPORT_C TInt RMemSpySession::Connect()
+    {
+	TInt error(KErrNone);
+	
+	for (TInt i=0; i<2; i++) // Two retries max
+		{
+		TInt error = CreateSession(KMemSpyServerName, TVersion(KMemSpyVersion, 0, 0));
+		
+		if (error != KErrNotFound && error != KErrServerTerminated)
+			return error;
+		
+		error = StartServer();
+		
+		if (error != KErrNone && error != KErrAlreadyExists)
+			return error;
+		}
+	
+	return error;	
+    }
+
+TInt RMemSpySession::StartServer()
+	{
+	RProcess server;
+	_LIT(KCommand, "start");
+	const TUid KServerUid3 = {0xE5883BC2};
+	TInt error = server.Create(KMemSpyServerName, KCommand);//, KServerUid3);
+	
+	if (error != KErrNone)
+		return error;
+	
+	TRequestStatus startStatus, stopStatus;
+	server.Logon(stopStatus);
+	if (stopStatus != KRequestPending)
+		{
+		User::WaitForRequest(stopStatus);
+		server.Kill(0);
+		server.Close();
+		return stopStatus.Int();
+		}
+	
+	server.Rendezvous(startStatus);
+	server.Resume();
+	User::WaitForRequest(startStatus, stopStatus);
+	if (startStatus == KRequestPending)
+		{
+		// not started yet, i.e. stopStatus was signaled
+		server.Close();
+		return stopStatus.Int();
+		}
+	
+	// Rendezvous was called - the server is ready
+	
+	// We first need to cancel Logon
+	server.LogonCancel(stopStatus);
+	// We don't need this anymore
+	server.Close();
+	// Wait for LogonCancel to complete
+	User::WaitForRequest(stopStatus);
+
+	// Everything went OK
+	return KErrNone;
+	}
+
+EXPORT_C void RMemSpySession::GetProcessesL(RArray<CMemSpyApiProcess*> &aProcesses, TSortType aSortType)
+	{
+	TPckgBuf<TInt> count;
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetProcessCount, TIpcArgs(&count)));
+	
+	TInt requestedCount = count();
+	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyProcessData));
+	TPtr8 bufferPtr(buffer->Des());
+	
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetProcesses, TIpcArgs(&count, &bufferPtr)));
+	aProcesses.Reset();
+	
+	TInt receivedCount = Min(count(), requestedCount);
+	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyProcessData))
+		{
+		TPckgBuf<TMemSpyProcessData> data;
+		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyProcessData));
+		aProcesses.AppendL(CMemSpyApiProcess::NewLC(data()));
+		}
+	CleanupStack::Pop(aProcesses.Count());
+	CleanupStack::PopAndDestroy(buffer);
+	}
+
+EXPORT_C TProcessId RMemSpySession::GetProcessIdByNameL(const TDesC& aProcessName)
+	{
+	TPckgBuf<TProcessId> procId;
+	User::LeaveIfError(SendReceive(EMemSpyClienServerOpGetProcessIdByName, 
+			TIpcArgs(&aProcessName, &procId)));
+	
+	return procId();
+	}
+
+EXPORT_C TInt RMemSpySession::ProcessSystemPermanentOrCritical( TProcessId aId, TBool aValue )
+	{
+	TPckgBuf<TProcessId> arg1( aId );
+	TPckgBuf<TBool> arg2( aValue );
+	TIpcArgs args( &arg1, &arg2 );
+		
+	TInt error = SendReceive( EMemSpyClientServerOpProcessSystemPermanentOrCritical, args );
+	
+	return error;
+	}
+
+EXPORT_C TInt RMemSpySession::EndProcess( TProcessId aId, TMemSpyEndType aType )
+	{
+	TPckgBuf<TProcessId> arg1( aId );
+	TPckgBuf<TMemSpyEndType> arg2( aType );
+	TIpcArgs args( &arg1, &arg2 );
+	
+	TInt error = SendReceive( EMemSpyClientServerOpEndProcess, args );
+	
+	return error;
+	}
+
+EXPORT_C TInt RMemSpySession::SwitchToProcess( TProcessId aId, TBool aBrought )
+	{
+	TPckgBuf<TProcessId> arg1( aId );
+	TPckgBuf<TBool> arg2( aBrought );
+	TIpcArgs args( &arg1, &arg2 );
+	
+	TInt error = SendReceive( EMemSpyClientServerOpSwitchToProcess, args );
+	
+	return error;	
+	}
+
+EXPORT_C void RMemSpySession::GetThreadsL(TProcessId aProcessId, RArray<CMemSpyApiThread*> &aThreads, TSortType aSortType)
+	{
+	TPckgBuf<TInt> count;
+	TPckgBuf<TProcessId> pid(aProcessId);
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetThreadCount, TIpcArgs(&count, &pid)));
+	
+	TInt requestedCount = count();
+	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyThreadData));
+	TPtr8 bufferPtr(buffer->Des());
+	
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetThreads, TIpcArgs(&count, &bufferPtr, &pid)));
+	aThreads.Reset();
+	
+	TInt receivedCount = Min(count(), requestedCount);
+	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyThreadData))
+		{
+		TPckgBuf<TMemSpyThreadData> data;
+		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyThreadData));
+		aThreads.AppendL(CMemSpyApiThread::NewLC(data()));
+		}
+	CleanupStack::Pop(aThreads.Count());
+	CleanupStack::PopAndDestroy(buffer);
+	}
+
+EXPORT_C void RMemSpySession::SetThreadPriorityL(TThreadId aId, TInt aPriority)
+	{
+	TPckgBuf<TThreadId> arg1( aId );
+	TPckgBuf<TInt> arg2( aPriority );
+	
+	User::LeaveIfError(SendReceive( EMemSpyClientServerOpSetThreadPriority, TIpcArgs(&arg1, &arg2)));
+	}
+
+EXPORT_C TInt RMemSpySession::ThreadSystemPermanentOrCritical( TThreadId aId, TBool aValue )
+	{
+	TPckgBuf<TThreadId> arg1( aId );
+	TPckgBuf<TBool> arg2( aValue );
+	TIpcArgs args( &arg1, &arg2 );
+	
+	TInt error = SendReceive( EMemSpyClientServerOpThreadSystemPermanentOrCritical, args );
+	
+	return error;
+	}
+
+EXPORT_C TInt RMemSpySession::EndThread( TThreadId aId, TMemSpyEndType aType )
+	{
+	TPckgBuf<TThreadId> arg1( aId );
+	TPckgBuf<TMemSpyEndType> arg2( aType );
+	TIpcArgs args( &arg1, &arg2 );
+	
+	TInt error = SendReceive( EMemSpyClientServerOpEndThread, args );
+	
+	return error;
+	}
+
+EXPORT_C TInt RMemSpySession::SwitchToThread( TThreadId aId, TBool aBrought )
+	{
+	TPckgBuf<TThreadId> arg1( aId );
+	TPckgBuf<TBool> arg2( aBrought );
+	TIpcArgs args( &arg1, &arg2 );
+	
+	TInt error = SendReceive( EMemSpyClientServerOpSwitchToThread, args );
+	
+	return error;	
+	}
+
+EXPORT_C TInt RMemSpySession::GetInfoItemType( TInt aIndex, TThreadId aId, TMemSpyThreadInfoItemType &aType )
+	{
+	TPckgBuf<TInt> arg1( aIndex );
+	TPckgBuf<TThreadId> arg2( aId );
+	TPckgBuf<TMemSpyThreadInfoItemType> arg3;
+	TIpcArgs args( &arg1, &arg2, &arg3 );
+		
+	TInt error = SendReceive( EMemSpyClientServerOpGetInfoItemType, args );
+	
+	aType = arg3();
+	
+	return error;
+	}
+
+EXPORT_C void RMemSpySession::GetThreadInfoItemsL( RArray<CMemSpyApiThreadInfoItem*> &aInfoItems, TThreadId aId, TMemSpyThreadInfoItemType aType )
+	{
+	TPckgBuf<TThreadId> id( aId );	
+	TPckgBuf<TMemSpyThreadInfoItemType> type( aType );
+	TPckgBuf<TInt> count;	
+	
+	TInt error = SendReceive( EMemSpyClientServerOpGetThreadInfoItemsCount, TIpcArgs( &id, &type, &count ) );
+	TInt itemCount = count();
+	
+	if( error == KErrNone )
+		{		
+		if( itemCount == 0 )
+			{
+			aInfoItems.Reset();
+			}
+		else
+			{
+			HBufC8* buffer = HBufC8::NewLC( itemCount * sizeof(TMemSpyThreadInfoItemData) );
+			TPtr8 bufferPtr(buffer->Des());
+			
+			TPckgBuf<TInt> requestedCount( itemCount );
+			
+			TIpcArgs args( &requestedCount, &id, &type, &bufferPtr );
+			TInt error = SendReceive( EMemSpyClientServerOpGetThreadInfoItems, args );
+			
+			aInfoItems.Reset();
+		
+			for(TInt i=0, offset = 0; i < itemCount; i++, offset+=sizeof(TMemSpyThreadInfoItemData))
+				{
+				TPckgBuf<TMemSpyThreadInfoItemData> data;
+				data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyThreadInfoItemData));
+				aInfoItems.AppendL(CMemSpyApiThreadInfoItem::NewLC(data()));
+				}
+			
+			CleanupStack::Pop(aInfoItems.Count());
+			CleanupStack::PopAndDestroy(buffer);
+			}
+		}
+	
+	User::LeaveIfError(error);
+	}
+
+EXPORT_C TInt RMemSpySession::GetThreadInfoItems( RArray<CMemSpyApiThreadInfoItem*> &aInfoItems, TThreadId aId, TMemSpyThreadInfoItemType aType )
+	{
+	TRAPD(error, GetThreadInfoItemsL(aInfoItems, aId, aType));
+	return error;
+	}
+
+//Kernel Objects specific operations
+EXPORT_C void RMemSpySession::GetKernelObjectsL( RArray<CMemSpyApiKernelObject*> &aKernelObjects )
+	{		
+	TPckgBuf<TInt> count;
+	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectCount, TIpcArgs(&count) ));
+	
+	TInt requestedCount = count();
+	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyKernelObjectData));
+	TPtr8 bufferPtr(buffer->Des());
+		
+	TIpcArgs args( &count, &bufferPtr );
+	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjects, args ));
+	
+	aKernelObjects.Reset();
+	
+	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyKernelObjectData))
+		{
+		TPckgBuf<TMemSpyKernelObjectData> data;
+		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyKernelObjectData));
+		aKernelObjects.AppendL(CMemSpyApiKernelObject::NewLC(data()));
+		}
+	
+	CleanupStack::Pop(aKernelObjects.Count());
+	CleanupStack::PopAndDestroy(buffer);
+	}
+
+EXPORT_C TInt RMemSpySession::GetKernelObjects( RArray<CMemSpyApiKernelObject*> &aKernelObjects )
+	{
+	TRAPD(error, GetKernelObjectsL(aKernelObjects));
+	return error;
+	}
+
+EXPORT_C void RMemSpySession::GetKernelObjectItemsL( RArray<CMemSpyApiKernelObjectItem*> &aKernelObjectItems, TMemSpyDriverContainerType aForContainer )
+	{
+	TPckgBuf<TInt> count;
+	TPckgBuf<TMemSpyDriverContainerType> type(aForContainer);
+	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectItemCount, TIpcArgs(&count, &type) ));
+
+	TInt requestedCount = count();
+	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyDriverHandleInfoGeneric));
+	TPtr8 bufferPtr(buffer->Des());
+	
+	TIpcArgs args( &count, &type, &bufferPtr );
+	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectItems, args ));
+	
+	aKernelObjectItems.Reset();
+	
+	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyDriverHandleInfoGeneric))
+		{
+		TPckgBuf<TMemSpyDriverHandleInfoGeneric> data;
+		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyDriverHandleInfoGeneric));
+		aKernelObjectItems.AppendL( CMemSpyApiKernelObjectItem::NewLC( data() ) );
+		}
+	CleanupStack::Pop(aKernelObjectItems.Count());
+	CleanupStack::PopAndDestroy(buffer);
+	}
+
+EXPORT_C TInt RMemSpySession::GetKernelObjectItems( RArray<CMemSpyApiKernelObjectItem*> &aKernelObjectItems, TMemSpyDriverContainerType aForContainer )
+	{
+	TRAPD(error, GetKernelObjectItemsL(aKernelObjectItems, aForContainer));
+	return error;
+	}
+
+EXPORT_C void RMemSpySession::GetMemoryTrackingCyclesL(RArray<CMemSpyApiMemoryTrackingCycle*>& aCycles)
+	{
+	TPckgBuf<TInt> count;
+	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetMemoryTrackingCycleCount, TIpcArgs(&count) ));
+	
+	TInt requestedCount = count();
+	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyMemoryTrackingCycleData));
+	TPtr8 bufferPtr(buffer->Des());
+		
+	TIpcArgs args( &count, &bufferPtr );
+	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetMemoryTrackingCycles, args ));
+	
+	aCycles.Reset();
+	
+	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyMemoryTrackingCycleData))
+		{
+		TPckgBuf<TMemSpyMemoryTrackingCycleData> data;
+		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyMemoryTrackingCycleData));
+		aCycles.AppendL(CMemSpyApiMemoryTrackingCycle::NewLC(data()));
+		}
+	
+	CleanupStack::Pop(aCycles.Count());
+	CleanupStack::PopAndDestroy(buffer);
+	}
+
+EXPORT_C void RMemSpySession::OutputAllContainerContents()
+	{
+	SendReceive( EMemSpyClientServerOpOutputAllContainerContents );
+	}
+
+
+//Heap specific operations
+
+EXPORT_C CMemSpyApiHeap* RMemSpySession::GetHeapL()
+	{
+	CMemSpyApiHeap* aHeap;
+	
+	HBufC8* buffer = HBufC8::NewLC( sizeof(TMemSpyHeapData) );
+	TPtr8 bufferPtr(buffer->Des());
+	TIpcArgs args( &bufferPtr );
+	
+	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetHeap, args ));
+	
+	TPckgBuf<TMemSpyHeapData> data;
+	data.Copy(bufferPtr.Ptr(), sizeof(TMemSpyHeapData));		
+	aHeap = CMemSpyApiHeap::NewL( data() );
+	
+	CleanupStack::PopAndDestroy(buffer);
+		
+	return aHeap;
+	}
+
+EXPORT_C CMemSpyApiHeap* RMemSpySession::GetHeap()
+	{
+	CMemSpyApiHeap *result = NULL;
+	TRAPD(error, result = GetHeapL());
+	return error == KErrNone ? result : NULL;
+	}
+
+EXPORT_C void RMemSpySession::DumpKernelHeap()
+	{
+	SendReceive( EMemSpyClientServerOpDumpKernelHeap );
+	}
+
+EXPORT_C void RMemSpySession::OutputKernelHeapDataL()
+	{		
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpHeapData | KMemSpyOpFlagsIncludesThreadId,
+			TIpcArgs(KMemSpyClientServerThreadIdKernel)));
+	
+	}
+
+EXPORT_C void RMemSpySession::OutputKernelHeapData(TRequestStatus& aStatus)
+	{
+	SendReceive(EMemSpyClientServerOpHeapData,
+		TIpcArgs(KMemSpyClientServerThreadIdKernel),
+		aStatus);
+	}
+
+EXPORT_C void RMemSpySession::OutputThreadHeapDataL( TThreadId aThreadId)
+	{			
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpHeapData | KMemSpyOpFlagsIncludesThreadId,
+			TIpcArgs(aThreadId)));
+	}
+
+EXPORT_C void RMemSpySession::OutputThreadHeapDataL(const TDesC& aThreadName)
+	{	
+	const TIpcArgs args( &aThreadName );
+	        
+	User::LeaveIfError( SendReceive( EMemSpyClientServerOpHeapData | KMemSpyOpFlagsIncludesThreadName, args ));	
+	}
+
+EXPORT_C void RMemSpySession::OutputThreadCellListL(TThreadId aThreadId)
+	{	
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpHeapCellListing | KMemSpyOpFlagsIncludesThreadId,
+			TIpcArgs(aThreadId)));
+	}
+
+EXPORT_C void RMemSpySession::OutputHeapInfoUserL(TThreadId aThreadId)
+	{
+	User::LeaveIfError(SendReceive( EMemSpyClientServerOpHeapInfo | KMemSpyOpFlagsIncludesThreadId,
+			TIpcArgs(aThreadId)));
+	}
+
+EXPORT_C void RMemSpySession::SwitchOutputSinkL( TMemSpySinkType aType )
+	{
+	TInt op;
+	if( aType == ESinkTypeFile )
+		op = EMemSpyClientServerOpSwitchOutputSinkFile;
+	else
+		op = EMemSpyClientServerOpSwitchOutputSinkTrace;
+			
+	User::LeaveIfError(SendReceive( op ));
+	}
+
+EXPORT_C void RMemSpySession::SwitchOutputToTraceL()
+	{
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSwitchOutputSinkTrace));
+	}
+    
+EXPORT_C void RMemSpySession::SwitchOutputToFileL(const TDesC& aRootFolder)
+	{
+	TIpcArgs args;
+	if (aRootFolder.Length())
+		{
+		args.Set(0, &aRootFolder);
+		}
+	
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSwitchOutputSinkFile, args));
+	}
+
+EXPORT_C void RMemSpySession::OutputStackInfoL(TThreadId aThreadId)
+	{
+	User::LeaveIfError(SendReceive( EMemSpyClientServerOpStackInfo | KMemSpyOpFlagsIncludesThreadId,
+			TIpcArgs(aThreadId)));
+	}
+
+EXPORT_C void RMemSpySession::OutputStackDataL(TThreadId aThreadId, TMemSpyDriverDomainType aType )
+	{
+	TInt op;
+	if( aType == EMemSpyDriverDomainUser )
+		op = EMemSpyClientServerOpStackDataUser;
+	else
+		op = EMemSpyClientServerOpStackDataKernel;
+	
+	User::LeaveIfError(SendReceive( op | KMemSpyOpFlagsIncludesThreadId,
+			TIpcArgs(aThreadId, aType)));
+		
+	}
+
+EXPORT_C void RMemSpySession::OutputThreadInfoHandlesL(TThreadId aThreadId)
+	{
+	TPckgBuf<TThreadId> id(aThreadId);
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpOutputInfoHandles, TIpcArgs( &id )));	
+	}
+
+EXPORT_C void RMemSpySession::OutputAOListL(TThreadId aId, TMemSpyThreadInfoItemType aType)
+	{
+	TPckgBuf<TThreadId> id(aId);
+	TPckgBuf<TMemSpyThreadInfoItemType> type(aType);
+	
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpOutputAOList, TIpcArgs( &id, &type )));
+	}
+
+EXPORT_C void RMemSpySession::OutputKernelObjectsL()
+	{
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpEnumerateKernelContainerAll));
+	}
+
+EXPORT_C void RMemSpySession::OutputCompactStackInfoL()
+	{
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpStackInfoCompact)); 
+	}
+
+EXPORT_C void RMemSpySession::OutputCompactHeapInfoL()
+	{
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpHeapInfoCompact)); 
+	}
+// Asynchronous operations
+EXPORT_C void RMemSpySession::OutputPhoneInfo(TRequestStatus& aStatus)
+	{	
+	SendReceive(EMemSpyClientServerOpSummaryInfo | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
+	}
+
+EXPORT_C void RMemSpySession::OutputDetailedPhoneInfo(TRequestStatus& aStatus)
+	{	
+	SendReceive(EMemSpyClientServerOpSummaryInfoDetailed | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
+	}
+
+EXPORT_C void RMemSpySession::OutputHeapInfo(TRequestStatus& aStatus)
+	{	
+	SendReceive(EMemSpyClientServerOpHeapInfo | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
+	}
+
+EXPORT_C void RMemSpySession::OutputCompactHeapInfo(TRequestStatus& aStatus)
+	{	
+	SendReceive(EMemSpyClientServerOpHeapInfoCompact | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
+	}
+
+EXPORT_C void RMemSpySession::OutputHeapCellListing(TRequestStatus& aStatus)
+	{	
+	SendReceive(EMemSpyClientServerOpHeapCellListing | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
+	}
+
+EXPORT_C void RMemSpySession::OutputHeapData(TRequestStatus& aStatus)
+	{	
+	SendReceive(EMemSpyClientServerOpHeapData | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
+	}
+
+// synchronous version of the operation - for CLI
+EXPORT_C void RMemSpySession::OutputHeapData()
+	{
+	SendReceive(EMemSpyClientServerOpHeapData);
+	}
+
+EXPORT_C void RMemSpySession::OutputStackInfo(TRequestStatus& aStatus)
+	{	
+	SendReceive(EMemSpyClientServerOpStackInfo | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
+	}
+
+EXPORT_C void RMemSpySession::OutputCompactStackInfo(TRequestStatus& aStatus)
+	{	
+	SendReceive(EMemSpyClientServerOpStackInfoCompact | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
+	}
+
+EXPORT_C void RMemSpySession::OutputUserStackData(TRequestStatus& aStatus)
+	{	
+	SendReceive(EMemSpyClientServerOpStackDataUser | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
+	}
+
+EXPORT_C void RMemSpySession::OutputKernelStackData(TRequestStatus& aStatus)
+	{	
+	SendReceive(EMemSpyClientServerOpStackDataKernel | KMemSpyOpFlagsAsyncOperation, TIpcArgs(), aStatus);
+	}
+
+// Synchronous operations
+EXPORT_C void RMemSpySession::OutputPhoneInfo()
+	{	
+	SendReceive( EMemSpyClientServerOpSummaryInfo , TIpcArgs() );
+	}
+
+EXPORT_C void RMemSpySession::SetSwmtConfig( TMemSpyEngineHelperSysMemTrackerConfig aConfig )
+	{
+	TPckgBuf<TMemSpyEngineHelperSysMemTrackerConfig> config(aConfig);
+	TIpcArgs args( &config );
+	
+	SendReceive( EMemSpyClientServerOpSetSwmtConfig, args) ;
+	}
+
+EXPORT_C void RMemSpySession::SetSwmtAutoStartProcessList( CArrayFixFlat<TUid>* aList )
+	{
+	TInt count = aList->Count();
+	TIpcArgs args( &aList, &count );
+	
+	SendReceive( EMemSpyClientServerOpSetSwmtAutoStartProcessList, args );
+	}
+
+EXPORT_C void RMemSpySession::SwmtResetTracking()
+	{
+	SendReceive( EMemSpyClientServerOpSystemWideMemoryTrackingReset );
+	}
+
+EXPORT_C void RMemSpySession::GetOutputSink( TMemSpySinkType aType )
+	{
+	TPckgBuf<TMemSpySinkType> type( aType );
+	TIpcArgs args( &type );
+	
+	SendReceive( EMemSpyClientServerOpGetOutputSink, args );
+	}
+
+EXPORT_C void RMemSpySession::NotifyDeviceWideOperationProgress(TMemSpyDeviceWideOperationProgress &aProgress, TRequestStatus &aStatus)
+	{
+	SendReceive(EMemSpyClientServerOpNotifyDeviceWideOperationProgress | KMemSpyOpFlagsAsyncOperation,
+			TIpcArgs(&aProgress.iProgress, &aProgress.iDescription), 
+			aStatus);
+	}
+
+EXPORT_C void RMemSpySession::CancelDeviceWideOperationL()
+	{
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpCancelDeviceWideOperation));
+	}
+
+// SWMT operations
+EXPORT_C void RMemSpySession::SetSwmtCategoriesL(TInt aCategories)
+	{
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingCategoriesSet,
+			TIpcArgs(aCategories)));
+	}
+
+EXPORT_C void RMemSpySession::SetSwmtHeapDumpsEnabledL(TBool aEnabled)
+	{
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingHeapDumpSet,
+			TIpcArgs(aEnabled)));
+	}
+
+EXPORT_C TBool RMemSpySession::IsSwmtRunningL()
+	{
+	TPckgBuf<TBool> ret;
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpIsSwmtRunning, TIpcArgs(&ret)));
+	
+	return ret();
+	}
+
+EXPORT_C void RMemSpySession::StartSwmtTimerL(TInt aPeriod)
+	{
+	SetSwmtTimerIntervalL(aPeriod);
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerStart));
+	}
+
+EXPORT_C void RMemSpySession::StartSwmtTimerL()
+	{
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerStart));
+	}
+
+EXPORT_C void RMemSpySession::SetSwmtTimerIntervalL(TInt aPeriod)
+	{
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerPeriodSet,
+			TIpcArgs(aPeriod)));
+	}
+
+EXPORT_C void RMemSpySession::StopSwmtTimerL()
+	{
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingTimerStop));
+	}
+
+
+EXPORT_C void RMemSpySession::ForceSwmtUpdateL()
+	{
+	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingForceUpdate));
+	}
+
+EXPORT_C void RMemSpySession::ForceSwmtUpdate(TRequestStatus& aStatus)
+	{
+	SendReceive(EMemSpyClientServerOpSystemWideMemoryTrackingForceUpdate, 
+			TIpcArgs(),
+			aStatus);
+	}
+
+EXPORT_C void RMemSpySession::SetSwmtFilter( const TDesC& aFilter )
+	{	
+	TIpcArgs args( &aFilter );
+	User::LeaveIfError( SendReceive( EMemSpyClientServerOpSystemWideMemoryTrackingThreadNameFilterSet, args ) );
+	}
+
+EXPORT_C TInt TMemSpyDeviceWideOperationProgress::Progress() const 
+	{
+	return iProgress();
+	}
+
+EXPORT_C const TDesC& TMemSpyDeviceWideOperationProgress::Description() const
+	{
+	return iDescription;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyServer/Source/MemSpyServerMain.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+* MemSpyServer Main class
+*/
+
+// System includes
+#include <e32std.h>
+#include <e32base.h>
+#include <f32file.h>
+
+// Engine includes
+#include <memspy/engine/memspyengine.h>
+
+// User includes
+//#include "MemSpyServer.h"
+
+static void RunServerL()
+    {
+    // Scheduler
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL( scheduler );    
+    CActiveScheduler::Install( scheduler );    
+    
+    // F32
+    RFs fsSession;
+    User::LeaveIfError(fsSession.Connect());
+    CleanupClosePushL(fsSession);
+    
+    // MemSpyEngine initialization
+    CMemSpyEngine* engine = CMemSpyEngine::NewL(fsSession);
+    CleanupStack::PushL(engine);
+    
+    // Play nicely with external processes
+    RProcess::Rendezvous( KErrNone );       
+
+    // Start wait loop.
+    CActiveScheduler::Start();
+    
+    // Tidy up
+    CleanupStack::PopAndDestroy( 3, scheduler );
+    }
+
+TInt E32Main()
+    {
+    __UHEAP_MARK;
+
+    CTrapCleanup* cleanupTrap = CTrapCleanup::New();
+    
+	TInt r = KErrNoMemory;
+	if ( cleanupTrap )
+		{
+		TRAPD(err, RunServerL());		
+		if  ( err != KErrNone )
+		        {
+		        RDebug::Print(_L("[MemSpyCmdLine] E32Main() - MemSpyServer - error: %d"), err);
+		        }
+		delete cleanupTrap;
+		}  
+
+    __UHEAP_MARKEND;
+
+    return r;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyServer/group/MemSpyServer.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,58 @@
+/*
+* 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:
+*
+*/
+
+#include <bldvariant.hrh>
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGETTYPE EXE
+TARGET MemSpyServer.exe
+UID 0 0x2002EA8D
+SECUREID     0xE5883BC2
+VENDORID	 0x101FB657 // Nokia
+
+EPOCSTACKSIZE 0x4000
+EPOCHEAPSIZE 0x100000 0x4000000
+
+
+SOURCEPATH ../Source
+SOURCE		MemSpyServerMain.cpp 
+
+USERINCLUDE ../Include
+
+CAPABILITY ReadUserData WriteUserData ReadDeviceData WriteDeviceData
+
+OS_LAYER_SYSTEMINCLUDE
+
+APP_LAYER_SYSTEMINCLUDE
+
+LIBRARY         MemSpyDriverClient.lib
+LIBRARY         MemSpyEngine.lib
+
+LIBRARY 		euser.lib
+LIBRARY			ecom.lib
+LIBRARY			efsrv.lib
+LIBRARY			estor.lib
+LIBRARY			bafl.lib
+LIBRARY			ws32.lib
+LIBRARY			cone.lib
+LIBRARY			eikcore.lib
+LIBRARY			fbscli.lib 
+LIBRARY 		PlatformEnv.lib
+LIBRARY 		flogger.lib
+LIBRARY			apgrfx.lib
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyServer/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,22 @@
+/*
+* 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:
+*
+*/
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+MemSpyServer.mmp
--- a/memspy/group/ReleaseNotes_MemSpy.txt	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/group/ReleaseNotes_MemSpy.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -1,6 +1,6 @@
 ===============================================================================
 
-RELEASE NOTES - MEMSPY v1.2.1
+RELEASE NOTES - MEMSPY v2.1.0
 RELEASED 15th June 2010 
 
 SUPPORTS S60 5.0+
@@ -28,10 +28,15 @@
 
 ===============================================================================
 
-What's New in v1.2.1
+What's New in v2.1.0
 ====================
-- Fix: Stack dumps fixed.
-
+- Feature: Folder where log files are saved can now be set in settings.
+- Feature: Introduced new Orbit based user interface.
+- Change: Servers, Ecom, Window groups, System info and Automatic Capture were
+  removed.
+- Change: Console interface was removed.
+- Change: Command line interface commands were changed to be more user 
+  friendly.
 
 ===============================================================================
 
@@ -93,8 +98,9 @@
 
 Version History:
 ================
-Version 1.2.0 - 27th October 2009
-------------------------------
+
+Version 1.2.0 - 27th October 2009 
+---------------------------------
 - Feature: Tracking modes introduced for simplify System Wide Memory Tracking
   settings.
 - Feature: System Wide Memory Tracking categories can now be selected.
--- a/memspy/group/bld.inf	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -29,10 +29,12 @@
 // Commandline includes
 #include "../CommandLine/group/bld.inf"
 
-// Console UI
-#include "../Console/group/bld.inf"
+// MemSpyServer
+#include "../MemSpyServer/group/bld.inf"
 
+// MemSpyClient
+#include "../MemSpyClient/group/bld.inf"
 
 PRJ_EXPORTS
 ../rom/memspy.iby      CORE_IBY_EXPORT_PATH(tools,memspy.iby)
-../rom/memspy_rom.iby  CORE_IBY_EXPORT_PATH(tools/rom,memspy_rom.iby)
+../rom/memspy_rom.iby  CORE_IBY_EXPORT_PATH(tools/rom,memspy_rom.iby)
\ No newline at end of file
--- a/memspy/memspy_plat/memspy_api/include/MemSpyEngineClientInterface.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/MemSpyEngineClientInterface.h	Tue Aug 31 16:45:49 2010 +0300
@@ -45,11 +45,12 @@
 const TInt KMemSpyOpFlagsInclusionMask          = 0xFFFF0000;
 const TInt KMemSpyOpFlagsIncludesThreadId       = 0x00010000;
 const TInt KMemSpyOpFlagsIncludesThreadName     = 0x00020000;
-
+const TInt KMemSpyOpFlagsAsyncOperation         = 0x00040000;
 // Literal constants
 _LIT( KMemSpyServerName, "MemSpyServer" );
+_LIT( KMemSpyProcessName0, "MemSpyServer.exe" );
 _LIT( KMemSpyProcessName1, "MemSpyUI.exe" );
-_LIT( KMemSpyProcessName2, "MemSpyConsole.exe" );
+//_LIT( KMemSpyProcessName2, "MemSpyConsole.exe" );
 
 //
 // Supported MemSpy operation types
@@ -258,12 +259,104 @@
     EMemSpyClientServerOpSystemWideMemoryTrackingHeapDumpSet,
     
     /**
-     * [INTERNAL REQUEST]
-     */
+	 * [INTERNAL REQUEST]
+	 */
+	EMemSpyClientServerOpMarkerUiFirst,
+	
+	EMemSpyClientServerOpGetProcessCount = EMemSpyClientServerOpMarkerUiFirst,
+	
+	EMemSpyClientServerOpGetProcesses,
+	
+	EMemSpyClienServerOpGetProcessIdByName,
+	
+	EMemSpyClientServerOpGetThreadCount,
+	
+	EMemSpyClientServerOpGetThreads,
+	
+	EMemSpyClientServerOpSetThreadPriority,
+	
+	EMemSpyClientServerOpProcessSystemPermanentOrCritical,
+	
+	EMemSpyClientServerOpEndProcess,
+	
+	EMemSpyClientServerOpSwitchToProcess,
+	
+	//Threads operations
+	EMemSpyClientServerOpThreadSystemPermanentOrCritical,
+	
+	EMemSpyClientServerOpEndThread,
+	
+	EMemSpyClientServerOpSwitchToThread,
+	
+	EMemSpyClientServerOpGetInfoItemType,
+	
+	EMemSpyClientServerOpGetThreadInfoItemsCount,
+	
+	EMemSpyClientServerOpGetThreadInfoItems,
+	
+	EMemSpyClientServerOpOutputInfoHandles,
+	
+	EMemSpyClientServerOpOutputAOList,
+		
+	
+	//Kernel Objects operations
+	EMemSpyClientServerOpGetKernelObjectCount,
+	
+	EMemSpyClientServerOpGetKernelObjects,
+	
+	EMemSpyClientServerOpGetKernelObjectItemCount,
+	
+	EMemSpyClientServerOpGetKernelObjectItems,
+	
+	EMemSpyClientServerOpGetHeap,
+	
+	EMemSpyClientServerOpGetMemoryTrackingCycleCount,
+	
+	EMemSpyClientServerOpGetMemoryTrackingCycles,
+	
+	/**
+	 * [INTERNAL REQUEST]
+	 * Register for notifications of device wide operation progress.
+	 */
+	EMemSpyClientServerOpNotifyDeviceWideOperationProgress,
+	
+	/**
+	 * [INTERNAL REQUEST]
+	 * Cancel current device wide operation
+	 */
+	EMemSpyClientServerOpCancelDeviceWideOperation,	
+	
+	EMemSpyClientServerOpOutputAllContainerContents,
+	    
+	EMemSpyClientServerOpDumpKernelHeap,
+	
+	EMemSpyClientServerOpSetSwmtConfig,
+	
+	EMemSpyClientServerOpSetSwmtAutoStartProcessList,
+		
+	EMemSpyClientServerOpGetOutputSink,
+	
+	/**
+	 * [INTERNAL REQUEST]
+	 * Check if system wide memory tracking timer is running.
+	 */
+	EMemSpyClientServerOpIsSwmtRunning,
+	
+	EMemSpyClientServerOpMarkerUiLast,		
+	
+	/**
+	 * [INTERNAL REQUEST]
+	 */
     EMemSpyClientServerOpMarkerLast,
     };
 
 
+enum TMemSpyEndType
+	{
+	ETerminate,
+	EKill,
+	EPanic
+	};
 
 
 
--- a/memspy/memspy_plat/memspy_api/include/memspy/driver/shared/MemSpyDriverEnumerationsShared.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/driver/shared/MemSpyDriverEnumerationsShared.h	Tue Aug 31 16:45:49 2010 +0300
@@ -24,12 +24,24 @@
 // Enumerations
 enum TMemSpyDriverCellType
 	{
-	EMemSpyDriverGoodAllocatedCell = 0,
-	EMemSpyDriverGoodFreeCell,
-	EMemSpyDriverBadAllocatedCellSize,
-	EMemSpyDriverBadAllocatedCellAddress,
-	EMemSpyDriverBadFreeCellAddress,
-	EMemSpyDriverBadFreeCellSize
+	EMemSpyDriverAllocatedCellMask	= 0x000000FF,
+	EMemSpyDriverFreeCellMask		= 0x0000FF00,
+	EMemSpyDriverBadCellMask		= 0xFF000000,
+
+	EMemSpyDriverHeapAllocation		= 0x00000001,
+	EMemSpyDriverDlaAllocation		= 0x00000002,
+	EMemSpyDriverPageAllocation		= 0x00000003,
+	EMemSpyDriverSlabAllocation		= 0x00000004,
+	
+	EMemSpyDriverHeapFreeCell		= 0x00000100,
+	EMemSpyDriverDlaFreeCell		= 0x00000200,
+	EMemSpyDriverSlabFreeCell		= 0x00000300, // Used to track free cells in partially-filled slabs
+	EMemSpyDriverSlabFreeSlab		= 0x00000400, // Used to track entirely empty slabs (that don't have a specific cell size)
+
+	EMemSpyDriverHeapBadFreeCellAddress			= 0x01000000,
+	EMemSpyDriverHeapBadFreeCellSize			= 0x02000000,
+	EMemSpyDriverHeapBadAllocatedCellSize		= 0x03000000,
+	EMemSpyDriverHeapBadAllocatedCellAddress	= 0x04000000,
 	};
 
 
--- a/memspy/memspy_plat/memspy_api/include/memspy/driver/shared/MemSpyDriverObjectsShared.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/driver/shared/MemSpyDriverObjectsShared.h	Tue Aug 31 16:45:49 2010 +0300
@@ -349,7 +349,8 @@
     enum THeapImplementationType
         {
         ETypeUnknown = 0,
-        ETypeRHeap
+        ETypeRHeap = 1,
+		ETypeRHybridHeap = 2,
         };
 
 public: // Constructor & destructor
@@ -426,17 +427,19 @@
     };
 
 
-
 /**
- * Free cell information
+ * cell information
  */
 class TMemSpyDriverFreeCell
-    {
+	{
 public:
-    TInt iType;
-    TAny* iAddress;
-    TInt iLength;
-    };
+	TMemSpyDriverCellType iType;
+	TAny* iAddress;
+	TInt iLength;
+	};
+
+// For compatibility I can't change TMemSpyDriverCell to be the class and typdef/derive TMemSpyDriverFreeCell. Sigh...
+typedef TMemSpyDriverFreeCell TMemSpyDriverCell;
 
 
 /** 
--- a/memspy/memspy_plat/memspy_api/include/memspy/driver/shared/MemSpyDriverObjectsSharedRHeap.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/driver/shared/MemSpyDriverObjectsSharedRHeap.h	Tue Aug 31 16:45:49 2010 +0300
@@ -35,80 +35,6 @@
 class CTrapCleanup;
 
 
-
-class TMemSpyHeapObjectDataRHeap
-    {
-public:
-    inline TMemSpyHeapObjectDataRHeap()
-        : iAccessCount( 0 ),
-          iHandleCount( 0 ),
-          iHandles( NULL ),
-          iFlags( 0 ),
-          iCellCount( 0 ),
-          iTotalAllocSize ( 0 ),
-          //
-          iMinLength( 0 ),
-          iMaxLength( 0 ),
-          iOffset ( 0 ),
-          iGrowBy( 0 ),
-          iChunkHandle ( 0 ),
-          iBase( NULL ),
-          iTop( NULL ),
-          iAlign( 0 ),
-          iMinCell( 0 ),
-          iPageSize( 0 ),
-          iNestingLevel( 0 ),
-          iAllocCount( 0 ),
-          iFailRate( 0 ),
-          iFailed( EFalse ),
-          iFailAllocCount( 0 ),
-          iRand( 0 ),
-          iTestData( NULL )
-        {
-        }
-
-public: // API
-    inline TUint8* Base() const { return iBase; }
-    inline TUint Size() const { return iTop - iBase; }
-
-public: // From RAllocator
-	TInt iAccessCount;
-	TInt iHandleCount;
-	TInt* iHandles;
-	TUint32 iFlags;
-	TInt iCellCount;
-	TInt iTotalAllocSize;
-
-public: // From RHeap
-	TInt iMinLength;
-	TInt iMaxLength;
-	TInt iOffset;
-	TInt iGrowBy;
-	TInt iChunkHandle;
-    RFastLock iLock;
-	TUint8* iBase;
-	TUint8* iTop;
-	TInt iAlign;
-	TInt iMinCell;
-	TInt iPageSize;
-#ifdef __SYMBIAN_KERNEL_HYBRID_HEAP__
-	struct SCell { TInt len; SCell* next };
-    SCell iFree;
-#else
-    RHeap::SCell iFree;
-#endif
-	TInt iNestingLevel;
-	TInt iAllocCount;
-    RAllocator::TAllocFail iFailType;
-	TInt iFailRate;
-	TBool iFailed;
-	TInt iFailAllocCount;
-	TInt iRand;
-	TAny* iTestData;
-    };
-
-
-
 /**
  * Base class for MemSpy RHeap statistics
  */
@@ -205,33 +131,6 @@
     TUint32 iChecksum;
     };
 
-
-
-
-
-/**
- * RHeap statistics for common cell types
- */
-class TMemSpyHeapStatisticsRHeapCommon
-    {
-public: // Constructors
-    inline TMemSpyHeapStatisticsRHeapCommon()
-        : iTotalCellCount( 0 )
-        {
-        }
-
-public:
-    inline TUint TotalCellCount() const { return iTotalCellCount; }
-    inline void SetTotalCellCount( TUint aValue ) { iTotalCellCount = aValue; }
-
-private:
-    TUint iTotalCellCount;
-    };
-
-
-
-
-
 /**
  * RHeap statistics class
  */
@@ -239,6 +138,7 @@
     {
 public: // Constructors
     inline TMemSpyHeapStatisticsRHeap()
+		: iCommittedFreeSpace(0)
         {
         }
 
@@ -248,14 +148,14 @@
     //
     inline TMemSpyHeapStatisticsRHeapAllocated& StatsAllocated() { return iStatisticsAllocated; }
     inline const TMemSpyHeapStatisticsRHeapAllocated& StatsAllocated() const { return iStatisticsAllocated; }
-    //
-    inline TMemSpyHeapStatisticsRHeapCommon& StatsCommon() { return iStatisticsCommon; }
-    inline const TMemSpyHeapStatisticsRHeapCommon& StatsCommon() const { return iStatisticsCommon; }
+
 
 private: // Data members
-    TMemSpyHeapStatisticsRHeapCommon iStatisticsCommon;
     TMemSpyHeapStatisticsRHeapFree iStatisticsFree;
     TMemSpyHeapStatisticsRHeapAllocated iStatisticsAllocated;
+
+public: // I am fed up of all these pointless inline accessors...
+	TInt iCommittedFreeSpace; // The amount of committed memory that isn't payload data in allocated or free cells
     };
 
 
@@ -275,10 +175,15 @@
           iChunkHandle( NULL ),
           iChunkBaseAddress( NULL ),
           iDebugAllocator( EFalse ),
-          iHeaderSizeFree( 0 ),
-          iHeaderSizeAllocated( 0 ),
+          //iHeaderSizeFree( 0 ),
+          //iHeaderSizeAllocated( 0 ),
           iIsUserThread( ETrue ),
-          iSharedHeap( EFalse )
+		  iVTable(0),
+          iSharedHeap( EFalse ),
+          iHeapSize(0),
+          iAllocatorAddress(NULL),
+		  iMinHeapSize(0),
+		  iMaxHeapSize(0)
         {
         }
 
@@ -358,12 +263,6 @@
     inline TAny* ChunkBaseAddress() const { return iChunkBaseAddress; }
     inline void SetChunkBaseAddress( TAny* aValue ) { iChunkBaseAddress = aValue; }
     //
-    inline TUint HeaderSizeFree() const { return iHeaderSizeFree; }
-    inline void SetHeaderSizeFree( TUint aValue ) { iHeaderSizeFree = aValue; }
-    //
-    inline TUint HeaderSizeAllocated() const { return iHeaderSizeAllocated; }
-    inline void SetHeaderSizeAllocated( TUint aValue ) { iHeaderSizeAllocated = aValue; }
-    //
     inline TBool IsDebugAllocator() const { return iDebugAllocator; }
     inline void SetDebugAllocator( TBool aValue ) { iDebugAllocator = aValue; }
     //
@@ -375,30 +274,24 @@
     //
     inline TUint VTable() const { return iVTable; }
     inline void SetVTable( TUint aValue ) { iVTable = aValue; }
-    //
-    inline TUint ClassSize() const { return iClassSize; }
-    inline void SetClassSize( TUint aValue ) { iClassSize = aValue; }
 
 private: // Data members
     TBuf8< KMaxFullName * 2 > iChunkName;
+public:
     TUint iChunkSize;
     TAny* iChunkHandle;
     TAny* iChunkBaseAddress;
     TBool iDebugAllocator;
-    TUint iHeaderSizeFree;
-    TUint iHeaderSizeAllocated;
     TBool iSharedHeap;
     TBool iIsUserThread;
     TUint iVTable;
-    TUint iClassSize;
+	TUint iHeapSize; // Committed size - generally the same as iChunkSize (except maybe for kernel heap)
+	TAny* iAllocatorAddress; // replacement for things using the RHeap base address
+	TUint iMinHeapSize; // Minimum committed size
+	TUint iMaxHeapSize; // Max committed size
     };
 
 
-
-
-
-
-
 /**
  *
  */
@@ -413,15 +306,17 @@
     inline TMemSpyHeapMetaDataRHeap& MetaData() { return iMetaData; }
     inline const TMemSpyHeapMetaDataRHeap& MetaData() const { return iMetaData; }
     //
-    inline TMemSpyHeapObjectDataRHeap& ObjectData() { return iObjectData; }
-    inline const TMemSpyHeapObjectDataRHeap& ObjectData() const { return iObjectData; }
+    //inline TMemSpyHeapObjectDataRHeap& ObjectData() { return iObjectData; }
+    //inline const TMemSpyHeapObjectDataRHeap& ObjectData() const { return iObjectData; }
     //
     inline TMemSpyHeapStatisticsRHeap& Statistics() { return iStatistics; }
     inline const TMemSpyHeapStatisticsRHeap& Statistics() const { return iStatistics; }
 
+	inline TInt Overhead() const { return iMetaData.iHeapSize - iStatistics.StatsAllocated().TypeSize() - iStatistics.iCommittedFreeSpace; }
+
 private: // Data members
     TMemSpyHeapMetaDataRHeap iMetaData;
-    TMemSpyHeapObjectDataRHeap iObjectData;
+    //TMemSpyHeapObjectDataRHeap iObjectData;
     TMemSpyHeapStatisticsRHeap iStatistics;
     };
 
--- a/memspy/memspy_plat/memspy_api/include/memspy/driver/user/MemSpyDriverClient.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/driver/user/MemSpyDriverClient.h	Tue Aug 31 16:45:49 2010 +0300
@@ -157,6 +157,7 @@
      */
     IMPORT_C TInt GetHeapInfoUser( TMemSpyHeapInfo& aInfo, TUint aTid );
     IMPORT_C TInt GetHeapInfoUser( TMemSpyHeapInfo& aInfo, TUint aTid, RArray<TMemSpyDriverFreeCell>& aFreeCells );
+	IMPORT_C TInt GetHeapInfoUser(TMemSpyHeapInfo& aInfo, TUint aTid, RArray<TMemSpyDriverCell>& aCells, TBool aCollectAllocatedCellsAsWellAsFree);
 
     /**
      *
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperFbServ.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperFbServ.h	Tue Aug 31 16:45:49 2010 +0300
@@ -74,7 +74,7 @@
     HBufC8* LocateBitmapArrayHeapCellDataLC( TAny*& aArrayCellAddress, TInt aArrayAllocCount );
     void ReadCObjectConInfoL( TAny* aCellAddress, RArray<TAny*>& aContainerObjects, TInt& aCount, TInt& aAllocated );
     static void ParseCellDataAndExtractHandlesL( const TDesC8& aData, RArray<TInt>& aHandles, TInt aArrayEntryCount );
-    static TBool VerifyCorrectHeapCellL( const TDesC8& aData, TAny* aCellAddress, TAny* aPayloadAddress, TUint aHeapStartingAddress, TUint aHeapSize );
+    static TBool VerifyCorrectHeapCellL( const TDesC8& aData, TAny* aCellAddress, TAny* aPayloadAddress, TUint aHeapStartingAddress, TUint aHeapMaxSize );
     static TUint OffsetToCObjectConBitmapCon();
     static TUint OffsetToCObjectConFontCon();
     static TUint OffsetToBitmapHandleArray();
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperHeap.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperHeap.h	Tue Aug 31 16:45:49 2010 +0300
@@ -26,6 +26,9 @@
 // Driver includes
 #include <memspy/driver/memspydriverobjectsshared.h>
 
+// MemSpyClient includes
+#include <memspy/engine/memspyheapdata.h>
+
 // Classes referenced
 class CMemSpyThread;
 class CMemSpyEngine;
@@ -44,7 +47,8 @@
     void ConstructL();
 
 public: // API - User Heap 
-    IMPORT_C void GetHeapInfoUserL( const TProcessId& aProcess, const TThreadId& aThread, TMemSpyHeapInfo& aInfo, RArray<TMemSpyDriverFreeCell>* aFreeCells = NULL );
+    IMPORT_C void GetHeapInfoUserL( const TProcessId& aProcess, const TThreadId& aThread, TMemSpyHeapInfo& aInfo, RArray<TMemSpyDriverCell>* aCells = NULL );
+	IMPORT_C void GetHeapInfoUserL(const TProcessId& aProcess, const TThreadId& aThread, TMemSpyHeapInfo& aInfo, RArray<TMemSpyDriverCell>* aCells, TBool aCollectAllocatedCellsAsWellAsFree);
     IMPORT_C void GetHeapInfoUserL( const CMemSpyProcess& aProcess, RArray<TMemSpyHeapInfo >& aInfos );
     IMPORT_C void OutputHeapInfoUserL( const CMemSpyThread& aThread );
     IMPORT_C void OutputHeapDataUserL( const CMemSpyThread& aThread );
@@ -57,10 +61,12 @@
     IMPORT_C void OutputHeapDataKernelL();
 
 public: // API - Common
-    IMPORT_C void OutputHeapInfoL( const TMemSpyHeapInfo& aInfo, const TDesC& aThreadName, const RArray<TMemSpyDriverFreeCell>* aFreeCells = NULL );
+    IMPORT_C void OutputHeapInfoL( const TMemSpyHeapInfo& aInfo, const TDesC& aThreadName, const RArray<TMemSpyDriverCell>* aCells = NULL );
     IMPORT_C void OutputHeapInfoForDeviceL( TBool aIncludeKernel = ETrue );
     IMPORT_C CMemSpyEngineOutputList* NewHeapSummaryShortLC( const TMemSpyHeapInfo& aInfo );
-    IMPORT_C CMemSpyEngineOutputList* NewHeapSummaryExtendedLC( const TMemSpyHeapInfo& aInfo, const RArray<TMemSpyDriverFreeCell>* aFreeCells = NULL );
+    IMPORT_C CMemSpyEngineOutputList* NewHeapSummaryExtendedLC( const TMemSpyHeapInfo& aInfo, const RArray<TMemSpyDriverCell>* aCells = NULL );
+    //cigasto    
+    IMPORT_C TMemSpyHeapData NewHeapRawInfo( const TMemSpyHeapInfo& aInfo ); //not formatted heap info
 
 public: // But not exported
     void OutputHeapDataKernelL( TBool aCreateDataStream );
@@ -70,9 +76,8 @@
 private:
     static TUint DescriptorAsDWORD( const TDesC8& aItem );
     void AppendMetaDataL( const TMemSpyHeapInfo& aInfo, CMemSpyEngineOutputList& aList );
-    void AppendObjectDataL( const TMemSpyHeapInfo& aInfo, CMemSpyEngineOutputList& aList );
     void AppendStatisticsL( const TMemSpyHeapInfo& aInfo, CMemSpyEngineOutputList& aList );
-    void AppendFreeCellsL( const RArray<TMemSpyDriverFreeCell>& aFreeCells, CMemSpyEngineOutputList& aList );
+	void AppendCellsL(const RArray<TMemSpyDriverCell>& aCells, CMemSpyEngineOutputList& aList);
     void OutputCSVEntryL( TInt aIndex, const TMemSpyHeapInfo& aInfo, const TDesC& aThreadName, const TDesC& aProcessName );
     void UpdateSharedHeapInfoL( const TProcessId& aProcess, const TThreadId& aThread, TMemSpyHeapInfo& aInfo );
 
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperKernelContainers.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperKernelContainers.h	Tue Aug 31 16:45:49 2010 +0300
@@ -87,6 +87,8 @@
     IMPORT_C static TPtrC TypeAsString( TMemSpyDriverContainerType aType );
     IMPORT_C TPtrC Name() const;
     IMPORT_C void OutputL( CMemSpyEngineOutputSink& aSink ) const;
+    IMPORT_C TInt Size() const;
+    IMPORT_C TInt ItemsCount() const;
 
 public: // But not exported
     TAny* HandleAt( TInt aIndex ) const;
@@ -137,4 +139,5 @@
 
 
 
-#endif
\ No newline at end of file
+#endif
+
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/MemSpyEngine.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/MemSpyEngine.h	Tue Aug 31 16:45:49 2010 +0300
@@ -60,6 +60,7 @@
     {
 public:
     IMPORT_C static CMemSpyEngine* NewL( RFs& aFsSession );
+    IMPORT_C static CMemSpyEngine* NewL( RFs& aFsSession, TBool aStartServer );
     IMPORT_C ~CMemSpyEngine();
 
 private:
@@ -80,6 +81,8 @@
     IMPORT_C CMemSpyEngineOutputSink& Sink();
     IMPORT_C TMemSpySinkType SinkType();
     IMPORT_C void InstallSinkL( TMemSpySinkType aType );
+    IMPORT_C void InstallDebugSinkL();
+    IMPORT_C void InstallFileSinkL( const TDesC& aRootFolder );
 
 public: // Misc
     IMPORT_C void ListOpenFilesL();
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/MemSpyEngineImp.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/MemSpyEngineImp.h	Tue Aug 31 16:45:49 2010 +0300
@@ -80,6 +80,7 @@
     CMemSpyEngineOutputSink& Sink();
     TMemSpySinkType SinkType();
     void InstallSinkL( TMemSpySinkType aType );
+    void InstallSinkL( TMemSpySinkType aType, const TDesC& aRootFolder );
 
 public: // Misc
     void ListOpenFilesL();
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/Sink/MemSpyEngineOutputSink.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/Sink/MemSpyEngineOutputSink.h	Tue Aug 31 16:45:49 2010 +0300
@@ -48,13 +48,16 @@
     IMPORT_C static CMemSpyEngineSinkMetaData* NewL();
     IMPORT_C static CMemSpyEngineSinkMetaData* NewL( const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, TBool aOverwrite, TBool aUseFileTimeStamp );
     IMPORT_C static CMemSpyEngineSinkMetaData* NewL( const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, TBool aOverwrite, TBool aUseFileTimeStamp, const TTime& aFolderTimeStamp );
+    IMPORT_C static CMemSpyEngineSinkMetaData* NewL( const TDesC& aRoot, const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, TBool aOverwrite, TBool aUseFileTimeStamp );
+    IMPORT_C static CMemSpyEngineSinkMetaData* NewL( const TDesC& aRoot, const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, TBool aOverwrite, TBool aUseFileTimeStamp, const TTime& aFolderTimeStamp );
     IMPORT_C ~CMemSpyEngineSinkMetaData();
 
 private:
     CMemSpyEngineSinkMetaData( TBool aOverwrite, TBool aUseTimeStamp );
-    void ConstructL( const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, const TTime& aFolderTime );
+    void ConstructL( const TDesC& aRoot, const TDesC& aContext, const TDesC& aFolder, const TDesC& aExtension, const TTime& aFolderTime );
 
 public: // Access
+    inline const TDesC& Root() const { return *iRoot; }
     inline const TDesC& Context() const { return *iContext; }
     inline const TDesC& Folder() const { return *iFolder; }
     inline const TDesC& Extension() const { return *iExtension; }
@@ -63,6 +66,7 @@
     inline const TBool UseFileTimeStamp() const { return iUseFileTimeStamp; }
 
 private: // Data members
+    HBufC* iRoot;
     HBufC* iContext;
     HBufC* iFolder;
     HBufC* iExtension;
@@ -146,4 +150,4 @@
 
 
 
-#endif
\ No newline at end of file
+#endif
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/SysMemTracker/MemSpyEngineHelperSysMemTracker.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/SysMemTracker/MemSpyEngineHelperSysMemTracker.h	Tue Aug 31 16:45:49 2010 +0300
@@ -58,9 +58,10 @@
     //
     IMPORT_C const RPointerArray< CMemSpyEngineHelperSysMemTrackerCycle >& CompletedCycles() const;
 
+    IMPORT_C void CheckForChangesNowL();
+
 public: // But not exported
     void Reset();
-    void CheckForChangesNowL();
 
 public: // From MDesCArray
     IMPORT_C TInt MdcaCount() const;
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/SysMemTracker/MemSpyEngineHelperSysMemTrackerConfig.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/SysMemTracker/MemSpyEngineHelperSysMemTrackerConfig.h	Tue Aug 31 16:45:49 2010 +0300
@@ -22,7 +22,8 @@
 #include <e32base.h>
 
 // Constants
-const TInt KMemSpySysMemTrackerConfigMinTimerPeriod = 30; // Seconds
+const TInt KMemSpySysMemTrackerConfigMinTimerPeriod = 5; // Seconds
+const TInt KMemSpySysMemTrackerConfigMaxTimerPeriod = 60; // Seconds
 
 
 NONSHARABLE_CLASS( TMemSpyEngineHelperSysMemTrackerConfig )
@@ -90,4 +91,4 @@
     };
 
 
-#endif
\ No newline at end of file
+#endif
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/ThreadAndProcess/MemSpyEngineObjectProcess.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/ThreadAndProcess/MemSpyEngineObjectProcess.h	Tue Aug 31 16:45:49 2010 +0300
@@ -65,7 +65,11 @@
     IMPORT_C TBool IsDead() const;
     IMPORT_C TUint32 SID() const;
     IMPORT_C TUint32 VID() const;
-
+    IMPORT_C TProcessPriority Priority() const;
+    IMPORT_C TExitCategoryName ExitCategory() const;
+    IMPORT_C TInt ExitReason() const;
+    IMPORT_C TExitType ExitType() const;
+    
 public: // API - misc
     IMPORT_C void KillL();
     IMPORT_C void TerminateL();
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/ThreadAndProcess/MemSpyEngineObjectThread.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/ThreadAndProcess/MemSpyEngineObjectThread.h	Tue Aug 31 16:45:49 2010 +0300
@@ -56,6 +56,7 @@
     IMPORT_C TBool IsSystemPermanent() const;
     IMPORT_C TBool IsSystemCritical() const;
     IMPORT_C TBool IsDead() const;
+    IMPORT_C TThreadPriority Priority() const;
 
 public: // API - misc
     IMPORT_C void KillL();
@@ -105,4 +106,4 @@
 
 
 
-#endif
\ No newline at end of file
+#endif
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/ThreadAndProcess/MemSpyEngineObjectThreadInfoObjects.h	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/ThreadAndProcess/MemSpyEngineObjectThreadInfoObjects.h	Tue Aug 31 16:45:49 2010 +0300
@@ -98,6 +98,8 @@
 public: // From MDesCArray
     IMPORT_C TInt MdcaCount() const;
     IMPORT_C TPtrC MdcaPoint(TInt aIndex) const;
+    IMPORT_C TPtrC Caption(TInt aIndex ) const;
+    IMPORT_C TPtrC Value(TInt aIndex ) const;
 
 protected:
     class CItem : public CBase
--- a/memspy/rom/memspy.iby	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/rom/memspy.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -22,12 +22,16 @@
 file=ABI_DIR\BUILD_DIR\MemSpyDriverClient.dll									SHARED_LIB_DIR\MemSpyDriverClient.dll
 file=ABI_DIR\BUILD_DIR\MemSpyEngine.dll											SHARED_LIB_DIR\MemSpyEngine.dll
 
+// Client - server
+file=ABI_DIR\BUILD_DIR\MemSpyServer.exe											SHARED_LIB_DIR\MemSpyServer.exe
+file=ABI_DIR\BUILD_DIR\MemSpyClient.dll											SHARED_LIB_DIR\MemSpyClient.dll
+
 // Commandline
 file=ABI_DIR\BUILD_DIR\MemSpy.exe									            SHARED_LIB_DIR\MemSpy.exe
 
 // Console UI
-file=ABI_DIR\BUILD_DIR\MemSpyConsole.exe										SHARED_LIB_DIR\MemSpyConsole.exe
-data=ZPRIVATE\\2002129E\MemSpyEComInterfaceIds.xml							    \private\2002129E\MemSpyEComInterfaceIds.xml
-data=ZPRIVATE\\2002129E\MemSpyProcessMemoryTrackingAutoStartConfig.xml		    \private\2002129E\MemSpyProcessMemoryTrackingAutoStartConfig.xml
+//file=ABI_DIR\BUILD_DIR\MemSpyConsole.exe										SHARED_LIB_DIR\MemSpyConsole.exe
+//data=ZPRIVATE\\2002129E\MemSpyEComInterfaceIds.xml							    \private\2002129E\MemSpyEComInterfaceIds.xml
+//data=ZPRIVATE\\2002129E\MemSpyProcessMemoryTrackingAutoStartConfig.xml		    \private\2002129E\MemSpyProcessMemoryTrackingAutoStartConfig.xml
 
 #endif
--- a/memspy/symbian_version.hrh	Thu Aug 19 11:25:43 2010 +0300
+++ b/memspy/symbian_version.hrh	Tue Aug 31 16:45:49 2010 +0300
@@ -37,7 +37,7 @@
  * used to variate the source code based on the SDK in use. The value of the
  * flag should be always changed to reflect the current build environment.
  */
-#define SYMBIAN_VERSION_SUPPORT                              SYMBIAN_3
+#define SYMBIAN_VERSION_SUPPORT                              SYMBIAN_4
 
 
 #endif  // __SYMBIAN_VERSION_HRH
--- a/osrndtools_info/osrndtools_metadata/osrndtools_metadata.mrp	Thu Aug 19 11:25:43 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-component           osrndtools_metadata
-source   \sf\os\osrndtools\osrndtools_info\osrndtools_metadata 
-source   \sf\os\osrndtools\package_definition.xml
-source   \sf\os\osrndtools\distribution.policy.s60
-notes_source      \component_defs\release.src
-ipr T 
--- a/package_definition.xml	Thu Aug 19 11:25:43 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<SystemDefinition schema="3.0.0">
- <package id="osrndtools" name="OS R&amp;D tools" levels="fw trace">
-  <collection id="stif" name="STIF" level="fw">
-   <component id="testinterface" filter="s60" name="Test Interface" purpose="development">
-    <unit bldFile="stif/testinterface/group"/>
-   </component>
-   <component id="testserver" filter="s60" name="Test Server" purpose="development">
-    <unit bldFile="stif/testserver/group"/>
-   </component>
-   <component id="testengine" filter="s60" name="Test Engine" purpose="development">
-    <unit bldFile="stif/testengine/group"/>
-   </component>
-   <component id="testserverstarter" filter="s60" name="Test Server Starter" purpose="development">
-    <unit bldFile="stif/testserverstarter/group"/>
-   </component>
-   <component id="stiftfwif" filter="s60" name="STIF Test Framework Interface" purpose="development">
-    <unit bldFile="stif/stiftfwif/group"/>
-   </component>
-   <component id="consoleui" filter="s60" name="Console UI" purpose="development">
-    <unit bldFile="stif/consoleui/group"/>
-   </component>
-   <component id="testcombiner" filter="s60" name="Test Combiner" purpose="development">
-    <unit bldFile="stif/testcombiner/group"/>
-   </component>
-   <component id="demomodule" filter="s60" name="Demo Module" purpose="development">
-    <unit bldFile="stif/demomodule/group"/>
-   </component>
-   <component id="atslogger" filter="s60" name="ATS Logger" purpose="development">
-    <unit bldFile="stif/atslogger/group"/>
-   </component>
-   <component id="atsinterface" filter="s60" name="ATS Interface" purpose="development">
-    <unit bldFile="stif/atsinterface/group"/>
-   </component>
-   <component id="testscripter" filter="s60" name="Test Scripter" purpose="development">
-    <unit bldFile="stif/testscripter/group"/>
-   </component>
-   <component id="suevent" filter="s60" name="SU Event" purpose="development">
-    <unit bldFile="stif/suevent/group"/>
-   </component>
-   <component id="stifkerneltestclassbase" filter="s60" name="STIF Kernel Test Class Base" purpose="development">
-    <unit bldFile="stif/stifkerneltestclassbase/group"/>
-   </component>
-   <component id="examples" filter="s60" name="STIF Examples" purpose="development">
-    <!-- <unit bldFile="stif/examples/stiftestmeasurementstub/group"/> -->
-    <!-- <unit bldFile="stif/examples/stifhwresetstub/group"/> -->
-   </component>
-   <component id="testmoduletemplates" filter="s60" name="Test Module Templates" purpose="development">
-    <!-- <unit bldFile="stif/testmoduletemplates/templatescriptxxx/group"/> -->
-    <!-- <unit bldFile="stif/testmoduletemplates/templatekernelscriptxxx/group"/> -->
-    <!-- <unit bldFile="stif/testmoduletemplates/capsmodifierxxx/group"/> -->
-    <!-- <unit bldFile="stif/testmoduletemplates/testmodulexxx/group"/> -->
-    <!-- <unit bldFile="stif/testmoduletemplates/stifunitxxx/group"/> -->
-    <!-- <unit bldFile="stif/testmoduletemplates/hardcodedtestmodulexxx/group"/> -->
-   </component>
-   <component id="stif_build" filter="s60" name="STIF Build" purpose="development">
-    <unit bldFile="stif/group"/>
-   </component>
-  </collection>
-  <collection id="memspy" name="Memspy" level="trace">
-   <component id="driver" filter="s60" name="Memspy Driver" purpose="development">
-    <unit bldFile="memspy/driver/group"/>
-   </component>
-   <component id="memspy_engine" filter="s60" name="Memspy Engine" purpose="development">
-    <unit bldFile="memspy/engine/group"/>
-   </component>
-   <component id="commandline" filter="s60" name="Memspy Command Line" purpose="development">
-    <unit bldFile="memspy/commandline/group"/>
-   </component>
-   <component id="console" filter="s60" name="Memspy Console" purpose="development">
-    <unit bldFile="memspy/console/group"/>
-   </component>
-   <component id="memspy_build" filter="s60" name="Memspy Build" purpose="development">
-    <unit bldFile="memspy/group"/>
-   </component>
-  </collection>
-  <collection id="hti" name="Harmonized Test Interface" level="trace">
-   <component id="htiframework" filter="s60" name="HTI Framework" purpose="development">
-    <unit bldFile="hti/htiframework/group"/>
-   </component>
-   <component id="hticfg" filter="s60" name="HTI Config" purpose="development">
-    <unit bldFile="hti/hticfg/group"/>
-   </component>
-   <component id="htiautostart" filter="s60" name="HTI Autostart" purpose="development">
-    <unit bldFile="hti/htiautostart/group"/>
-   </component>
-   <component id="htifilehlp" filter="s60" name="HTI File Help" purpose="development">
-    <unit bldFile="hti/htifilehlp/group"/>
-   </component>
-   <component id="htiwatchdog" filter="s60" name="HTI Watchdog" purpose="development">
-    <unit bldFile="hti/htiwatchdog/group"/>
-   </component>
-   <component id="hti_build" filter="s60" name="HTI Build" purpose="development">
-    <unit bldFile="hti/group"/>
-   </component>
-  </collection>
-    <collection id="testexecfw1" name="Test Execution Framework v1" level="fw">
-      <component id="cinidata" name="CINI Data" purpose="development">
-        <unit bldFile="testexecfw1/cinidata" mrp="testexecfw1/cinidata/tools_cinidata.mrp"/>
-      </component>
-      <component id="testexecute" name="Test Execute" deprecated="^2" purpose="development">
-        <unit bldFile="testexecfw1/testexecute/Group" mrp="testexecfw1/testexecute/Group/tools_testexecute.mrp"/>
-      </component>
-    </collection>
-    <collection id="osrndtools_info" name="OS R&amp;D tools Info" level="trace">
-      <component id="osrndtools_plat" filter="s60" name="OS R&amp;D tools Platform Interfaces" class="api" purpose="development">
-        <unit bldFile="osrndtools_plat/group"/>
-          <!-- need to #include the next bld.inf  in the above one -->
-        <unit bldFile="osrndtools_plat/hti_api/group"/>
-      </component>
-      <component id="osrndtools_metadata" name="OS R&amp;D tools Metadata" class="config" introduced="^2" purpose="development" target="desktop">
-        <unit mrp="osrndtools_info/osrndtools_metadata/osrndtools_metadata.mrp"/>
-      </component>
-    </collection>
-  </package>
-</SystemDefinition>
Binary file piprofiler/group/ReleaseNotes_PIProfiler.txt has changed
--- a/piprofiler/group/bld.inf	Thu Aug 19 11:25:43 2010 +0300
+++ b/piprofiler/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -26,8 +26,15 @@
 #include "../plugins/DebugOutputWriterPlugin/group/bld.inf"
 #include "../plugins/DiskWriterPlugin/group/bld.inf"
 
+#if ( SYMBIAN_VERSION_SUPPORT >= SYMBIAN_3 )
+    #include "../plugins/PWRPlugin/group/bld.inf"
+#endif
 
 PRJ_EXPORTS
-../rom/piprofiler.iby CORE_IBY_EXPORT_PATH(tools,piprofiler.iby)
+#if ( SYMBIAN_VERSION_SUPPORT >= SYMBIAN_3 )
+    ../rom/piprofiler.iby CORE_IBY_EXPORT_PATH(tools,piprofiler.iby)
+#else
+    ../rom/piprofiler_s2.iby CORE_IBY_EXPORT_PATH(tools,piprofiler.iby)
+#endif
 ../rom/piprofiler_ldd.iby CORE_IBY_EXPORT_PATH(tools/rom,piprofiler_ldd.iby)
 
--- a/piprofiler/plugins/GeneralsPlugin/src/GppSamplerImpl.cpp	Thu Aug 19 11:25:43 2010 +0300
+++ b/piprofiler/plugins/GeneralsPlugin/src/GppSamplerImpl.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -76,7 +76,7 @@
 	{
 	LOGTEXT("GppSamplerImpl::Reset");
 	iLastPc = 0;
-	iLastThread = 0;
+	iLastThread = 0xfffffffe;
 	iRepeat = 0;
 	iIsaStatus = 0;
 	iIsaStart = 0;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piprofiler/plugins/PWRplugin/data/2001E5B9.rss	Tue Aug 31 16:45:49 2010 +0300
@@ -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:  
+*
+*/
+
+
+#include <ecom/registryinfo.rh>
+
+// Declares info for two implementations
+RESOURCE REGISTRY_INFO theInfo
+    {
+    // UID for the DLL. See mmp files
+    //__SERIES60_3X__ can't be used in resource files
+    dll_uid = 0x2001E5B9;
+
+    // Declare array of interface info. This dll contains implementations for 
+    // only one interface (CSamplerInterfaceDefinition).
+    interfaces = 
+        {
+        INTERFACE_INFO
+            {
+            // UID of interface that is implemented
+            interface_uid = 0x2001E5BC;
+
+            implementations = 
+                {
+                IMPLEMENTATION_INFO
+                    {
+                    implementation_uid = 0x2001E5B9;
+
+                    version_no = 1;
+                    display_name = "PWR Sampler";
+                    default_data = "pwr";
+                    opaque_data = "10";
+                    }
+                };
+            }
+        };
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piprofiler/plugins/PWRplugin/group/PWRPlugin.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,53 @@
+/*
+* 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:  
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+
+TARGET          PIProfilerPWR.dll
+TARGETTYPE      PLUGIN
+UID             0x10009D8D 0x2001E5B9
+VENDORID        VID_DEFAULT
+CAPABILITY      ALL -TCB
+SMPSAFE
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE     ../inc
+USERINCLUDE     ../../../inc
+SOURCEPATH      ../src
+
+START RESOURCE  ../data/2001E5B9.rss
+TARGET PIProfilerPWR.rsc
+END
+
+SOURCE          PwrPluginImplementationTable.cpp
+SOURCE          PwrPlugin.cpp
+
+LIBRARY     euser.lib
+LIBRARY     ecom.lib
+LIBRARY     apparc.lib
+LIBRARY     cone.lib
+LIBRARY     gdi.lib
+LIBRARY     ws32.lib
+LIBRARY     efsrv.lib
+LIBRARY     charconv.lib
+LIBRARY     CommonEngine.lib
+LIBRARY     flogger.lib
+LIBRARY     centralrepository.lib
+LIBRARY     HWRMPowerClient.lib
+LIBRARY     HWRMLightClient.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piprofiler/plugins/PWRplugin/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -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:  
+*
+*/
+
+#ifndef SBSV2
+PRJ_PLATFORMS
+DEFAULT
+#endif
+
+PRJ_MMPFILES
+#ifdef MARM
+  #ifndef __SERIES60_30__
+    PWRPlugin.mmp
+  #endif
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piprofiler/plugins/PWRplugin/inc/PwrPlugin.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,167 @@
+/*
+* 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 BAPPEA_PWR_SAMPLER_H
+#define BAPPEA_PWR_SAMPLER_H
+
+//#define PWR_SAMPLER_BACKLIGHT
+
+//#include "PIProfilerConfigInternal.h"
+
+// system definitions
+#include <w32std.h>
+#include <e32std.h>
+
+#include <e32property.h>
+#include <HWRMPower.h>
+#include <HWRMLight.h>
+
+// user definitions
+#include <piprofiler/SamplerPluginInterface.h>
+#include <piprofiler/ProfilerGenericClassesUsr.h>
+
+// caption definitions
+_LIT8(KPWRShortName, "pwr");
+_LIT8(KPWRMediumName, "Power sampler");
+_LIT8(KPWRLongName, "Power usage sampler");
+_LIT8(KPWRDescription, "Power sampler: \nSampling power consumption on Nokia S60 devices\nHW dep: N/A\nSW dep: S60 3.0\n");
+
+// Minimum allowed sampling interval (in ms). 0 means undefined.
+const TInt KMinSampleInterval = 250;
+const TInt KReportingPeriodInfinite = 0;
+
+const TUid KGppPropertyCat={0x20201F70};
+enum TGppPropertyKeys
+    {
+    EGppPropertySyncSampleNumber
+    };
+
+const TUid KPwrNotifierUid = { 0x2001E5B9 };
+class CProfilerPowerListener;
+
+/*
+ *
+ * PWR sampler plug-in definition
+ *
+ */
+
+class CPwrPlugin : public CSamplerPluginInterface
+{
+public:
+    static  CPwrPlugin* NewL(const TUid aImplementationUid, TAny* aInitParams);
+            ~CPwrPlugin();
+
+    TInt    ResetAndActivateL(CProfilerSampleStream& aStream);
+    TInt    StopSampling();
+    TBool   Enabled() { return iEnabled; }
+    void    SetEnabled(TBool aEnabled);
+    TInt    GetSamplerType();
+
+    TInt    CreateFirstSample();
+
+    void    GetAttributesL(CArrayFixFlat<TSamplerAttributes>* aAttributes);
+    TInt    SetAttributesL(TSamplerAttributes aAttributes);
+    void    InitiateSamplerAttributesL();
+
+    TInt    ConvertRawSettingsToAttributes(CDesC8ArrayFlat* aSingleSettingArray);
+
+    TInt    DoSetSamplerSettings(CDesC8ArrayFlat* aAllSettings, TDesC8& aSamplerName, TInt aIndex);
+    void    SaveSettingToAttributes(const TDesC8& aSetting, TInt aIndex);
+
+    TUid    Id(TInt aSubId) const;
+
+    // subsampler settings, i.e. samplers implemented within a plugin
+    // no sub samplers, from CSamplerPluginInterface
+    TInt    SubId(TUid aId) const {return KErrNotFound;}
+    TInt    GetSubSamplers(TDes* aDes){return KErrNotFound;}
+
+private:
+            CPwrPlugin();
+    void    ConstructL();
+
+private:
+    TUint8                  iVersion[20];
+    TPtr8                   iVersionDescriptor;
+
+    TInt                    iSamplerType;
+
+    CProfilerPowerListener* iPowerListener;
+
+    TInt                    iPeriod;
+    CArrayFixFlat<TSamplerAttributes>* iSamplerAttributes;
+public:
+    TUint32*                iSampleTime;
+};
+
+#ifdef PWR_SAMPLER_BACKLIGHT
+class CProfilerPowerListener : public MHWRMBatteryPowerObserver, public MHWRMLightObserver
+#else
+class CProfilerPowerListener : public MHWRMBatteryPowerObserver
+#endif
+{
+public:
+    static  CProfilerPowerListener* NewL(CPwrPlugin* aSampler);
+            ~CProfilerPowerListener();
+
+private:
+            CProfilerPowerListener(CPwrPlugin* aSampler);
+    void    ConstructL();
+
+public:
+    TInt    StartL(const TDesC8& aBuf);
+    TInt    Stop();
+    TInt    DisplayNotifierL(const TDesC& aLine1, const TDesC& aLine2, const TDesC& aButton1, const TDesC& aButton2);
+
+    // From MHWRMBatteryPowerObserver
+    virtual void PowerMeasurement(TInt aErr, CHWRMPower::TBatteryPowerMeasurementData& aMeasurement);
+#ifdef PWR_SAMPLER_BACKLIGHT
+    // From MHWRMLightObserver
+    virtual void LightStatusChanged(TInt aTarget, CHWRMLight::TLightStatus aStatus);
+#endif
+
+private:
+    void    Sample();
+
+public:
+    TInt                    iPwrSamplingPeriod;
+    TInt                    iSampleStartTime;
+    // Value that is read from Central Repository and restored after sampling
+    TInt                    iOriginalReportingPeriod;
+
+private:
+
+#ifdef PWR_SAMPLER_BACKLIGHT
+    TUint8                  iSample[13];
+#else
+    TUint8                  iSample[12];
+#endif
+
+    TUint16                 iNominalCapa;
+    TUint16                 iVoltage;
+    TUint16                 iCurrent;
+
+    CPwrPlugin*             iSampler;
+    CHWRMPower*             iPowerAPI;
+
+#ifdef PWR_SAMPLER_BACKLIGHT
+    CHWRMLight*             iLightAPI;
+    CHWRMLight::TLightStatus iBackLightStatus;
+#endif
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piprofiler/plugins/PWRplugin/sis/PWRPlugin.pkg	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+;
+; ShapeImplementation_30_gcce.pkg
+;
+
+;Language - standard language definitions
+&EN
+
+; standard sis file header
+#{"Shape plugin"},(0xE01F614F),2,0,0
+
+
+;
+;Localised Vendor name
+;
+%{"Forum Nokia"}
+
+;
+;Unique Vendor name
+;
+:"Forum Nokia"
+
+;
+;Supports Series 60 v 3.0
+;
+[0x101F7961], 0, 0, 0, {"Series60ProductID"}
+
+
+;Files to include. Check the source paths they match your SDK setup. 
+"\Symbian\9.1\S60_3rd_MR\Epoc32\release\gcce\urel\shapeimplementation.dll"     -   "!:\sys\bin\shapeimplementation.dll"
+"\Symbian\9.1\S60_3rd_MR\epoc32\data\Z\Resource\plugins\shapeimplementation.rsc"   -   "!:\Resource\Plugins\shapeimplementation.RSC"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piprofiler/plugins/PWRplugin/src/PwrPlugin.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,623 @@
+/*
+* 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:  
+*
+*/
+
+#include "PwrPlugin.h"
+#include <piprofiler/ProfilerTraces.h>
+
+#include <centralrepository.h>
+#include <HWRMPower.h>
+#include <HWRMLight.h>
+#include <hwrm/hwrmpowerdomaincrkeys.h>
+
+
+// texts for notes
+_LIT(KPowerTextLine1, "Power sampler:");
+_LIT(KPowerTextLine2, "Failed to start power measurement");
+_LIT(KPowerTextErrorSampling, "Error receiving measurement data");
+_LIT(KButtonOk, "Ok");
+
+// LITERALS
+
+_LIT8(KSamplingPeriodMs, "sampling_period_ms");
+
+// CONSTANTS
+// Use this UID if plugin is PwrPlugin:
+const TUid KSamplerPwrPluginUid = { 0x2001E5B9 };
+
+/*
+ *
+ * class CPwrPlugin implementation
+ * 
+ */
+ 
+CPwrPlugin* CPwrPlugin::NewL(const TUid /*aImplementationUid*/, TAny* aInitParams)
+    {
+    LOGTEXT(_L("CPwrPlugin::NewL() - entry"));
+    CPwrPlugin* self = new (ELeave) CPwrPlugin();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    LOGTEXT(_L("CPwrPlugin::NewL() - exit"));
+    return self;
+    }
+
+CPwrPlugin::CPwrPlugin() :
+    iVersionDescriptor(&(this->iVersion[1]),0,19),
+    iSamplerType(PROFILER_USER_MODE_SAMPLER)
+    {
+    iPeriod = 250;
+    iSamplerId = PROFILER_PWR_SAMPLER_ID;
+    iEnabled = EFalse;
+    iPowerListener = NULL;
+    LOGTEXT(_L("CPwrPlugin::CPwrPlugin() - konstruktori"));
+
+    }
+
+void CPwrPlugin::ConstructL() 
+    {
+    LOGTEXT(_L("CPwrPlugin::ConstructL() - entry"));
+    // initiate sampler attributes array
+    iSamplerAttributes = new(ELeave) CArrayFixFlat<TSamplerAttributes>(1); // only one sampler
+
+    // insert default attributes to array
+    InitiateSamplerAttributesL();
+
+    LOGTEXT(_L("CPwrPlugin::ConstructL() - exit"));
+    }
+
+CPwrPlugin::~CPwrPlugin()
+    {
+    LOGTEXT(_L("CPwrPlugin::~CPwrPlugin() - entry"));
+    if(iPowerListener)
+        {
+        if(Enabled())
+            {
+            iPowerListener->Stop();
+            }
+        delete iPowerListener;
+        iPowerListener = NULL;
+        }
+
+    if(iSamplerAttributes)
+        {
+        iSamplerAttributes->Reset();
+        delete iSamplerAttributes;
+        iSamplerAttributes = NULL;
+        }
+
+    LOGTEXT(_L("CPwrPlugin::~CPwrPlugin() - exit"));
+    }
+
+TUid CPwrPlugin::Id(TInt /*aSubId*/) const
+    {
+    LOGSTRING2( "CPwrPlugin::Id():0x%X", KSamplerPwrPluginUid.iUid );
+    return KSamplerPwrPluginUid;
+    }
+
+void CPwrPlugin::InitiateSamplerAttributesL()
+    {
+    // create TSamplerAttributes
+    TSamplerAttributes attr(KSamplerPwrPluginUid.iUid,
+            KPWRShortName(),
+            KPWRLongName(),
+            KPWRDescription(),
+            250,
+            EFalse,
+            EFalse,
+            0); 
+    this->iSamplerAttributes->AppendL(attr);
+    }
+
+void CPwrPlugin::SetEnabled(TBool aEnabled)
+    {
+    iEnabled = aEnabled;
+    }
+
+// returns setting array
+void CPwrPlugin::GetAttributesL(CArrayFixFlat<TSamplerAttributes>* aAttributes)
+    {
+    aAttributes->AppendL(iSamplerAttributes->At(0));
+    }
+
+TInt CPwrPlugin::SetAttributesL(TSamplerAttributes aAttributes)
+    {
+    TSamplerAttributes attr;
+
+    attr = iSamplerAttributes->At(0);
+    // replace the old attribute container
+    iSamplerAttributes->Delete(0);
+    iSamplerAttributes->InsertL(0, aAttributes);
+    return KErrNone;
+    }
+
+/* 
+ * Method for parsing and transforming text array settings into TSamplerAttributes (per each sub sampler),
+ * called by CSamplerController class
+ * 
+ * @param array of raw text setting lines, e.g. [gpp]\nenabled=true\nsampling_period_ms=1\n
+ */
+TInt CPwrPlugin::ConvertRawSettingsToAttributes(CDesC8ArrayFlat* aAllSettingsArray)
+    {
+    // local literals
+    _LIT8(KPWRShort, "pwr");
+
+    TInt err(KErrNone);
+    TBuf8<16> samplerSearchName;
+    samplerSearchName.Copy(KPWRShort);
+
+    // get sampler specific settings  
+    err = DoSetSamplerSettings(aAllSettingsArray, samplerSearchName, 0);
+
+    // returns KErrNone if settings found, otherwise KErrNotFound
+    return err;
+    }
+
+TInt CPwrPlugin::DoSetSamplerSettings(CDesC8ArrayFlat* aAllSettings, TDesC8& aSamplerName, TInt aIndex)
+    {
+    // 
+    TBuf8<16> samplerSearch;
+    samplerSearch.Copy(KBracketOpen);
+    samplerSearch.Append(aSamplerName);
+    samplerSearch.Append(KBracketClose);
+
+    // read a line
+    for (TInt i(0); i<aAllSettings->MdcaCount(); i++)
+        {
+        // check if this line has a setting block start, i.e. contains [xxx] in it
+        if (aAllSettings->MdcaPoint(i).CompareF(samplerSearch) == 0)
+            {
+            // right settings block found, now loop until the next block is found
+            for(TInt j(i+1);j<aAllSettings->MdcaCount();j++)
+                {
+                // check if the next settings block was found
+                if(aAllSettings->MdcaPoint(j).Left(1).CompareF(KBracketOpen) != 0)
+                    {
+                    // save found setting value directly to its owners attributes
+                    SaveSettingToAttributes(aAllSettings->MdcaPoint(j), aIndex);
+                    }
+                else
+                    {
+                    // next block found, return KErrNone
+                    return KErrNone;
+                    }
+                }
+            }
+        }
+
+    return KErrNotFound;
+    }
+
+/**
+ * Method for setting a specific descriptor (from settings file) to attribute structure
+ * 
+ * @param aSetting  
+ * @param aName  
+ */
+void CPwrPlugin::SaveSettingToAttributes(const TDesC8& aSetting, TInt aIndex)
+    {
+    // find the equal mark from the setting line
+    TInt sepPos = aSetting.Find(KSettingItemSeparator);
+    // check that '=' is found
+    if (sepPos > 0)
+        {
+        // check that the element matches
+        if (aSetting.Left(sepPos).CompareF(KEnabled) == 0)
+            {
+            TBool en;
+            CSamplerPluginInterface::Str2Bool(aSetting.Right(aSetting.Length()-sepPos-1), en);
+            if(en != iSamplerAttributes->At(aIndex).iEnabled)
+                {
+                iSamplerAttributes->At(aIndex).iEnabled = en;
+                }
+            }
+        else if (aSetting.Left(sepPos).CompareF(KSamplingPeriodMs) == 0)
+            {
+            TInt sr;
+            CSamplerPluginInterface::Str2Int(aSetting.Right(aSetting.Length()-sepPos-1), sr);
+            if(sr != iSamplerAttributes->At(aIndex).iSampleRate)
+                {
+                iSamplerAttributes->At(aIndex).iSampleRate = sr;
+                }
+            }
+        }
+    }
+
+TInt CPwrPlugin::GetSamplerType()
+    {
+    return iSamplerType;
+    }
+
+TInt CPwrPlugin::ResetAndActivateL(CProfilerSampleStream& aStream) 
+    {
+    LOGTEXT(_L("CPwrPlugin::ResetAndActivate() - entry"));
+    // check if sampler enabled
+    if(iSamplerAttributes->At(0).iEnabled)
+        {
+        // create a new listener instance for every trace, destroy it on stop
+        iPowerListener = CProfilerPowerListener::NewL(this);
+
+        iStream = &aStream;
+        TInt length = this->CreateFirstSample();
+        iVersion[0] = (TUint8)length;
+        LOGSTRING2("CPwrPlugin::ResetAndActivate() - AddSample, length %d", length);
+        TInt ret = this->AddSample(iVersion, length+1, 0);
+
+        LOGSTRING2("CPwrPlugin::ConstructL() - sampling period %d", this->iPeriod);
+
+        HBufC8* iBufRes = HBufC8::NewMaxLC(10);
+        TPtr8 iPtrRes = iBufRes->Des();
+
+        // check if sampling rate set to something reasonable, relevant only in SYNC case
+        if(iSamplerAttributes->At(0).iSampleRate != -1)
+            {
+            iPtrRes.Num(iSamplerAttributes->At(0).iSampleRate);
+            }
+        else
+            {
+            iPtrRes.Append(KNullDesC8);
+            }
+
+        // set disabled
+        SetEnabled(ETrue); 
+
+        // activate power listener
+        ret = iPowerListener->StartL(iPtrRes);
+        LOGTEXT(_L("CPwrPlugin::ResetAndActivate() - exit"));
+
+        CleanupStack::PopAndDestroy();
+        
+        if(ret != KErrNone)
+            return ret;
+        }
+    return KErrNone;
+    }
+
+TInt CPwrPlugin::CreateFirstSample() 
+    {
+    LOGTEXT(_L("CPwrPlugin::CreateFirstSample - entry"));
+    this->iVersionDescriptor.Zero();
+    this->iVersionDescriptor.Append(_L8("Bappea_PWR_V"));
+    this->iVersionDescriptor.Append(PROFILER_PWR_SAMPLER_VERSION);
+    LOGTEXT(_L("CPwrPlugin::CreateFirstSample - exit"));
+    return (TInt)(this->iVersionDescriptor.Length());
+    }
+
+TInt CPwrPlugin::StopSampling() 
+    {
+    if(iPowerListener)
+        {
+        iPowerListener->Stop();
+        delete iPowerListener;
+        iPowerListener = NULL;
+        }
+
+    // set disabled
+    SetEnabled(EFalse);
+
+    return KErrNone;
+    }
+
+
+/*
+ *
+ * class CProfilerPowerListener implementation
+ * 
+ */
+
+CProfilerPowerListener::CProfilerPowerListener(CPwrPlugin* aSampler) :
+    iPwrSamplingPeriod(0),
+    iOriginalReportingPeriod(0),
+    iNominalCapa(0),
+    iVoltage(0), 
+    iCurrent(0),
+    iPowerAPI(0)
+#ifdef PWR_SAMPLER_BACKLIGHT
+    ,iLightAPI(0),
+    iBackLightStatus(CHWRMLight::ELightStatusUnknown)
+#endif
+
+    {
+    LOGTEXT(_L("CProfilerPowerListener::CProfilerPowerListener() - konstuktori"));
+    this->iSampler = aSampler;
+    LOGTEXT(_L("CProfilerPowerListener::CProfilerPowerListener() - konstuktori exit"));
+    }
+
+CProfilerPowerListener* CProfilerPowerListener::NewL(CPwrPlugin* aSampler)
+    {
+    LOGTEXT(_L("CProfilerPowerListener::NewL() - entry"));
+    CProfilerPowerListener* self = new (ELeave) CProfilerPowerListener(aSampler);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    LOGTEXT(_L("CProfilerPowerListener::NewL() - exit"));
+    return self;
+    }
+
+void CProfilerPowerListener::ConstructL()
+    {
+    LOGTEXT(_L("CProfilerPowerListener::ConstructL() - entry"));
+    iSampleStartTime = 0;
+    LOGTEXT(_L("CProfilerPowerListener::ConstructL() - exit"));
+    }
+
+CProfilerPowerListener::~CProfilerPowerListener() 
+    {
+    LOGTEXT(_L("CProfilerPowerListener::~CProfilerPowerListener() - entry"));
+
+    if (iPowerAPI)
+        {
+        delete iPowerAPI;
+        iPowerAPI = 0;
+        }
+#ifdef PWR_SAMPLER_BACKLIGHT
+    if (iLightAPI)
+        {
+        delete iLightAPI;
+        iLightAPI = 0;
+        }
+#endif
+
+    LOGTEXT(_L("CProfilerPowerListener::~CProfilerPowerListener() - exit"));
+    }
+
+TInt CProfilerPowerListener::DisplayNotifierL(const TDesC& aLine1, const TDesC& aLine2, const TDesC& aButton1, const TDesC& aButton2)
+    {
+    RNotifier notifier;
+    TRequestStatus stat;
+
+    TInt buttonValue(0);
+
+    User::LeaveIfError(notifier.Connect());
+
+    notifier.Notify(aLine1, aLine2, aButton1, aButton2, buttonValue, stat);
+    User::WaitForRequest(stat);
+
+    notifier.Close();
+    return buttonValue;
+    }
+
+
+TInt CProfilerPowerListener::StartL(const TDesC8& aBuf)
+    {
+    LOGTEXT(_L("CProfilerPowerListener::StartL() - entry"));
+
+    // get the property value
+    TInt r = RProperty::Get(KGppPropertyCat, EGppPropertySyncSampleNumber, iSampleStartTime);
+    if(r != KErrNone)
+        {
+        LOGSTRING2("CProfilerPowerListener::StartL() - getting iSyncOffset failed, error %d", r);
+        }
+
+   // check if given sampling period is valid
+    if(aBuf.CompareF(KNullDesC8)!= 0)
+        {
+        TLex8* lex = new TLex8(aBuf);
+        lex->Val(iPwrSamplingPeriod);
+        delete lex;
+        }
+    else
+        {
+        // set default period
+        iPwrSamplingPeriod = 250;
+        }
+
+    // Check that sampling period is in allowed range
+    if (KMinSampleInterval > 0 && iPwrSamplingPeriod < KMinSampleInterval)
+        {
+        iPwrSamplingPeriod = KMinSampleInterval;
+        }
+
+    LOGSTRING2("CProfilerPowerListener::StartL() - Sampling period %d", iPwrSamplingPeriod);
+
+    // Start monitoring voltage and current
+    iPowerAPI = CHWRMPower::NewL();
+    iPowerAPI->SetPowerReportObserver(this);
+
+    // Read HWRM reporting settings from central repository
+    CRepository* centRep = CRepository::NewL(KCRUidPowerSettings);
+    TInt baseInterval(0);
+    User::LeaveIfError(centRep->Get(KPowerBaseTimeInterval, baseInterval));
+    User::LeaveIfError(centRep->Get(KPowerMaxReportingPeriod, iOriginalReportingPeriod));
+
+    LOGSTRING2("CProfilerPowerListener::StartL() - HWRM base power report interval: %d", baseInterval);
+    LOGSTRING2("CProfilerPowerListener::StartL() - Original HWRM max power reporting period: %d", iOriginalReportingPeriod);
+
+    User::LeaveIfError(centRep->Set(KPowerMaxReportingPeriod, KReportingPeriodInfinite));
+
+    // Power reporting interval reading may return too low value sometimes. Minimum value expected to be 250ms.
+    if ( baseInterval < KMinSampleInterval )
+        {
+        baseInterval = KMinSampleInterval;
+        LOGSTRING2("CProfilerPowerListener::StartL() - Power report interval too low. Changed to: %d", baseInterval);
+        }
+
+    // Power reporting period is multiplier of HWRM base period
+    TInt intervalMultiplier = iPwrSamplingPeriod / baseInterval;
+
+    if (intervalMultiplier < 1)
+        {
+        intervalMultiplier = 1;
+        }
+
+    LOGSTRING2("CProfilerPowerListener::StartL() - Reporting period multiplier: %d", intervalMultiplier);
+
+    TRequestStatus status(KRequestPending);
+    iPowerAPI->StartAveragePowerReporting(status, intervalMultiplier);
+    User::WaitForRequest(status);
+
+    if (status.Int() != KErrNone)
+        {
+        LOGTEXT(_L("CProfilerPowerListener::StartL() - Failed to initialize power reporting"));
+
+        DisplayNotifierL(KPowerTextLine1, KPowerTextLine2, KButtonOk, KNullDesC);
+
+        return status.Int();
+        }
+
+#ifdef PWR_SAMPLER_BACKLIGHT
+    // Start monitoring backlight status
+    iLightAPI = CHWRMLight::NewL(this);
+#endif
+
+    LOGTEXT(_L("CProfilerPowerListener::StartL() - exit"));
+    return KErrNone;
+    }
+
+void CProfilerPowerListener::Sample()
+    {
+    LOGTEXT(_L("CProfilerPowerListener::Sample() - entry"));
+
+    TRequestStatus status;
+    CHWRMPower::TBatteryConsumptionData consumptionData;
+
+    iPowerAPI->GetBatteryInfo(status, consumptionData);
+    User::WaitForRequest(status);
+
+    // Data is valid only if status == KErrNone 
+    if (status.Int() != KErrNone)
+        {
+        LOGSTRING2("CProfilerPowerListener::Sample() - Getting battery info failed with code: ", status.Int());
+        iNominalCapa = 0;
+        }
+    else
+        {
+        iNominalCapa = consumptionData.iNominalCapacity;
+        }
+
+    // Space for GPP sample time        
+    //TUint32 sampleTime = iSampler->iStream->iSampler->GetSampleTime();
+    TUint32 sampleTime = User::NTickCount() - iSampleStartTime;
+    LOGSTRING2("CProfilerPowerListener::Sample() - Sample time: %d", sampleTime);
+    LOGSTRING2("CProfilerPowerListener::Sample() - Nominal capacitance: %d", iNominalCapa);
+    LOGSTRING2("CProfilerPowerListener::Sample() - Voltage: %d", iVoltage);
+    LOGSTRING2("CProfilerPowerListener::Sample() - Current: %d", iCurrent);
+#ifdef PWR_SAMPLER_BACKLIGHT
+    LOGSTRING2("CProfilerPowerListener::Sample() - Backlight status: %d", (TUint8)iBackLightStatus);
+#endif
+
+    iSample[0] = iNominalCapa;
+    iSample[1] = iNominalCapa >> 8;
+    iSample[2] = iVoltage;
+    iSample[3] = iVoltage >> 8;
+    iSample[4] = iCurrent;
+    iSample[5] = iCurrent >> 8;
+    iSample[6] = iCurrent >> 16;
+    iSample[7] = iCurrent >> 24;
+#ifdef PWR_SAMPLER_BACKLIGHT
+    iSample[8] = (TUint8)iBackLightStatus;
+    iSample[9] = sampleTime;
+    iSample[10] = sampleTime >> 8;
+    iSample[11] = sampleTime >> 16;
+    iSample[12] = sampleTime >> 24;
+
+    iSampler->AddSample(iSample, 13, 0);
+#else
+    iSample[8] = sampleTime;
+    iSample[9] = sampleTime >> 8;
+    iSample[10] = sampleTime >> 16;
+    iSample[11] = sampleTime >> 24;
+
+    iSampler->AddSample(iSample, 12, 0);
+#endif
+
+    LOGTEXT(_L("CProfilerPowerListener::Sample() - exit"));
+    }
+
+TInt CProfilerPowerListener::Stop() 
+    {
+    LOGTEXT(_L("CProfilerPowerListener::Stop() - entry"));
+
+    if (iPowerAPI)
+        {
+        TRAPD(err, iPowerAPI->StopAveragePowerReportingL());
+        if(err != KErrNone)
+            {
+            LOGSTRING2("CProfilerPowerListener::Stop() - Failed to stop power reporting: %d", err);
+            }
+        else
+            {
+            LOGTEXT(_L("CProfilerPowerListener::Stop() - Stopped power monitoring"));
+            }
+        delete iPowerAPI;
+        iPowerAPI = 0;
+
+        // Restore original value to max sampling period
+        CRepository* centRep = 0;
+        TRAP(err, centRep = CRepository::NewL(KCRUidPowerSettings));
+        if (err != KErrNone)
+            {
+            LOGSTRING2("CProfilerPowerListener::Stop() - Failed to open Central Repository: %d", err);
+            }
+        else
+            {
+            err = centRep->Set(KPowerMaxReportingPeriod, iOriginalReportingPeriod);
+            if(err != KErrNone)
+                {
+                LOGSTRING2("CProfilerPowerListener::Stop() - Failed to restore max sampling period: %d", err);
+                }
+            }
+        }
+#ifdef PWR_SAMPLER_BACKLIGHT
+    if (iLightAPI)
+        {
+        delete iLightAPI;
+        iLightAPI = 0;
+        }
+#endif
+
+    LOGTEXT(_L("CProfilerPowerListener::Stop() - exit"));
+    return KErrNone;
+    }
+
+void CProfilerPowerListener::PowerMeasurement(TInt aErr, CHWRMPower::TBatteryPowerMeasurementData& aMeasurement)
+    {
+    LOGTEXT(_L("CProfilerPowerListener::PowerMeasurement - entry"));
+
+    if (aErr == KErrNone)
+        {
+        LOGSTRING3("CProfilerPowerListener::PowerMeasurement - Previous values - Voltage: %d Current: %d", iVoltage, iCurrent);
+        iVoltage = aMeasurement.iAverageVoltage;
+        iCurrent = aMeasurement.iAverageCurrent;
+        LOGSTRING3("CProfilerPowerListener::PowerMeasurement - New values - Voltage: %d Current: %d", iVoltage, iCurrent);
+
+        this->Sample();
+        }
+    else
+        {
+        LOGSTRING2("CProfilerPowerListener::PowerMeasurement - Failed with error code: %d", aErr);
+        DisplayNotifierL(KPowerTextLine1, KPowerTextErrorSampling, KButtonOk, KNullDesC);
+        }
+    LOGTEXT(_L("CProfilerPowerListener::PowerMeasurement - exit"));
+    }
+
+#ifdef PWR_SAMPLER_BACKLIGHT
+void CProfilerPowerListener::LightStatusChanged(TInt aTarget, CHWRMLight::TLightStatus aStatus)
+    {
+    LOGTEXT(_L("CProfilerPowerListener::LightStatusChanged - entry"));
+    LOGSTRING3("CProfilerPowerListener::LightStatusChanged - Target: %d Status: %d", aTarget, aStatus);
+
+    if (aTarget == CHWRMLight::EPrimaryDisplay)
+        {
+        LOGSTRING2("CProfilerPowerListener::LightStatusChanged - Previous light status: %d", iBackLightStatus);
+        iBackLightStatus = aStatus;
+        LOGSTRING2("CProfilerPowerListener::LightStatusChanged - New light status: %d", iBackLightStatus);
+
+        this->Sample();
+        }
+    LOGTEXT(_L("CProfilerPowerListener::LightStatusChanged - exit"));
+    }
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piprofiler/plugins/PWRplugin/src/PwrPluginImplementationTable.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* 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:  
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <ecom/implementationproxy.h>
+
+#include "PwrPlugin.h"
+
+
+// Provides a key value pair table, this is used to identify
+// the correct construction function for the requested interface.
+const TImplementationProxy ImplementationTable[] =
+{
+         IMPLEMENTATION_PROXY_ENTRY(0x2001E5B9,  CPwrPlugin::NewL),
+};
+
+// Function used to return an instance of the proxy table.
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+{
+    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+    return ImplementationTable;
+}
+
--- a/piprofiler/rom/piprofiler.iby	Thu Aug 19 11:25:43 2010 +0300
+++ b/piprofiler/rom/piprofiler.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -22,11 +22,11 @@
 // PI Profiler Engine itself 
 file=ABI_DIR\BUILD_DIR\PIProfilerEngine.exe						sys\bin\PIProfilerEngine.exe
 file=ABI_DIR\BUILD_DIR\PIProfiler.exe							sys\bin\PIProfiler.exe
-data=ZSYSTEM\Install\PIProfiler_stub.sis						system\install\PIProfiler_stub.sis
 
 // sampler plugins
 // NOTE: Mandatory kernel driver included in piprofiler_ldd.iby
 ECOM_PLUGIN(PIProfilerGenerals.dll, PIProfilerGenerals.rsc)
+ECOM_PLUGIN(PIProfilerPWR.dll, PIProfilerPWR.rsc)
 
 ECOM_PLUGIN(PIProfilerBUP.dll, PIProfilerBUP.rsc)
 file=ABI_DIR\BUILD_DIR\PIProfilerTouchEventAnim.dll				sys\bin\PIProfilerTouchEventAnim.dll
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piprofiler/rom/piprofiler_s2.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -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:  
+*
+*/
+
+
+#ifndef __PIPROFILER__
+#define __PIPROFILER__
+
+// PI Profiler Engine itself 
+file=ABI_DIR\BUILD_DIR\PIProfilerEngine.exe						sys\bin\PIProfilerEngine.exe
+file=ABI_DIR\BUILD_DIR\PIProfiler.exe							sys\bin\PIProfiler.exe
+
+// sampler plugins
+// NOTE: Mandatory kernel driver included in piprofiler_ldd.iby
+ECOM_PLUGIN(PIProfilerGenerals.dll, PIProfilerGenerals.rsc)
+
+ECOM_PLUGIN(PIProfilerBUP.dll, PIProfilerBUP.rsc)
+file=ABI_DIR\BUILD_DIR\PIProfilerTouchEventAnim.dll				sys\bin\PIProfilerTouchEventAnim.dll
+
+// Writer plugins
+ECOM_PLUGIN(piprofilerdebugwriter.dll, piprofilerdebugwriter.rsc)
+ECOM_PLUGIN(piprofilerdiskwriter.dll, piprofilerdiskwriter.rsc)
+
+#endif //__PIPROFILER__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piprofiler/symbian_version.hrh	Tue Aug 31 16:45:49 2010 +0300
@@ -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: Symbian version configuration file 
+*
+*/
+
+#ifndef __SYMBIAN_VERSION_HRH
+#define __SYMBIAN_VERSION_HRH
+
+// S60 and Symbian version number enumeration definitions
+
+#define S60_30                                              30
+#define S60_31                                              31
+#define S60_32                                              32
+#define S60_50                                              50
+#define S60_51                                              91
+#define S60_52                                              92
+#define SYMBIAN_1                                           50
+#define SYMBIAN_2                                           91
+#define SYMBIAN_3                                           92
+#define SYMBIAN_4                                           101
+
+
+/**
+ * Defines the S60 or Symbian version used by this component. This flag can be
+ * used to variate the source code based on the SDK in use. The value of the
+ * flag should be always changed to reflect the current build environment.
+ */
+#define SYMBIAN_VERSION_SUPPORT                              SYMBIAN_4
+
+
+#endif  // __SYMBIAN_VERSION_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -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: 
+*
+* TraceCompiler
+*/
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXPORTS
+../tracecompiler/tracecompiler.pl 			+/tools/ //
+../tracecompiler/tracecompiler.pm 			+/tools/ //
+../tracecompiler/tracecompiler_parse_mmp.pl 		+/tools/ //
+../tracecompiler/tracecompiler_mmp_data.pm		+/tools/ //
+	
+
+:zip ../tracecompiler/tracecompiler.zip +/tools/tracecompiler overwrite//
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/group/build.xml	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,119 @@
+<!--
+#
+# Copyright (c) 2008-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 name="OstTraceCompiler" default="build" basedir="..">
+
+<condition property="isLinux">
+    <os name="linux"/>
+</condition>
+
+<condition property="isWindows">
+	<not>
+		<os name="linux"/>
+	</not>
+</condition>
+	
+<condition property="isRel">
+	<matches string="${epoc.rel}" pattern="^.*rel$"/>
+</condition>
+	
+<condition property="isDeb">
+	<matches string="${epoc.rel}" pattern="^.*deb$"/>
+</condition>
+
+	
+<target name="init" >
+	<property environment="env" />
+	<property name="epoc.root" value="${env.EPOCROOT}/" />
+	<property name="src.dir" value="src" />
+	<property name="jar.dir" value="jar" />
+	<property name="dest.dir" value="${tools.rel}/tracecompiler" />
+	<property name="build.dir" value="${epoc.root}epoc32/build/ost/tracecompiler" />
+</target>
+
+
+<target name="clean" depends="init" if="isRel">
+	<echo>Cleaning the ${build.dir}</echo>
+	<delete dir="${build.dir}"/>
+	<echo>Creating the build directory</echo>
+	<mkdir dir="${build.dir}"/>
+	
+	<echo>Deleting *.xml_ files</echo>
+	<delete>
+		<fileset dir="${epoc.root}epoc32/build" includes="**/*.xml_"/>
+	</delete>
+    <delete dir="${dest.dir}"/>
+    <delete file="tracecompiler/tracecompiler.zip"/>
+</target>
+
+	
+<target name="what" depends="init" description="Prints out all releasables">
+	<pathconvert pathsep="${line.separator}" property="output">
+		<fileset dir="${dest.dir}" casesensitive="no"/>
+	</pathconvert>
+	<echo message="${output}" />
+</target>
+
+
+<target name="build" if="isRel" depends="clean">	
+	<javac srcdir="${src.dir}" destdir="${build.dir}" debug="true" target="1.5"></javac>
+
+	<echo> Copying html and properties files from src/com.nokia.tracecompiler/src to ${build.dir} </echo>
+	<copy todir="${build.dir}">
+		<fileset dir="src/com.nokia.tracecompiler/src" includes="**/*.properties"/>
+		<fileset dir="src/com.nokia.tracecompiler/src" includes="**/*.html"/>
+        <fileset dir="src/com.nokia.tracecompiler/src" includes="**/*.lic"/>
+	</copy>
+
+	<antcall target="change_windows_file_attributes"></antcall>
+
+	<antcall target="change_linux_file_attributes"></antcall>
+
+	<echo>Zip TraceCompiler binaries</echo>
+	<zip destfile="tracecompiler/tracecompiler.zip" update="true">
+		<zipfileset dir="${build.dir}"/> 
+	</zip>
+	
+	<echo>Unzip recompiled TraceCompiler binaries intop epoc32/tools/tracecompiler</echo>
+	<unzip src="tracecompiler/tracecompiler.zip" dest="${dest.dir}" overwrite="true"/>
+
+	<mkdir dir="${jar.dir}"/>
+       	<jar destfile="${jar.dir}/tracecompiler.jar" basedir="${build.dir}">
+       		<fileset dir="src/com.nokia.tracecompiler/src" includes="**/*.properties"/>
+       		<manifest>
+       			<attribute name="Main-Class" value="com.nokia.tracecompiler.TraceCompilerMain"/>
+       		</manifest>
+        </jar>
+</target>
+
+<target name="change_windows_file_attributes" if="isWindows">
+	<echo message="Change tracecompiler.zip file attributes in Windows"/>
+	<exec executable="attrib">
+		<arg value="-r"/>
+		<arg value="tracecompiler/tracecompiler.zip"/>
+	</exec>
+</target>
+
+<target name="change_linux_file_attributes" if="isLinux">
+	<echo message="Change tracecompiler.zip file attributes in Linux"/>
+	<exec executable="chmod">
+		<arg value="777"/>
+		<arg value="tracecompiler/tracecompiler.zip"/>
+	</exec>
+</target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/.classpath	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="bin"/>	
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/.project	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.tracecompiler</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.jem.beaninfo.BeanInfoNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/.settings/org.eclipse.core.resources.prefs	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,8 @@
+#Fri Sep 04 14:04:36 BST 2009
+eclipse.preferences.version=1
+encoding//src/com/nokia/tracecompiler/autogen/messages.properties=8859_1
+encoding//src/com/nokia/tracecompiler/dictionary/messages.properties=8859_1
+encoding//src/com/nokia/tracecompiler/engine/header/messages.properties=8859_1
+encoding//src/com/nokia/tracecompiler/engine/messages.properties=8859_1
+encoding//src/com/nokia/tracecompiler/engine/project/messages.properties=8859_1
+encoding//src/com/nokia/tracecompiler/engine/rules/messages.properties=8859_1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/.settings/org.eclipse.jdt.core.prefs	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+#Tue Apr 14 13:07:47 EEST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.source=1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/.settings/org.eclipse.jdt.ui.prefs	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+#Tue Apr 14 13:07:47 EEST 2009
+eclipse.preferences.version=1
+internal.default.compliance=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/about.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body>
+
+<h2>About This Content</h2>
+ 
+<p>February 4, 2009</p>	
+
+<h3>Copyright</h3>
+<p>Copyright &copy; 2007-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.<br>
+This component and the accompanying materials are made available under the <br/>
+terms of the License "Symbian Foundation License v1.0" which accompanies this <br/>
+distribution, and is available at the URL: <a href="http://www.symbianfoundation.org/legal/sfl-v10.html">http://www.symbianfoundation.org/legal/sfl-v10.html</a>.<p>
+
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/build.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,2 @@
+source.. = src/
+output.. = bin/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/Messages.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2010 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:
+ *
+ ** Localization for tracecompiler package
+ *
+ */
+package com.nokia.tracecompiler;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+@SuppressWarnings("all")
+public final class Messages {
+
+	/**
+	 * Bundle name
+	 */
+	private static final String BUNDLE_NAME = "com.nokia.tracecompiler.messages"; //$NON-NLS-1$
+
+	/**
+	 * Bundle
+	 */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Prevents construction
+	 */
+	private Messages() {
+	}
+
+	/**
+	 * Gets localized string based on key
+	 * 
+	 * @param key
+	 *            the resource key
+	 * @return the localized resource
+	 */
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompiler.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,758 @@
+/*
+ * Copyright (c) 2010 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:
+ *
+ * TraceCompiler command-line main class
+ *
+ */
+package com.nokia.tracecompiler;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import com.nokia.tracecompiler.document.FileDocumentMonitor;
+import com.nokia.tracecompiler.document.StringDocumentFactory;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineEvents;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineInterface;
+import com.nokia.tracecompiler.engine.TraceLocationList;
+import com.nokia.tracecompiler.engine.project.ProjectEngine;
+import com.nokia.tracecompiler.engine.utils.TraceUtils;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.plugin.TraceCompilerPlugin;
+import com.nokia.tracecompiler.project.GroupNames;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SymbianConstants;
+import com.nokia.tracecompiler.utils.DocumentFactory;
+import com.nokia.tracecompiler.utils.TraceCompilerVersion;
+
+/**
+ * TraceCompiler command-line main class
+ * 
+ */
+public class TraceCompiler {
+	
+	private static String LINE_SEPARATOR =  System.getProperty("line.separator"); //$NON-NLS-1$
+
+	/**
+	 * Index of third character
+	 */
+	private static final int INDEX_OF_THIRD_CHARACTER = 2;
+
+	/**
+	 * Index of first character
+	 */
+	private static final int INDEX_OF_FIRST_CHARACTER = 0;
+
+	/**
+	 * Version option
+	 */
+	private static final String VERSION_OPTION = "--version"; //$NON-NLS-1$
+	private static final String LEGACY_VERSION_OPTION = "-version"; //$NON-NLS-1$
+	private static final String VERSION_OPTION_SF = "-v"; //$NON-NLS-1$
+	/**
+	 * Version option instruction text
+	 */
+	private static final String VERSION_OPTION_INSTRUCTION_TEXT = "print TraceCompiler version"; //$NON-NLS-1$
+
+	
+	/**
+	 * help option
+	 */
+	private static final String HELP_OPTION = "--help"; //$NON-NLS-1$
+	private static final String HELP_OPTION_SF = "-h"; //$NON-NLS-1$
+	private static final String HELP_OPTION_INSTRUCTION_TEXT = "print help"; //$NON-NLS-1$
+	
+	/**
+	 * Verbose option
+	 */
+	private static final String VERBOSE_OPTION = "--verbose"; //$NON-NLS-1$
+	private static final String VERBOSE_OPTION_SF = "-vb"; //$NON-NLS-1$
+	/**
+	 * Verbose option instruction text
+	 */
+	private static final String VERBOSE_OPTION_INSTRUCTION_TEXT = "print info messages."; //$NON-NLS-1$
+
+	/**
+	 * keep going option
+	 */
+	private static final String STOP_ON_ERROR_OPTION = "--stopOnError"; //$NON-NLS-1$
+	private static final String STOP_ON_ERROR_OPTION_SF = "-soe"; //$NON-NLS-1$
+	/**
+	 * keep going option instruction text
+	 */
+	private static final String STOP_ON_ERROR_OPTION_INSTRUCTION_TEXT = "On error, stop at the end of the compilation unit."; //$NON-NLS-1$
+
+	
+
+	/**
+	 * Version text
+	 */
+	private static final String VERSION_TEXT = "TraceCompiler version "; //$NON-NLS-1$
+
+	/**
+	 * Option instruction text
+	 */
+	private static final String OPTION_INSTRUCTION_TEXT = "Options:"; //$NON-NLS-1$
+
+	
+	private static final String USAGE = "Usage: " + LINE_SEPARATOR + //$NON-NLS-1$
+										"tracecompiler [options] Component_UID [Component_name MMP_path source_file...]" + LINE_SEPARATOR + //$NON-NLS-1$
+										"\t" + OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR + //$NON-NLS-1$
+										"\t" + HELP_OPTION_SF  + ", " + HELP_OPTION + ", " + HELP_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+										"\t" + VERSION_OPTION_SF + ", " + VERSION_OPTION + ", " + LEGACY_VERSION_OPTION + "\t" +  VERSION_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ //$NON-NLS-4$
+										"\t" + VERBOSE_OPTION_SF + ", " + VERBOSE_OPTION + "\t\t" + VERBOSE_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
+										"\t" + STOP_ON_ERROR_OPTION_SF + ", " + STOP_ON_ERROR_OPTION + "\t" + STOP_ON_ERROR_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR;  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
+
+
+
+	/**
+	 * End of source files tag
+	 */
+	private static final String ENDOFSOURCEFILES = "*ENDOFSOURCEFILES*"; //$NON-NLS-1$
+	
+
+	/**
+	 * Offset to UID
+	 */
+	private static final int COMPONENT_UID_ARG = 0;
+
+	/**
+	 * Offset to component name
+	 */
+	private static final int COMPONENT_NAME_ARG = 1;
+
+	/**
+	 * Offset to MMP path
+	 */
+	private static final int COMPONENT_MMP_PATH_ARG = 2; // CodForChk_Dis_Magic
+
+	/**
+	 * Offset to source files
+	 */
+	private static final int SOURCE_FILE_START_OFFSET = 3; // CodForChk_Dis_Magic
+
+	/**
+	 * Number of arguments
+	 */
+	private static final int MANDATORY_ARGUMENT_COUNT = 1;
+
+	/**
+	 * MMP file extension
+	 */
+	private static final String MMP = ".mmp"; //$NON-NLS-1$
+
+	/**
+	 * Underscore character
+	 */
+	private static final String UNDERSCORE = "_"; //$NON-NLS-1$
+
+	/**
+	 * Name of the trace folder that include component name
+	 */
+	private String traceFolderName;
+
+	/**
+	 * Decode plugins path
+	 */
+	private String DECODE_PLUGINS_PATH = "com/nokia/tracecompiler/decodeplugins"; //$NON-NLS-1$
+
+	/**
+	 * Decode plugin name tag
+	 */
+	private String DECODE_PLUGIN_NAME_TAG = "<DECODE_PLUGIN_NAME>"; //$NON-NLS-1$
+
+	/**
+	 * Decode plugin class name tag
+	 */
+	private String DECODE_PLUGIN_CLASS_NAME_TAG = "<DECODE_PLUGIN_CLASS_NAME>"; //$NON-NLS-1$
+
+	/**
+	 * Decode plugin engine class name template
+	 */
+	private String ENGINE_CLASS_NAME_TEMPLATE = DECODE_PLUGIN_NAME_TAG
+			+ "Engine"; //$NON-NLS-1$
+
+	/**
+	 * Decode plugin engine file name template
+	 */
+	private String ENGINE_FILE_NAME_TEMPLATE = DECODE_PLUGIN_CLASS_NAME_TAG
+			+ ".class"; //$NON-NLS-1$
+
+	/**
+	 * Decode plugins class template
+	 */
+	private String CLASS_TEMPLATE = "com.nokia.tracecompiler.decodeplugins." + DECODE_PLUGIN_NAME_TAG + "." + DECODE_PLUGIN_CLASS_NAME_TAG; //$NON-NLS-1$ //$NON-NLS-2$	
+
+	/**
+	 * Main function
+	 * 
+	 * @param args
+	 *            the command line arguments
+	 */
+	public static void main(String[] args) {
+		ArrayList<String> list = new ArrayList<String>(Arrays.asList(args));
+		long startTime = System.currentTimeMillis();
+		//create a new session of TraceCompiler
+		TraceCompiler console = new TraceCompiler();
+		
+		try {
+			console.parseCommandLine(list);
+		} catch (Exception e) { //should cover IOException and TraceCompilerIllegalArgumentsException
+			//There is no point to continue if there are problems with the arguments.
+			TraceCompilerLogger.printError(e.getMessage());
+			printUsage();
+			System.exit(1);
+		}
+		
+		boolean error = false;
+		try {
+			if(list.size() != 0) {
+				console.createPlugins();
+				console.start();
+				console.buildTraceFiles();
+				
+			}
+		} catch (Exception e) {
+			if (e instanceof TraceCompilerRootException) {
+				TraceCompilerLogger.printError(e.getMessage()); 
+			} //else the error should have been reported earlier
+			error = true;
+		} finally {
+			try {
+				if (!error) { //check if errors have been logged by EventEngine
+					TraceCompilerEngineEvents events = TraceCompilerEngineGlobals.getEvents();
+					if (events != null && events.hasErrorHappened()) {
+						error = true;
+					}
+				}
+				console.shutdown();
+			} catch (TraceCompilerException e) {
+				error = true;
+			}
+		}
+
+		if (console.componentName != null) {
+			TraceCompilerLogger.printMessage(console.componentName + " took " //$NON-NLS-1$
+					+ (System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
+		}
+		if (error) {
+			System.exit(1);
+		} else {
+			System.exit(0);
+		}	
+	}
+
+	/**
+	 * With Eclipse, the plug-ins are loaded by Eclipse framework. Here they
+	 * must be manually created and started
+	 */
+	private ArrayList<TraceCompilerPlugin> plugIns = new ArrayList<TraceCompilerPlugin>();
+
+	/**
+	 * Model listener
+	 */
+	private TraceCompilerModelListener modelListener;
+
+	/**
+	 * Name of the component
+	 */
+	private String componentName;
+
+	/**
+	 * UID of the component
+	 */
+	private long componentUID;
+
+	/**
+	 * Component path
+	 */
+	private String componentPath;
+
+	/**
+	 * MMP file path
+	 */
+	private File mmpPath;
+
+	/**
+	 * Constructor
+	 */
+	TraceCompiler() {
+
+		// Creates listeners and preferences
+		modelListener = new TraceCompilerModelListener();
+	}
+
+	/**
+	 * Creates the plug-ins to be registered with TraceCompiler
+	 * @throws TraceCompilerRootException if fail to create a valid plugins
+	 */
+	private void createPlugins() throws TraceCompilerRootException {
+		
+		// Get location of the TraceCompiler
+		URL path = getClass().getProtectionDomain().getCodeSource()
+				.getLocation();
+		String decodePluginsPath = path.getPath();
+
+		// If first character is forward slash and it is located before drive
+		// letter remove it
+		if (decodePluginsPath.charAt(INDEX_OF_FIRST_CHARACTER) == SourceConstants.FORWARD_SLASH_CHAR
+				&& decodePluginsPath.charAt(INDEX_OF_THIRD_CHARACTER) == SourceConstants.COLON_CHAR) {
+			decodePluginsPath = decodePluginsPath.substring(1);
+		}
+		
+		// Concatenate decode plugins path
+		decodePluginsPath = decodePluginsPath.concat(DECODE_PLUGINS_PATH);
+		
+		// Replace slashes with correct separator character
+		decodePluginsPath = decodePluginsPath.replace(
+				SourceConstants.FORWARD_SLASH_CHAR, File.separatorChar);
+		decodePluginsPath = decodePluginsPath.replace(
+				SourceConstants.BACKSLASH_CHAR, File.separatorChar);
+		File decodePluginsDir = new File(decodePluginsPath);
+		String[] decodePlugins = decodePluginsDir.list();
+		if (decodePlugins != null) {
+			for (int i = 0; i < decodePlugins.length; i++) {
+
+				// Get decode plugin name
+				String decodePluginName = decodePlugins[i];
+
+				// Get decode plugin path
+				String decodePluginPath = decodePluginsPath
+						+ File.separatorChar + decodePluginName;
+
+				// Decode plugin must be in own directory
+				Boolean isDirectory = (new File(decodePluginPath))
+						.isDirectory();
+				if (isDirectory) {
+
+					// Construct decode plugin engine class name
+					String engineClassName = ENGINE_CLASS_NAME_TEMPLATE
+							.replaceFirst(DECODE_PLUGIN_NAME_TAG,
+									decodePluginName.substring(0, 1)
+											.toUpperCase()
+											+ decodePluginName.substring(1));
+
+					// Construct decode plugin engine file name
+					String engineFileName = ENGINE_FILE_NAME_TEMPLATE
+							.replaceFirst(DECODE_PLUGIN_CLASS_NAME_TAG,
+									engineClassName);
+					String engineFileFullName = decodePluginPath
+							+ File.separatorChar + engineFileName;
+
+					// Check does engine file exist
+					Boolean exists = (new File(engineFileFullName)).exists();
+					if (exists) {
+						String engineClassFullName = CLASS_TEMPLATE
+								.replaceFirst(DECODE_PLUGIN_NAME_TAG,
+										decodePluginName).replaceFirst(
+										DECODE_PLUGIN_CLASS_NAME_TAG,
+										engineClassName);
+						try {
+							Class<?> engineClass = Class
+									.forName(engineClassFullName);
+							TraceCompilerPlugin engine = (TraceCompilerPlugin) engineClass
+									.newInstance();
+							plugIns.add(engine);
+							TraceCompilerLogger.printInfo("Decode plugin " + engineClassFullName + " added"); //$NON-NLS-1$ //$NON-NLS-2$
+						} catch (Exception e) {
+							String msg = "Decode plugin " + engineClassFullName + " adding failed"; //$NON-NLS-1$ //$NON-NLS-2$
+							throw new TraceCompilerRootException(msg, e); 
+						}
+					} else {
+						String msg = "Decode plugin file " + engineFileFullName + " does not exist"; //$NON-NLS-1$ //$NON-NLS-2$
+						throw new TraceCompilerRootException(msg, null);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Parses the command line
+	 * 
+	 * @param args
+	 *            the arguments
+	 * @throws TraceCompilerRootException if arguments are invalid
+	 * @throws IOException 
+	 */
+	private void parseCommandLine(ArrayList<String> list) throws TraceCompilerIllegalArgumentsException, IOException {
+		TraceCompilerLogger.printInfo("Building traces..."); //$NON-NLS-1$
+		if (list.size() == 0) {
+			printUsage();
+			System.exit(0);
+		}
+		List<String> switches = new ArrayList<String>();
+
+		// version, verbose, keepgoing if available could be anywhere, so process them and remove them from the list
+		for (String element : list) {
+			if (element.equalsIgnoreCase(HELP_OPTION) || element.equalsIgnoreCase(HELP_OPTION_SF)) {
+				printUsage();
+				System.exit(0);
+			}
+			if (element.equalsIgnoreCase(VERBOSE_OPTION) || element.equalsIgnoreCase(VERBOSE_OPTION_SF)) {
+				TraceCompilerGlobals.setVerbose(true);
+				switches.add(element);
+			}
+			if (element.equalsIgnoreCase(LEGACY_VERSION_OPTION) || element.equalsIgnoreCase(VERSION_OPTION) || element.equalsIgnoreCase(VERSION_OPTION_SF)) {
+				TraceCompilerLogger.printMessage(VERSION_TEXT + TraceCompilerVersion.getVersion());
+				System.exit(0);
+			}
+			if (element.equalsIgnoreCase(STOP_ON_ERROR_OPTION) || element.equalsIgnoreCase(STOP_ON_ERROR_OPTION_SF)) {
+				TraceCompilerGlobals.setKeepGoing(false);
+				switches.add(element);
+			}
+		}
+		
+		//remove switches from the list
+		for (String string : switches) {
+			list.remove(string);
+		}
+		
+		switches = null;
+		
+		if (list.size() < MANDATORY_ARGUMENT_COUNT) {
+			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.invalidTraceCompilerArgumetsExceptionText"), null); //$NON-NLS-1$
+		}
+		
+		
+		//the rest of elements must be in the order COMPONENT_UID, COMPONENT_NAME, COMPONENT_MMP_PATH, source...
+		//COMPONENT_UID must be on the command line, the rest can either be on the command line or stdin
+
+		try {
+			componentUID = Long.parseLong(list.get(COMPONENT_UID_ARG),
+					TraceCompilerConstants.HEX_RADIX);
+			TraceCompilerLogger.printInfo("Component UID: 0x" + Long.toHexString(componentUID)); //$NON-NLS-1$
+
+		} catch (NumberFormatException e) {
+			String msg = Messages.getString("TraceCompiler.componentUidIsNotValidExceptionText") + componentUID; //$NON-NLS-1$
+			throw new TraceCompilerIllegalArgumentsException(msg, null);
+		}
+		if (componentUID > 0) {
+
+			// Arguments are given as a parameter
+			if (list.size() > MANDATORY_ARGUMENT_COUNT + 1) {
+				parseParameters(list);
+
+				// Otherwise, read arguments from STDIN
+			} else {
+				readFromStdin();
+			}
+		} else {
+			String msg = Messages.getString("TraceCompiler.componentUidIsNotValidExceptionText") + componentUID; //$NON-NLS-1$
+			throw new TraceCompilerIllegalArgumentsException(msg, null);
+		}
+	}
+
+
+	private static void printUsage() {
+		TraceCompilerLogger.printMessage(VERSION_TEXT + TraceCompilerVersion.getVersion());
+		TraceCompilerLogger.printMessage(USAGE);
+	}
+
+	/**
+	 * Parses parameters
+	 * 
+	 * @param args
+	 *            the parameters
+	 * @throws TraceCompilerRootException if arguments are not valid
+	 */
+	private void parseParameters(List<String> args) throws TraceCompilerIllegalArgumentsException {
+		//index is safe, already checked by the caller
+		componentName = args.get(COMPONENT_NAME_ARG);
+		traceFolderName = 	TraceCompilerConstants.TRACES_DIRECTORY + UNDERSCORE
+							+ componentName;
+		
+		mmpPath = new File(args.get(COMPONENT_MMP_PATH_ARG));
+
+		if (isMmpValid()) {
+
+			// Move the files from args array to source file list
+				ArrayList<String> sources = new ArrayList<String>();
+				for (int i = 0; i < args.size() - SOURCE_FILE_START_OFFSET; i++) {
+					sources.add(args.get(SOURCE_FILE_START_OFFSET + i));
+				}
+
+				registerFiles(sources);
+		} else {
+			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.invalidMmpExceptionText") + mmpPath, null); //$NON-NLS-1$
+		}
+		
+	}
+
+	/**
+	 * Read information from STDIN
+	 * @throws IOException if fails to read the input
+	 * @throws TraceCompilerRootException if the list of files is empty
+	 */
+	private void readFromStdin() throws IOException, TraceCompilerIllegalArgumentsException {
+		ArrayList<String> files = new ArrayList<String>();
+
+		// Create reader
+		BufferedReader stdin = new BufferedReader(
+				new InputStreamReader(System.in));
+		
+			int numberOfReceivedLines = 1;
+
+			String line = stdin.readLine();
+						
+			while (line != null) {
+
+				// End of source files received
+				if (line.equals(ENDOFSOURCEFILES)) {
+					break;
+				}
+
+				// Component name
+				if (numberOfReceivedLines == COMPONENT_NAME_ARG) {
+					componentName = line;
+					traceFolderName = TraceCompilerConstants.TRACES_DIRECTORY
+							+ UNDERSCORE + componentName;
+
+					// MMP path
+				} else if (numberOfReceivedLines == COMPONENT_MMP_PATH_ARG) {
+					mmpPath = new File(line);
+					if (!isMmpValid()) {
+						stdin.close();
+						throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.invalidMmpExceptionText") + mmpPath, null); //$NON-NLS-1$
+					}
+
+					// Source files
+				} else {
+					// Add to the files list
+					File file = new File(line);
+					files.add(file.getAbsolutePath());
+				}
+
+				numberOfReceivedLines++;
+
+				// Read new line from STDIN
+				line = stdin.readLine();				
+			}
+		stdin.close();
+		registerFiles(files);
+	}
+
+	/**
+	 * Registers files to document monitor.
+	 * 
+	 * @param sources
+	 *            sources
+	 * @throws TraceCompilerRootException 
+	 */
+	private void registerFiles(ArrayList<String> sources) throws TraceCompilerIllegalArgumentsException {
+
+		if (sources.size() == 0) {
+			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.noSourceFilesExceptionText"), null); //$NON-NLS-1$
+		}
+		File parent = mmpPath.getParentFile();
+		boolean found = false;
+
+		componentPath = parent.getAbsolutePath();
+
+		ProjectEngine.traceFolderName = TraceCompilerConstants.TRACES_DIRECTORY;
+
+		// Find location of "traces" or "traces_<component name>" -folder. If
+		// "traces" or "traces_<component name>" -folder does not
+		// exist, "traces" -folder will be add to same level than "group" or
+		// "mmpfiles" -folder. If "group" or "mmpfiles" -folder does not exist
+		// then "traces" -folder will be added to same level than source file.
+		while (!found && parent != null) {
+			File[] children = parent.listFiles();
+			if (children != null) {
+				for (int i = 0; i < children.length; i++) {
+					File child = children[i];
+					String childName = child.getName();
+					if (child.isDirectory() && isProjectRoot(childName)) {
+						componentPath = parent.getAbsolutePath();
+						found = true;
+
+						// Check that does subdirectory that name is
+						// "traces_<component name>" exist in this directory. If
+						// it exist use that as traces directory name.
+						for (i = 0; i < children.length; i++) {
+							child = children[i];
+							childName = child.getName();
+							if (child.isDirectory()
+									&& childName
+											.equalsIgnoreCase(traceFolderName)) {
+								ProjectEngine.traceFolderName = traceFolderName;
+								break;
+							}
+						}
+						break;
+					}
+				}
+			}
+
+			if (found == false) {
+				parent = parent.getParentFile();
+			}
+		}
+
+		registerSourceFiles(sources);
+	}
+
+	/**
+	 * Checks if this folder is the project root
+	 * 
+	 * @param name
+	 *            name of the folder
+	 * @return true if this folder is the project root
+	 */
+	private boolean isProjectRoot(String name) {
+		boolean retval = false;
+		if (name.equalsIgnoreCase(traceFolderName)
+				|| name.equalsIgnoreCase(SymbianConstants.GROUP_DIRECTORY)
+				|| name.equalsIgnoreCase(SymbianConstants.MMPFILES_DIRECTORY)
+				|| name
+						.equalsIgnoreCase(TraceCompilerConstants.TRACES_DIRECTORY)) {
+			retval = true;
+		}
+		return retval;
+	}
+
+	/**
+	 * Registers source files
+	 * 
+	 * @param files
+	 */
+	private void registerSourceFiles(ArrayList<String> files) {
+		if (files.size() > 0) {
+			String[] fileArr = new String[files.size()];
+			files.toArray(fileArr);
+
+			// Sets the source files to the TraceCompiler document
+			// factory. It will create a document from each source in the array
+			FileDocumentMonitor.setFiles(fileArr);
+			DocumentFactory.registerDocumentFramework(
+					new FileDocumentMonitor(), StringDocumentFactory.class);
+		}
+	}
+
+	/**
+	 * Initializes TraceCompiler
+	 * @throws TraceCompilerRootException if fail to initialize the plugins
+	 * @throws TraceCompilerException 
+	 */
+	private void start() throws TraceCompilerRootException, TraceCompilerException {
+
+		// Starts TraceCompiler. This is normally called from the Eclipse
+		// plug-in
+		// activator, but in console case that does not exist
+		TraceCompilerEngineGlobals.start();
+				
+		
+		//Reads the GroupId values from opensystemtrace_types.h
+		//If this fails a message is logged and trace compiler stops
+		GroupNames.initialiseGroupName();
+
+		
+		// Registers a view to TraceCompiler
+		TraceCompilerEngineGlobals
+				.setView(new TraceCompilerView(componentPath));
+
+		// Registers all plug-in components
+		for (TraceCompilerPlugin plugin : plugIns) {
+			TraceCompilerEngineGlobals.registerPlugin(plugin);
+		}
+		// Adds a model event listener
+		TraceCompilerEngineGlobals.getTraceModel().addModelListener(
+				modelListener);
+		TraceCompilerEngineGlobals.getTraceModel().addExtensionListener(
+				modelListener);
+		TraceCompilerEngineGlobals.getTraceModel().getExtension(
+				TraceLocationList.class).addLocationListListener(modelListener);
+		TraceCompilerEngineGlobals.getTraceModel().addProcessingListener(modelListener);
+	}
+
+	/**
+	 * Parses the sources and generates trace files
+	 * @throws Exception 
+	 */
+	private void buildTraceFiles() throws Exception {
+		TraceCompilerEngineInterface tbi = TraceCompilerEngineGlobals
+				.getTraceCompiler();
+		try {
+			// Opens a trace project
+			componentName = TraceUtils.convertName(componentName);
+
+			// Set project path before opening project
+			TraceCompilerEngineGlobals.setProjectPath(componentPath);
+			tbi.openProject(componentName);
+			TraceModel model = TraceCompilerEngineGlobals.getTraceModel();
+			if (model.isValid()) {
+				model.setID((int) componentUID);
+
+				// Location errors are printed after a file changes, but the
+				// last file is not detected by the listener
+				if (modelListener.getErrors().size() > 0) {
+					modelListener.printLocationErrors();
+					tbi.closeProject();
+					throw new TraceCompilerRootException(null, null);
+				}
+				tbi.exportProject();
+				tbi.closeProject();
+			} else {
+				String msg = "Project creation was cancelled"; //$NON-NLS-1$
+				throw new TraceCompilerRootException(msg, null);
+			}
+		} catch (TraceCompilerException e) {
+			TraceCompilerEngineGlobals.getEvents().postError(e);
+			throw new TraceCompilerRootException("Build trace files failed.", e); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Shuts down TraceCompiler
+	 * @throws TraceCompilerException 
+	 */
+	private void shutdown() throws TraceCompilerException {
+		for (TraceCompilerPlugin plugin : plugIns) {
+			TraceCompilerEngineGlobals.unregisterPlugin(plugin);
+		}
+		TraceCompilerEngineGlobals.shutdown();
+	}
+
+	/**
+	 * Checks if the MMP file is valid
+	 * 
+	 * @return true if MMP file is valid
+	 */
+	private boolean isMmpValid() {
+		boolean valid = false;
+		String pathStr = mmpPath.getAbsolutePath();
+
+		if (mmpPath.exists() && pathStr.length() > MMP.length()) {
+			String end = pathStr.substring(pathStr.length() - MMP.length());
+			if (end.equalsIgnoreCase(MMP)) {
+				valid = true;
+			} else {
+				TraceCompilerLogger.printError("Invalid MMP file: " + mmpPath.getAbsolutePath()); //$NON-NLS-1$
+			}
+		} else {
+			TraceCompilerLogger.printError("Missing or can not access MMP path: " + mmpPath.getAbsolutePath()); //$NON-NLS-1$
+		}
+		return valid;
+		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerConfiguration.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,153 @@
+/*
+* 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:
+*
+* Configuration for the console UI
+*
+*/
+package com.nokia.tracecompiler;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineConfiguration;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineConfigurationListener;
+
+/**
+ * Configuration for the TraceCompiler UI
+ * 
+ */
+final class TraceCompilerConfiguration implements TraceCompilerEngineConfiguration {
+
+	/**
+	 * Export path
+	 */
+	private String exportPath;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param exportPath
+	 *            the export path for decode files
+	 */
+	TraceCompilerConfiguration(String exportPath) {
+		this.exportPath = exportPath;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#
+	 *      addConfigurationListener(com.nokia.tracecompiler.engine.TraceCompilerConfigurationListener)
+	 */
+	public void addConfigurationListener(
+			TraceCompilerEngineConfigurationListener configurationListener) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#
+	 *      getFlag(java.lang.String)
+	 */
+	public boolean getFlag(String flagName) {
+		boolean retval;
+		if (flagName.equals(TraceCompilerEngineConfiguration.CONSOLE_UI_MODE)) {
+			retval = true;
+		} else {
+			retval = false;
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#
+	 *      getText(java.lang.String)
+	 */
+	public String getText(String textName) {
+		String retval;
+		if (textName.equals(TraceCompilerEngineConfiguration.ENVIRONMENT_ROOT)) {
+			retval = exportPath;
+		} else {
+			retval = ""; //$NON-NLS-1$
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#
+	 *      getValue(java.lang.String)
+	 */
+	public int getValue(String valueName) {
+		return 0;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#
+	 *      hasEntry(java.lang.String)
+	 */
+	public boolean hasEntry(String entryName) {
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#isAvailable()
+	 */
+	public boolean isAvailable() {
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#
+	 *      removeConfigurationListener(com.nokia.tracecompiler.engine.TraceCompilerConfigurationListener)
+	 */
+	public void removeConfigurationListener(
+			TraceCompilerEngineConfigurationListener configurationListener) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#setFlag(java.lang.String,
+	 *      boolean)
+	 */
+	public void setFlag(String flagName, boolean flag) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#setText(java.lang.String,
+	 *      java.lang.String)
+	 */
+	public void setText(String textName, String text) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#setValue(java.lang.String,
+	 *      int)
+	 */
+	public void setValue(String valueName, int value) {
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerConstants.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,43 @@
+/*
+* 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:
+*
+* Constants for console UI
+*
+*/
+package com.nokia.tracecompiler;
+
+
+/**
+ * Constants for TraceCompiler UI
+ *
+ */
+public interface TraceCompilerConstants {
+
+	/**
+	 * Default UID if component does not have one
+	 */
+	int DEFAULT_UID = 0x0;
+
+	/**
+	 * Traces directory
+	 */
+	String TRACES_DIRECTORY = "traces"; //$NON-NLS-1$
+
+	/**
+	 * Radix for hex numbers
+	 */
+	int HEX_RADIX = 16; // CodForChk_Dis_Magic
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerGlobals.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,73 @@
+/*
+ * 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:
+ *
+ * TraceCompilerGlobals global constants
+ *
+ */
+package com.nokia.tracecompiler;
+
+/**
+ * TraceCompiler Global constants
+ *
+ */
+public class TraceCompilerGlobals {
+
+	/**
+	 * Verbose output. Verbose is usually checked to print Infos
+	 */
+	private static boolean VERBOSE = false;
+	
+	/**
+	 * KepGoing is used to decide whether we continue processing on errors
+	 */
+	private static boolean KEEPGOING =  true;
+	
+	//disallow instances
+	private TraceCompilerGlobals() {
+		// singleton
+	}
+
+	/**
+	 * set verbose mode
+	 * @param verbose
+	 */
+	public static void setVerbose(boolean verbose) {
+		VERBOSE = verbose;
+	}
+	
+	/**
+	 * is vebose mode on/off
+	 * @return boolean
+	 */
+	public static boolean isVebose() {
+		return VERBOSE;
+	}
+	
+	/**
+	 * set keep going mode
+	 * @param keepgoing
+	 */
+	public static void setKeepGoing(boolean keepgoing) {
+		KEEPGOING = keepgoing;
+	}
+	
+	/**
+	 * is keepgoing mode on/off
+	 * @return boolean
+	 */
+	public static boolean keepGoing() {
+		return KEEPGOING;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerIllegalArgumentsException.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+ *
+ * TraceCompilerIllegalArgumentsException thrown when tracecompiler can not process its arguments
+ *
+ */
+package com.nokia.tracecompiler;
+
+/**
+ * TraceCompilerIllegalArgumentsException thrown when tracecompiler can not process its arguments
+ *
+ */
+public class TraceCompilerIllegalArgumentsException extends TraceCompilerRootException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1387782275931306398L;
+
+	public TraceCompilerIllegalArgumentsException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerLogger.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2010 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:
+ *
+ * Simple Logger
+ *
+ */
+package com.nokia.tracecompiler;
+
+
+
+/**
+ * Simple logger for errors warnings and infos
+ *
+ */
+public class TraceCompilerLogger {
+
+	/**
+	 * Prints errors message to STDERR.
+	 * 
+	 * @param msg
+	 *            the message
+	 */
+	static public void printError(String msg) {
+		if (msg != null) {
+			System.err.println(Messages.getString("TraceCompilerLogger.errorPrefix") + msg); //$NON-NLS-1$
+			System.err.flush();
+		}
+	}
+	
+	/**
+	 * Prints warning message to STDERR.
+	 * @param msg
+	 */
+	static public void printWarning(String msg) {
+			System.err.println(Messages.getString("TraceCompilerLogger.warningPrefix") + msg); //$NON-NLS-1$
+			System.err.flush();
+	}
+
+	/**
+	 * Prints warning message to STDOUT if verbose is on.
+	 * @param msg
+	 */
+	static public void printInfo(String msg) {
+		if (TraceCompilerGlobals.isVebose()) {
+			System.out.println(Messages.getString("TraceCompilerLogger.infoPrefix") + msg); //$NON-NLS-1$
+			System.out.flush();
+		}
+	}
+	
+	/**
+	 * Prints warning message to STDOUT.
+	 * @param msg
+	 */
+	static public void printMessage(String msg) {
+			System.out.println(msg);
+			System.out.flush();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerMain.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,766 @@
+/*
+ * Copyright (c) 2010 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:
+ *
+ * TraceCompiler command-line main class
+ *
+ */
+package com.nokia.tracecompiler;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.nokia.tracecompiler.document.FileDocumentMonitor;
+import com.nokia.tracecompiler.document.StringDocumentFactory;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineEvents;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineInterface;
+import com.nokia.tracecompiler.engine.TraceLocationList;
+import com.nokia.tracecompiler.engine.project.ProjectEngine;
+import com.nokia.tracecompiler.file.FileUtils;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.plugin.TraceCompilerPlugin;
+import com.nokia.tracecompiler.project.GroupNames;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.utils.DocumentFactory;
+import com.nokia.tracecompiler.utils.TraceCompilerVersion;
+
+/**
+ * TraceCompiler command-line main class
+ * 
+ */
+public class TraceCompilerMain {
+	
+	/** line separator */
+	private static String LINE_SEPARATOR =  System.getProperty("line.separator"); //$NON-NLS-1$
+	
+	/**
+	 * Index of third character
+	 */
+	private static final int INDEX_OF_THIRD_CHARACTER = 2;
+
+	/**
+	 * Index of first character
+	 */
+	private static final int INDEX_OF_FIRST_CHARACTER = 0;
+	
+	/**
+	 * TraceCompiler options
+	 */
+	
+	/**
+	 * UID : it is used to create the dictionary file
+	 */
+	private static final String UID_SWITCH = Messages.getString("TraceCompiler.UidStwich"); //$NON-NLS-1$
+	private static final String UID_SWITCH_TEXT = Messages.getString("TraceCompiler.UidText"); //$NON-NLS-1$
+	/**
+	 * project name : it is used to create the dictionary file
+	 */
+	private static final String PRJ_NAME_SWITCH = Messages.getString("TraceCompiler.ProjectSwitch");//$NON-NLS-1$
+	private static final String PRJ_NAME_SWITCH_TEXT = Messages.getString("TraceCompiler.ProjectText"); //$NON-NLS-1$
+	/**
+	 * mmp file path:  may be used to compute the traces folder
+	 */
+	private static final String MMP_PATH_SWITCH = Messages.getString("TraceCompiler.MmpSwitch");//$NON-NLS-1$
+	private static final String MMP_PATH_SWITCH_TEXT = Messages.getString("TraceCompiler.MmpText"); //$NON-NLS-1$
+	/**
+	 * traces folder: absolute or relative to the mmp folder
+	 */
+	private static final String TRACES_PATH_SWITCH = Messages.getString("TraceCompiler.TracesSwitch");//$NON-NLS-1$
+	private static final String TRACES_PATH_SWITCH_TEXT = Messages.getString("TraceCompiler.TracesText"); //$NON-NLS-1$
+	
+
+	/**
+	 * Version option
+	 */
+	private static final String VERSION_OPTION = Messages.getString("TraceCompiler.VersionSwitchLong"); //$NON-NLS-1$
+	private static final String VERSION_OPTION_SF = Messages.getString("TraceCompiler.VersionSwitchShort"); //$NON-NLS-1$
+	private static final String VERSION_OPTION_INSTRUCTION_TEXT = Messages.getString("TraceCompiler.VersionText"); //$NON-NLS-1$
+
+	
+	/**
+	 * help option
+	 */
+	private static final String HELP_OPTION = Messages.getString("TraceCompiler.HelpSwicthLong"); //$NON-NLS-1$
+	private static final String HELP_OPTION_SF = Messages.getString("TraceCompiler.HelpSwitchShort"); //$NON-NLS-1$
+	private static final String HELP_OPTION_INSTRUCTION_TEXT = Messages.getString("TraceCompiler.HelpText"); //$NON-NLS-1$
+	
+	/**
+	 * Verbose option
+	 */
+	private static final String VERBOSE_OPTION = Messages.getString("TraceCompiler.VerboseSwitchLong"); //$NON-NLS-1$
+	private static final String VERBOSE_OPTION_SF = Messages.getString("TraceCompiler.VerboseSwitchShort"); //$NON-NLS-1$
+	private static final String VERBOSE_OPTION_INSTRUCTION_TEXT = Messages.getString("TraceCompiler.VerboseText"); //$NON-NLS-1$
+
+	/**
+	 * keep going option
+	 */
+	private static final String STOP_ON_ERROR_OPTION = Messages.getString("TraceCompiler.StopSwitchLong"); //$NON-NLS-1$
+	private static final String STOP_ON_ERROR_OPTION_SF = Messages.getString("TraceCompiler.StopSwitchShort"); //$NON-NLS-1$
+	private static final String STOP_ON_ERROR_OPTION_INSTRUCTION_TEXT = Messages.getString("TraceCompiler.StopText"); //$NON-NLS-1$
+
+	
+
+	/**
+	 * Version text
+	 */
+	private static final String VERSION_TEXT = Messages.getString("TraceCompiler.DisplayVersionText"); //$NON-NLS-1$
+
+	/**
+	 * Option instruction text
+	 */
+	private static final String OPTION_INSTRUCTION_TEXT = Messages.getString("TraceCompiler.Options"); //$NON-NLS-1$
+	private static final String VALUE=Messages.getString("TraceCompiler.Value"); //$NON-NLS-1$
+	
+
+	
+	private static final String USAGE = Messages.getString("TraceCompiler.Usage") + LINE_SEPARATOR + //$NON-NLS-1$
+	Messages.getString("TraceCompiler.UsageText") + LINE_SEPARATOR + //$NON-NLS-1$
+										"\t" + OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR + //$NON-NLS-1$
+										"\t" + HELP_OPTION_SF  + ", " + HELP_OPTION + ", " + HELP_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+										"\t" + VERSION_OPTION_SF + ", " + VERSION_OPTION + "\t" +  VERSION_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+										"\t" + VERBOSE_OPTION_SF + ", " + VERBOSE_OPTION + "\t\t" + VERBOSE_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
+										"\t" + STOP_ON_ERROR_OPTION_SF + ", " + STOP_ON_ERROR_OPTION + "\t" + STOP_ON_ERROR_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
+										"\t" + UID_SWITCH + "=" + VALUE + "\t" + UID_SWITCH_TEXT +  LINE_SEPARATOR + //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+										"\t" + PRJ_NAME_SWITCH + "=" + VALUE + "\t" + PRJ_NAME_SWITCH_TEXT +  LINE_SEPARATOR + //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+										"\t" + MMP_PATH_SWITCH + "=" + VALUE + "\t" + MMP_PATH_SWITCH_TEXT +  LINE_SEPARATOR + //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+										"\t" + TRACES_PATH_SWITCH + "=" + VALUE + "\t" + TRACES_PATH_SWITCH_TEXT; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+
+
+
+	/**
+	 * End of source files tag
+	 */
+	private static final String ENDOFSOURCEFILES = Messages.getString("TraceCompiler.EndOfList"); //$NON-NLS-1$
+
+	/**
+	 * MMP file extension
+	 */
+	private static final String MMP_FILE_TYPE = Messages.getString("TraceCompiler.MmpExtension"); //$NON-NLS-1$
+
+	/**
+	 * Decode plugins path
+	 */
+	private String DECODE_PLUGINS_PATH = Messages.getString("TraceCompiler.PluginPath"); //$NON-NLS-1$
+
+	/**
+	 * Decode plugin name tag
+	 */
+	private String DECODE_PLUGIN_NAME_TAG = Messages.getString("TraceCompiler.DecodeText1"); //$NON-NLS-1$
+
+	/**
+	 * Decode plugin class name tag
+	 */
+	private String DECODE_PLUGIN_CLASS_NAME_TAG = Messages.getString("TraceCompiler.DecodeText2"); //$NON-NLS-1$
+
+	/**
+	 * Decode plugin engine class name template
+	 */
+	private String ENGINE_CLASS_NAME_TEMPLATE = DECODE_PLUGIN_NAME_TAG
+			+ "Engine"; //$NON-NLS-1$
+
+	/**
+	 * Decode plugin engine file name template
+	 */
+	private String ENGINE_FILE_NAME_TEMPLATE = DECODE_PLUGIN_CLASS_NAME_TAG
+			+ ".class"; //$NON-NLS-1$
+
+	/**
+	 * Decode plugins class template
+	 */
+	private String CLASS_TEMPLATE = Messages.getString("TraceCompiler.DecodePluginsNameSpace") + DECODE_PLUGIN_NAME_TAG + "." + DECODE_PLUGIN_CLASS_NAME_TAG; //$NON-NLS-1$ //$NON-NLS-2$	
+	
+	//switch with value such as --uid=value
+	private Pattern valueSwitchPattern = Pattern.compile("(--\\S+)=(\\S+)"); //$NON-NLS-1$
+	//switches with no values such -v, --version
+	private Pattern singleSwitchPattern = Pattern.compile("-{1,2}([^=]+)"); //$NON-NLS-1$
+	
+	/**
+	 * list of source files
+	 */
+	private ArrayList<String> sources = new ArrayList<String>();
+	/**
+	 * traces path
+	 */
+	private String traces_path = null;
+	
+	
+	
+	
+	/**
+	 * Main function
+	 * 
+	 * @param args
+	 *            the command line arguments
+	 */
+	public static void main(String[] args) {
+		if (args.length == 0) {
+			printUsage();
+			return;
+		}
+		
+		ArrayList<String> list = null;
+		
+		//support spaces in switches, build a long string, clean it and convert it back to array - a bit expensive
+		String tmpString = "";  //$NON-NLS-1$
+		for (int i = 0; i < args.length; i++) {
+			tmpString = tmpString + " " + args[i];  //$NON-NLS-1$
+		}
+		tmpString = tmpString.replaceAll("\\s*=\\s*", "="); //$NON-NLS-1$ //$NON-NLS-2$
+		tmpString = tmpString.replaceAll("\\s+", " "); //$NON-NLS-1$ //$NON-NLS-2$
+		String[] split = tmpString.trim().split(" "); //$NON-NLS-1$
+		tmpString = null; // not needed anymore
+		
+		//rebuild array of arguments
+		if (split.length > 0) {
+			list = new ArrayList<String>(Arrays.asList(split));
+		}
+				
+		long startTime = System.currentTimeMillis();
+		//create a new session of TraceCompiler
+		TraceCompilerMain console = new TraceCompilerMain();
+		
+		try {
+			console.parseCommandLine(list);
+		} catch (Exception e) { //should cover IOException and TraceCompilerIllegalArgumentsException
+			//There is no point to continue if there are problems with the arguments.
+			TraceCompilerLogger.printError(e.getMessage());
+			printUsage();
+			System.exit(1);
+		}
+		
+		boolean error = false;
+		try {
+			if(list.size() != 0) {
+				console.createPlugins();
+				console.start();
+				console.buildTraceFiles();				
+			}
+		} catch (Exception e) {
+			if (e instanceof TraceCompilerRootException) {
+				TraceCompilerLogger.printError(e.getMessage()); 
+			} //else the error should have been reported earlier
+			error = true;
+		} finally {
+			try {
+				if (!error) { //check if errors have been logged by EventEngine
+					TraceCompilerEngineEvents events = TraceCompilerEngineGlobals.getEvents();
+					if (events != null && events.hasErrorHappened()) {
+						error = true;
+					}
+				}
+				console.shutdown();
+			} catch (TraceCompilerException e) {
+				error = true;
+			}
+		}
+
+		if (console.projectName != null) {
+			TraceCompilerLogger.printMessage(console.projectName + Messages.getString("TraceCompiler.Took") //$NON-NLS-1$
+					+ (System.currentTimeMillis() - startTime) + Messages.getString("TraceCompiler.MS")); //$NON-NLS-1$
+		}
+		if (error) {
+			System.exit(1);
+		} else {
+			System.exit(0);
+		}	
+	}
+
+	/**
+	 * With Eclipse, the plug-ins are loaded by Eclipse framework. Here they
+	 * must be manually created and started
+	 */
+	private ArrayList<TraceCompilerPlugin> plugIns = new ArrayList<TraceCompilerPlugin>();
+
+	/**
+	 * Model listener
+	 */
+	private TraceCompilerModelListener modelListener;
+
+	/**
+	 * Name of the component
+	 */
+	private String projectName = null;
+	
+
+	/**
+	 * UID of the component
+	 */
+	private long componentUID = 0L;
+
+	/**
+	 * Component path
+	 */
+	private String componentPath = null;
+
+	/**
+	 * MMP file path
+	 */
+	private File mmpPath = null;
+
+	/**
+	 * Constructor
+	 */
+	TraceCompilerMain() {
+
+		// Creates listeners and preferences
+		modelListener = new TraceCompilerModelListener();
+	}
+
+	/**
+	 * Creates the plug-ins to be registered with TraceCompiler
+	 * @throws TraceCompilerRootException if fail to create a valid plugins
+	 */
+	private void createPlugins() throws TraceCompilerRootException {
+		
+		// Get location of the TraceCompiler
+		URL path = getClass().getProtectionDomain().getCodeSource()
+				.getLocation();
+		String decodePluginsPath = path.getPath();
+
+		// If first character is forward slash and it is located before drive
+		// letter remove it
+		if (decodePluginsPath.charAt(INDEX_OF_FIRST_CHARACTER) == SourceConstants.FORWARD_SLASH_CHAR
+				&& decodePluginsPath.charAt(INDEX_OF_THIRD_CHARACTER) == SourceConstants.COLON_CHAR) {
+			decodePluginsPath = decodePluginsPath.substring(1);
+		}
+		
+		// Concatenate decode plugins path
+		decodePluginsPath = decodePluginsPath.concat(DECODE_PLUGINS_PATH);
+		
+		// Replace slashes with correct separator character
+		decodePluginsPath = decodePluginsPath.replace(
+				SourceConstants.FORWARD_SLASH_CHAR, File.separatorChar);
+		decodePluginsPath = decodePluginsPath.replace(
+				SourceConstants.BACKSLASH_CHAR, File.separatorChar);
+		File decodePluginsDir = new File(decodePluginsPath);
+		String[] decodePlugins = decodePluginsDir.list();
+		if (decodePlugins != null) {
+			for (int i = 0; i < decodePlugins.length; i++) {
+
+				// Get decode plugin name
+				String decodePluginName = decodePlugins[i];
+
+				// Get decode plugin path
+				String decodePluginPath = decodePluginsPath
+						+ File.separatorChar + decodePluginName;
+
+				// Decode plugin must be in own directory
+				Boolean isDirectory = (new File(decodePluginPath))
+						.isDirectory();
+				if (isDirectory) {
+
+					// Construct decode plugin engine class name
+					String engineClassName = ENGINE_CLASS_NAME_TEMPLATE
+							.replaceFirst(DECODE_PLUGIN_NAME_TAG,
+									decodePluginName.substring(0, 1)
+											.toUpperCase()
+											+ decodePluginName.substring(1));
+
+					// Construct decode plugin engine file name
+					String engineFileName = ENGINE_FILE_NAME_TEMPLATE
+							.replaceFirst(DECODE_PLUGIN_CLASS_NAME_TAG,
+									engineClassName);
+					String engineFileFullName = decodePluginPath
+							+ File.separatorChar + engineFileName;
+
+					// Check does engine file exist
+					Boolean exists = (new File(engineFileFullName)).exists();
+					if (exists) {
+						String engineClassFullName = CLASS_TEMPLATE
+								.replaceFirst(DECODE_PLUGIN_NAME_TAG,
+										decodePluginName).replaceFirst(
+										DECODE_PLUGIN_CLASS_NAME_TAG,
+										engineClassName);
+						try {
+							Class<?> engineClass = Class
+									.forName(engineClassFullName);
+							TraceCompilerPlugin engine = (TraceCompilerPlugin) engineClass
+									.newInstance();
+							plugIns.add(engine);
+							TraceCompilerLogger.printInfo(Messages.getString(Messages.getString("TraceCompiler.DecodePlugin") + engineClassFullName + Messages.getString("TraceCompiler.Added"))); //$NON-NLS-1$ //$NON-NLS-2$
+						} catch (Exception e) {
+							String msg = Messages.getString("TraceCompiler.DecodePlugin" + engineClassFullName + Messages.getString("TraceCompiler.AddingFailed")); //$NON-NLS-1$ //$NON-NLS-2$
+							throw new TraceCompilerRootException(msg, e); 
+						}
+					} else {
+						String msg = Messages.getString("TraceCompiler.DecodePluginFile") + Messages.getString("TraceCompiler.EngineFullName") + engineFileFullName + Messages.getString("TraceCompiler.DoesNotExist"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+						throw new TraceCompilerRootException(msg, null);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Parses the command line
+	 * 
+	 * @param args
+	 *            the arguments
+	 * @throws TraceCompilerRootException if arguments are invalid
+	 * @throws IOException 
+	 */
+	private void parseCommandLine(ArrayList<String> list) throws TraceCompilerIllegalArgumentsException, IOException {
+		TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.BuildingTracesMess")); //$NON-NLS-1$
+		Iterator<String> argIterator = list.iterator();
+		
+		if (list.size() == 0) {
+			printUsage();
+			System.exit(0);
+		}
+		while (argIterator.hasNext()) {
+			String element = argIterator.next().trim();
+			Matcher m = singleSwitchPattern.matcher(element);
+
+			if (m.matches()) { //it's one of the single switches 
+				if (element.equalsIgnoreCase(HELP_OPTION) || element.equalsIgnoreCase(HELP_OPTION_SF)) {
+					printUsage();
+					System.exit(0);
+				}
+				if (element.equalsIgnoreCase(VERBOSE_OPTION) || element.equalsIgnoreCase(VERBOSE_OPTION_SF)) {
+					TraceCompilerGlobals.setVerbose(true);
+					TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.veboseEnabled")); //$NON-NLS-1$
+					continue;
+				}
+				if ( element.equalsIgnoreCase(VERSION_OPTION) || element.equalsIgnoreCase(VERSION_OPTION_SF)) {
+					TraceCompilerLogger.printMessage(VERSION_TEXT + TraceCompilerVersion.getVersion());
+					System.exit(0);
+				}
+				if (element.equalsIgnoreCase(STOP_ON_ERROR_OPTION) || element.equalsIgnoreCase(STOP_ON_ERROR_OPTION_SF)) {
+					TraceCompilerGlobals.setKeepGoing(false);
+					TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.StopOnErrorEnabled")); //$NON-NLS-1$
+					continue;
+				}
+				TraceCompilerLogger.printMessage(Messages.getString("TraceCompiler.UnsupportedSwitch")  + element); //$NON-NLS-1$
+			} else {
+				m = valueSwitchPattern.matcher(element.trim());
+				if (m.matches()) { //it's one of the swithes with values
+					if (m.group(1).equalsIgnoreCase(UID_SWITCH)) {
+						// UID
+						try {
+							componentUID = Long.parseLong(m.group(2),TraceCompilerConstants.HEX_RADIX);	
+							TraceCompilerLogger.printInfo("Component UID: 0x" + Long.toHexString(componentUID)); //$NON-NLS-1$
+							if (componentUID <= 0L) {
+								String msg = Messages.getString("TraceCompiler.componentUidIsNotValidExceptionText") + componentUID; //$NON-NLS-1$
+								throw new TraceCompilerIllegalArgumentsException(msg, null);
+							}
+						} catch (NumberFormatException e) {
+							String msg = Messages.getString("TraceCompiler.componentUidIsNotValidExceptionText") + componentUID; //$NON-NLS-1$
+							throw new TraceCompilerIllegalArgumentsException(msg, null);
+						}
+					} else {
+						if (m.group(1).equalsIgnoreCase(PRJ_NAME_SWITCH)) {
+							// project name
+							projectName = m.group(2);
+							TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.CompNameSet") + projectName); //$NON-NLS-1$
+						} else {
+							if (m.group(1).equalsIgnoreCase(MMP_PATH_SWITCH)) {
+								//mmp path. for the moment only the mmp folder is used.
+								mmpPath = new File(m.group(2));
+								TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.MMPPathSet") + mmpPath); //$NON-NLS-1$
+							} else {
+								if (m.group(1).equalsIgnoreCase(TRACES_PATH_SWITCH)) {
+									//traces path
+									traces_path = m.group(2);
+								} else {
+									//unsupported switch
+									TraceCompilerLogger.printMessage(Messages.getString("TraceCompiler.UnsupportedSwitch") + element); //$NON-NLS-1$
+								}
+							}
+						}
+					}
+
+				} else {
+					//it must be a file name
+					//it's a good time to stop TC here if the file does not exist
+					if (!(new File(element)).exists()) {
+						throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.sourceFileDoesNotExist") + element, null); //$NON-NLS-1$
+					}
+					sources.add(element);				
+				}	
+			}
+		}
+		
+		// by now, if the user wanted just help or version they would have got it and TC stopped
+		
+		if (componentUID <= 0L) {
+			String msg = Messages.getString("TraceCompiler.componentUidIsNotValidExceptionText") + componentUID; //$NON-NLS-1$
+			throw new TraceCompilerIllegalArgumentsException(msg, null);
+		}
+		
+		if (projectName == null) {
+			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.projectNameMissing"), null); //$NON-NLS-1$
+		}
+		
+		//if files have not been provided , get them from stdin
+		if (sources.size() == 0) {
+			//get them from the stdin
+			readFromStdin();
+		}
+		
+		if (mmpPath == null ) {
+			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.mmpPathMissing"), null); //$NON-NLS-1$
+		} else if (!isMmpValid()) {
+			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.invalidMmpExceptionText") + mmpPath, null); //$NON-NLS-1$
+		}
+		
+		if (traces_path == null ) {
+			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.tracesPathMissing"), null); //$NON-NLS-1$
+		} else {
+			computeTracesPath(traces_path);
+		}
+		
+		if (sources.size() == 0 ) {
+			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.fileListMissing"), null); //$NON-NLS-1$
+		}
+		
+		//we have all parameters input and validated, register files.
+		registerSourceFiles(sources);		
+	}
+	
+	
+	/**
+	 * If traces path is relative, work out the full path relative to the location of the mmp file
+	 * @param path
+	 * @throws TraceCompilerIllegalArgumentsException
+	 */
+	private void computeTracesPath(String path) throws TraceCompilerIllegalArgumentsException {
+		String traces_pathString = path;
+		traces_pathString = traces_pathString.replace('/', File.separatorChar);
+		traces_pathString = traces_pathString.replace('\\', File.separatorChar);
+
+		File traces_path = new File(traces_pathString);
+
+		Pattern p = Pattern.compile("(([a-zA-Z]:[\\\\/])|([\\\\/])).*"); //$NON-NLS-1$
+		Matcher m = p.matcher(traces_pathString);
+
+		if (!m.matches() /*  workaround for isAbsolute in java */) {
+			//traces path is relative to mmp location
+			traces_pathString = mmpPath.getAbsoluteFile().getParent() + File.separator + traces_pathString;
+		}
+
+		traces_path = new File(traces_pathString);
+
+		if (traces_path.isDirectory() && !traces_path.canWrite()) {
+			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.TracesPathWriteProtected") + traces_path, null); //$NON-NLS-1$
+		}
+
+		boolean dirExists = true;
+		if (!traces_path.exists()) {
+			dirExists = FileUtils.createDirectories(traces_path);
+		}
+		if (!dirExists) {
+			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.mkdirFailed") + traces_path, null); //$NON-NLS-1$
+		}
+
+		//set component path and trace folder
+		componentPath = traces_path.getParent();
+		ProjectEngine.traceFolderName = traces_path.getName();
+		TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.settingComponentPath") + componentPath); //$NON-NLS-1$
+		TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.settingTracesPath") + ProjectEngine.traceFolderName); //$NON-NLS-1$
+	}
+
+	private static void printUsage() {
+		TraceCompilerLogger.printMessage(VERSION_TEXT + TraceCompilerVersion.getVersion());
+		TraceCompilerLogger.printMessage(USAGE);
+	}
+
+	/**
+	 * Read information from STDIN
+	 * @throws IOException if fails to read the input
+	 * @throws TraceCompilerRootException if the list of files is empty
+	 */
+	private void readFromStdin() throws IOException, TraceCompilerIllegalArgumentsException {
+		TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.ReadingFilesMess")  + ENDOFSOURCEFILES); //$NON-NLS-1$
+		// Create reader
+		BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
+
+			String line = stdin.readLine();
+						
+			while (line != null) {
+				line = line.trim();
+				if (line.length() > 0) {
+					// End of source files received
+					if (line.equals(ENDOFSOURCEFILES)) {
+						break;
+					}
+					line = line.replaceAll("\\s+", ""); //$NON-NLS-1$ //$NON-NLS-2$
+					Matcher m = valueSwitchPattern.matcher(line.trim());
+					//because mmp path and traces path can be very long, we should allow them to be input'ed through stdin too.
+					if (m.matches()) { //it's one of the swithes with values
+						if (m.group(1).equalsIgnoreCase(MMP_PATH_SWITCH)) {
+							//mmp path. for the moment only the mmp folder is used.
+							mmpPath = new File(m.group(2));
+							TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.MMPPathSet") + mmpPath); //$NON-NLS-1$
+						} else {
+							if (m.group(1).equalsIgnoreCase(TRACES_PATH_SWITCH)) {
+								//traces path
+								traces_path = m.group(2);
+							} else {
+								//unsupported switch
+								TraceCompilerLogger.printMessage(Messages.getString("TraceCompiler.UnsupportedSwitch") + line); //$NON-NLS-1$
+							}
+						}
+					} else {
+
+						//it must be a file name
+						//it's a good time to stop TC here if the file does not exist
+						if (!(new File(line)).exists()) {
+							throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.sourceFileDoesNotExist") + line, null); //$NON-NLS-1$
+						}
+						sources.add(line);
+					}
+				}
+				// Read new line from STDIN
+				line = stdin.readLine();				
+			}
+		stdin.close();
+	}
+
+	/**
+	 * Registers source files
+	 * 
+	 * @param files
+	 */
+	private void registerSourceFiles(ArrayList<String> files) throws TraceCompilerIllegalArgumentsException {
+		if (sources.size() == 0) {
+			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.noSourceFilesExceptionText"), null); //$NON-NLS-1$
+		}
+		if (files.size() > 0) {
+			String[] fileArr = new String[files.size()];
+			files.toArray(fileArr);
+
+			// Sets the source files to the TraceCompiler document
+			// factory. It will create a document from each source in the array
+			FileDocumentMonitor.setFiles(fileArr);
+			DocumentFactory.registerDocumentFramework(
+					new FileDocumentMonitor(), StringDocumentFactory.class);
+		}
+	}
+
+	/**
+	 * Initializes TraceCompiler
+	 * @throws TraceCompilerRootException if fail to initialize the plugins
+	 * @throws TraceCompilerException 
+	 */
+	private void start() throws TraceCompilerRootException, TraceCompilerException {
+
+		// Starts TraceCompiler. This is normally called from the Eclipse
+		// plug-in
+		// activator, but in console case that does not exist
+		TraceCompilerEngineGlobals.start();
+						
+		//Reads the GroupId values from opensystemtrace_types.h
+		//If this fails a message is logged and trace compiler stops
+		GroupNames.initialiseGroupName();
+
+		
+		// Registers a view to TraceCompiler
+		TraceCompilerEngineGlobals
+				.setView(new TraceCompilerView(componentPath));
+
+		// Registers all plug-in components
+		for (TraceCompilerPlugin plugin : plugIns) {
+			TraceCompilerEngineGlobals.registerPlugin(plugin);
+		}
+		// Adds a model event listener
+		TraceCompilerEngineGlobals.getTraceModel().addModelListener(
+				modelListener);
+		TraceCompilerEngineGlobals.getTraceModel().addExtensionListener(
+				modelListener);
+		TraceCompilerEngineGlobals.getTraceModel().getExtension(
+				TraceLocationList.class).addLocationListListener(modelListener);
+		TraceCompilerEngineGlobals.getTraceModel().addProcessingListener(modelListener);
+	}
+
+	/**
+	 * Parses the sources and generates trace files
+	 * @throws Exception 
+	 */
+	private void buildTraceFiles() throws Exception {
+		TraceCompilerEngineInterface tbi = TraceCompilerEngineGlobals
+				.getTraceCompiler();
+		try {
+			// Opens a trace project
+
+			// Set project path before opening project
+			TraceCompilerEngineGlobals.setProjectPath(componentPath);
+			tbi.openProject(projectName);
+			TraceModel model = TraceCompilerEngineGlobals.getTraceModel();
+			if (model.isValid()) {
+				model.setID((int) componentUID);
+
+				// Location errors are printed after a file changes, but the
+				// last file is not detected by the listener
+				if (modelListener.getErrors().size() > 0) {
+					modelListener.printLocationErrors();
+					tbi.closeProject();
+					throw new TraceCompilerRootException(null, null);
+				}
+				tbi.exportProject();
+				tbi.closeProject();
+			} else {
+				String msg = Messages.getString("TraceCompiler.ProjectCancelledMess"); //$NON-NLS-1$
+				throw new TraceCompilerRootException(msg, null);
+			}
+		} catch (TraceCompilerException e) {
+			TraceCompilerEngineGlobals.getEvents().postError(e);
+			throw new TraceCompilerRootException(Messages.getString("TraceCompiler.BuildFailed"), e); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Shuts down TraceCompiler
+	 * @throws TraceCompilerException 
+	 */
+	private void shutdown() throws TraceCompilerException {
+		for (TraceCompilerPlugin plugin : plugIns) {
+			TraceCompilerEngineGlobals.unregisterPlugin(plugin);
+		}
+		TraceCompilerEngineGlobals.shutdown();
+	}
+
+	/**
+	 * Checks if the MMP file is valid
+	 * 
+	 * @return true if MMP file is valid
+	 */
+	private boolean isMmpValid() {
+		boolean valid = false;
+		String pathStr = mmpPath.getAbsolutePath();
+
+		if (mmpPath.exists() && pathStr.length() > MMP_FILE_TYPE.length()) {
+			String end = pathStr.substring(pathStr.length() - MMP_FILE_TYPE.length());
+			if (end.equalsIgnoreCase(MMP_FILE_TYPE)) {
+				valid = true;
+			} else {
+				TraceCompilerLogger.printError(Messages.getString("TraceCompiler.invalidMmpExceptionText") + mmpPath.getAbsolutePath()); //$NON-NLS-1$
+			}
+		} else {
+			TraceCompilerLogger.printError(Messages.getString("TraceCompiler.InvalidMMP2") + mmpPath.getAbsolutePath()); //$NON-NLS-1$
+		}
+		return valid;
+		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerModelListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,246 @@
+/*
+ * Copyright (c) 2010 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:
+ *
+ * Model extension listener for console UI
+ *
+ */
+package com.nokia.tracecompiler;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorMessages;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceLocation;
+import com.nokia.tracecompiler.engine.TraceLocationList;
+import com.nokia.tracecompiler.engine.TraceLocationListListener;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceModelExtensionListener;
+import com.nokia.tracecompiler.model.TraceModelListener;
+import com.nokia.tracecompiler.model.TraceObject;
+import com.nokia.tracecompiler.model.TraceProcessingListener;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SourceLocationListener;
+
+/**
+ * Model extension listener for TraceCompiler UI
+ * 
+ */
+final class TraceCompilerModelListener implements TraceModelListener,
+		TraceModelExtensionListener, TraceLocationListListener,
+		SourceLocationListener, TraceProcessingListener {
+
+	/**
+	 * List of errors for a source
+	 */
+	private ArrayList<TraceLocation> errorList = new ArrayList<TraceLocation>();
+
+	/**
+	 * Name of the file being processed
+	 */
+	private String currentFileName;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 * objectAdded(com.nokia.tracecompiler.model.TraceObject,
+	 * com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectAdded(TraceObject owner, TraceObject object) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 * objectCreationComplete(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectCreationComplete(TraceObject object) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 * objectRemoved(com.nokia.tracecompiler.model.TraceObject,
+	 * com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectRemoved(TraceObject owner, TraceObject object) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 * propertyUpdated(com.nokia.tracecompiler.model.TraceObject, int)
+	 */
+	public void propertyUpdated(TraceObject object, int property) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtensionListener#
+	 * extensionAdded(com.nokia.tracecompiler.model.TraceObject,
+	 * com.nokia.tracecompiler.model.TraceModelExtension)
+	 */
+	public void extensionAdded(TraceObject object, TraceModelExtension extension) {
+		if (extension instanceof TraceLocationList) {
+			((TraceLocationList) extension).addLocationListListener(this);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtensionListener#
+	 * extensionRemoved(com.nokia.tracecompiler.model.TraceObject,
+	 * com.nokia.tracecompiler.model.TraceModelExtension)
+	 */
+	public void extensionRemoved(TraceObject object,
+			TraceModelExtension extension) {
+		if (extension instanceof TraceLocationList) {
+			((TraceLocationList) extension).removeLocationListListener(this);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.TraceLocationListListener#
+	 * locationAdded(com.nokia.tracecompiler.engine.TraceLocation)
+	 */
+	public void locationAdded(TraceLocation location) {
+		location.addLocationListener(this);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.TraceLocationListListener#
+	 * locationRemoved(com.nokia.tracecompiler.engine.TraceLocation)
+	 */
+	public void locationRemoved(TraceLocation location) {
+		location.removeLocationListener(this);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceLocationListener#
+	 * locationValidityChanged(com.nokia.tracecompiler.engine.TraceLocation)
+	 */
+	public void locationValidityChanged(TraceLocation location) {
+		String fileName = location.getFileName();
+		if (currentFileName != null) {
+			if (!fileName.equals(currentFileName)) {
+				currentFileName = fileName;
+				printLocationErrors();
+			}
+		} else {
+			currentFileName = fileName;
+		}
+		TraceCompilerErrorCode code = location.getValidityCode();
+		if (code != TraceCompilerErrorCode.OK
+				&& code != TraceCompilerErrorCode.TRACE_DOES_NOT_EXIST) {
+			if (!errorList.contains(location)) {
+				errorList.add(location);
+				location.reference();
+			}
+		} else {
+			if (errorList.remove(location)) {
+				location.dereference();
+			}
+		}
+	}
+
+	/**
+	 * Prints the errors from the error list
+	 */
+	void printLocationErrors() {
+		Collections.sort(errorList, new Comparator<TraceLocation>() {
+
+			/**
+			 * Sorts the array by line number
+			 * 
+			 * @param o1
+			 *            location 1
+			 * @param o2
+			 *            location 2
+			 * @return the result
+			 */
+			public int compare(TraceLocation o1, TraceLocation o2) {
+				int line1 = o1.getLineNumber();
+				int line2 = o2.getLineNumber();
+				return line1 > line2 ? 1 : line1 == line2 ? 0 : -1;
+			}
+
+		});
+		for (TraceLocation location : errorList) {
+			printLocationError(location);
+		}
+		errorList.clear();
+	}
+
+	/**
+	 * Prints a location error
+	 * 
+	 * @param location
+	 *            the location
+	 */
+	private void printLocationError(TraceLocation location) {
+		TraceCompilerEngineGlobals.getEvents().postErrorMessage(
+				location.getFileName()
+						+ Messages.getString("TraceCompilerModelListener.lineNumberPrefix") //$NON-NLS-1$
+						+ location.getLineNumber()
+						+ SourceConstants.COLON
+						+ SourceConstants.SPACE
+						+ TraceCompilerEngineErrorMessages.getErrorMessage(
+								location.getValidityCode(), location
+										.getValidityParameters()), null, true);
+	}
+
+	/**
+	 * get list of cumulated erros.
+	 * 
+	 * @return list of TaceLocaion
+	 */
+	public ArrayList<TraceLocation> getErrors() {
+		return errorList;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * com.nokia.tracecompiler.model.TraceProcessingListener#processingComplete
+	 * (boolean)
+	 */
+	public void processingComplete(boolean changed) {
+		printLocationErrors();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * com.nokia.tracecompiler.model.TraceProcessingListener#processingStarted()
+	 */
+	public void processingStarted() {
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerRootException.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+ *
+ * Command-line based view implementation
+ *
+ */
+package com.nokia.tracecompiler;
+
+
+public class TraceCompilerRootException extends Exception {
+	// Serial version UID, as required for all Exceptions
+	private static final long serialVersionUID = 2126996710246333574L;
+	
+
+	/**
+	 * Constructs a TraceCompilerRootException with the given detail message and
+	 * cause.
+	 * @param message the detail message
+	 * @param cause the Exception that caused this Exception
+	 */
+	public TraceCompilerRootException(String message, Throwable cause)
+	{
+		super(message, cause);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerView.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,84 @@
+/*
+ * 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:
+ *
+ * Console view implementation
+ *
+ */
+package com.nokia.tracecompiler;
+
+import java.io.File;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineConfiguration;
+import com.nokia.tracecompiler.engine.ViewAdapter;
+
+/**
+ * TraceCompiler view implementation
+ * 
+ */
+class TraceCompilerView extends ViewAdapter {
+
+	/**
+	 * Epoc root name in environment variables
+	 */
+	private static final String EPOCROOT = "EPOCROOT"; //$NON-NLS-1$
+
+	/**
+	 * Export path
+	 */
+	private String exportPath;
+
+	/**
+	 * Configuration
+	 */
+	private TraceCompilerConfiguration configuration;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param projectPath
+	 *            the project path
+	 */
+	TraceCompilerView(String projectPath) {
+		// First try to get EPOCROOT from environment
+		exportPath = System.getenv(EPOCROOT);
+
+		// Windows substed drive
+		if (exportPath == null) {
+			int index = projectPath.indexOf(':');
+			if (index >= 0) {
+				exportPath = projectPath.substring(0, index + 2); // CodForChk_Dis_Magic
+			} else {
+				exportPath = File.separator;
+			}
+
+			// Check if it ends with a file separator, if not add one at the end
+		} else if (!exportPath.endsWith(File.separator)) {
+			exportPath = exportPath + File.separator;
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.ViewAdapter#getConfiguration()
+	 */
+	@Override
+	public TraceCompilerEngineConfiguration getConfiguration() {
+		if (configuration == null) {
+			configuration = new TraceCompilerConfiguration(exportPath);
+		}
+		return configuration;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryDefRef.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* Reference to a trace definition
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary;
+
+/**
+ * Reference to a trace definition
+ * 
+ */
+final class DictionaryDefRef extends DictionaryRef {
+
+	/**
+	 * Constructor
+	 * 
+	 * @param refid
+	 *            the reference id
+	 */
+	DictionaryDefRef(int refid) {
+		super(refid);
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryEngine.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,100 @@
+/*
+* 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:
+*
+* TraceCompilerExport implementation for Symbian dictionary files
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary;
+
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.plugin.TraceCompilerExport;
+
+/**
+ * TraceCompilerExport implementation for Symbian dictionary files
+ * 
+ */
+public final class DictionaryEngine implements TraceCompilerExport {
+
+	/**
+	 * The trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * Dictionary instance
+	 */
+	private static DictionaryEngine instance;
+
+	/**
+	 * Gets the shared instance
+	 * 
+	 * @return the instance
+	 */
+	static DictionaryEngine getInstance() {
+		return instance;
+	}
+
+	/**
+	 * Constructor
+	 */
+	public DictionaryEngine() {
+		instance = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerPlugin#
+	 *      traceProjectOpened(com.nokia.tracecompiler.model.TraceModel)
+	 */
+	public void traceProjectOpened(TraceModel model) {
+		this.model = model;
+		DictionaryFile file = model.getExtension(DictionaryFile.class);
+		if (file == null) {
+			file = new DictionaryFile(DictionaryFileExport
+					.getPathForDictionary(model));
+			model.addExtension(file);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerPlugin#traceProjectClosed()
+	 */
+	public void traceProjectClosed() {
+		if (model != null && model.isValid()) {
+			model.removeExtensions(DictionaryFile.class);
+		}
+		model = null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerExport#exportTraceProject()
+	 */
+	public void exportTraceProject() throws TraceCompilerException {
+		if (model != null && model.isValid()) {
+			DictionaryFile df = model.getExtension(DictionaryFile.class);
+			if (df != null) {
+				DictionaryFileExport export = new DictionaryFileExport(df);
+				export.exportDictionary();
+			}
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryFile.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,65 @@
+/*
+* 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 file for Dictionary format
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary;
+
+import com.nokia.tracecompiler.project.TraceProjectFile;
+
+/**
+ * Project file for Dictionary format
+ * 
+ */
+final class DictionaryFile extends TraceProjectFile {
+
+	/**
+	 * Title shown in UI
+	 */
+	private static final String TITLE = Messages
+			.getString("DictionaryFile.Title"); //$NON-NLS-1$
+
+	/**
+	 * Constructor
+	 * 
+	 * @param absolutePath
+	 *            the path to the dictionary file
+	 */
+	DictionaryFile(String absolutePath) {
+		super(absolutePath, true);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectFile#getFileExtension()
+	 */
+	@Override
+	protected String getFileExtension() {
+		return DictionaryFileConstants.DICTIONARY_FILE_EXTENSION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectFile#getTitle()
+	 */
+	@Override
+	public String getTitle() {
+		return TITLE;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryFileConstants.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* Constants related to dictionary file
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary;
+
+/**
+ * Constants related to dictionary file
+ * 
+ */
+interface DictionaryFileConstants {
+
+	/**
+	 * Dictionary file extension
+	 */
+	String DICTIONARY_FILE_EXTENSION = "Dictionary.xml"; //$NON-NLS-1$
+
+	/**
+	 * Search depth for dictionary file
+	 */
+	int DICTIONARY_SEARCH_DEPTH = 3; // CodForChk_Dis_Magic
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryFileExport.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,102 @@
+/*
+* 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:
+*
+* Exporter for dictionary file
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary;
+
+import java.io.File;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineConfiguration;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.file.FileUtils;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.source.SourceConstants;
+
+/**
+ * Exporter for dictionary file
+ * 
+ */
+final class DictionaryFileExport {
+
+	/**
+	 * The dictionary file properties
+	 */
+	private DictionaryFile dictionaryFile;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param dictionary
+	 *            the dictionary file
+	 */
+	DictionaryFileExport(DictionaryFile dictionary) {
+		this.dictionaryFile = dictionary;
+	}
+
+	/**
+	 * Exports the dictionary file
+	 */
+	void exportDictionary() {
+		String exportPath = getExportPath(File.separatorChar);
+		String exportFile = dictionaryFile.getFileName();
+		String envRoot = TraceCompilerEngineGlobals.getConfiguration().getText(
+				TraceCompilerEngineConfiguration.ENVIRONMENT_ROOT);
+		if (envRoot != null) {
+			File target = new File(envRoot + exportPath + exportFile);
+			// The dictionary file is updated with the new environment root
+			dictionaryFile.updatePath(target.getAbsolutePath());
+			DictionaryFileWriter writer = new DictionaryFileWriter(
+					dictionaryFile);
+			writer.write();
+			dictionaryFile.postFileWrittenEvent(dictionaryFile
+					.getAbsolutePathWithID());
+		}
+	}
+
+	/**
+	 * Returns the export path for dictionary files
+	 * 
+	 * @param separator
+	 *            the file separator to use
+	 * @return the export path
+	 */
+	private static String getExportPath(char separator) {
+		String exportPath = DictionaryPreferences.DEFAULT_EXPORT_PATH;
+
+		// Accepts both types of separators, ends with separator
+		exportPath = FileUtils.convertSeparators(separator, exportPath, true);
+		return exportPath;
+	}
+
+	/**
+	 * Gets the default path to the dictionary file
+	 * 
+	 * @param model
+	 *            trace model
+	 * @return the file
+	 */
+	static String getPathForDictionary(TraceModel model) {
+		String fileName = model.getName()
+				+ DictionaryFileConstants.DICTIONARY_FILE_EXTENSION;
+		String exportPath = getExportPath(File.separatorChar);
+		String envRoot = TraceCompilerEngineGlobals.getConfiguration().getText(
+				TraceCompilerEngineConfiguration.ENVIRONMENT_ROOT);
+		return FileUtils.convertSeparators(SourceConstants.FORWARD_SLASH_CHAR,
+				envRoot + exportPath + fileName, false);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryFileRef.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,60 @@
+/*
+* 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:
+*
+* Reference to a file
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary;
+
+/**
+ * Reference to a file
+ * 
+ */
+final class DictionaryFileRef extends DictionaryRef {
+
+	/**
+	 * File name
+	 */
+	String file;
+
+	/**
+	 * File path
+	 */
+	String path;
+
+	/**
+	 * Trace
+	 */
+	com.nokia.tracecompiler.model.Trace trace;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param file
+	 *            the file name
+	 * @param path
+	 *            the file path
+	 * @param trace
+	 *            the trace
+	 */
+	DictionaryFileRef(String file, String path,
+			com.nokia.tracecompiler.model.Trace trace) {
+		super(0);
+		this.file = file;
+		this.path = path;
+		this.trace = trace;
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryFileWriter.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,586 @@
+/*
+* Copyright (c) 2008-2010 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:
+*
+* Writer for dictionary file
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.DataType;
+import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.Dictionary;
+import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.LocationStore;
+import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TraceComponent;
+import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TraceDataStore;
+import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TraceDictionaryEncoder;
+import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TypeDef;
+import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TypeDefStore;
+import com.nokia.tracecompiler.engine.LocationListBase;
+import com.nokia.tracecompiler.engine.LocationProperties;
+import com.nokia.tracecompiler.file.FileUtils;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceConstantTable;
+import com.nokia.tracecompiler.model.TraceConstantTableEntry;
+import com.nokia.tracecompiler.model.TraceGroup;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.model.TraceObjectUtils;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.project.FormattingUtils;
+import com.nokia.tracecompiler.project.PropertyNames;
+import com.nokia.tracecompiler.project.TraceProjectAPI;
+import com.nokia.tracecompiler.project.TraceProjectAPI.TraceFormatFlags;
+import com.nokia.tracecompiler.rules.FillerParameterRule;
+import com.nokia.tracecompiler.rules.HiddenTraceObjectRule;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SourceUtils;
+
+/**
+ * Writer for dictionary file
+ * 
+ */
+final class DictionaryFileWriter {
+
+	/**
+	 * Comparator for file references
+	 */
+	private final class FileRefComparator implements
+			Comparator<DictionaryFileRef> {
+		public int compare(DictionaryFileRef o1, DictionaryFileRef o2) {
+			int val = o1.path.compareTo(o2.path);
+			if (val == 0) {
+				val = o1.file.compareTo(o2.file);
+			}
+			return val;
+		}
+	}
+
+	/**
+	 * Dictionary file
+	 */
+	private DictionaryFile dictionaryFile;
+
+	/**
+	 * Sequential number for trace definitions
+	 */
+	private int defref;
+
+	/**
+	 * Sequential number for file definitions
+	 */
+	private int fileref;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param dictionaryFile
+	 *            the dictionary file
+	 */
+	DictionaryFileWriter(DictionaryFile dictionaryFile) {
+		this.dictionaryFile = dictionaryFile;
+	}
+
+	/**
+	 * Writes the dictionary file
+	 */
+	void write() {
+		defref = 0;
+		fileref = 0;
+		File file = new File(dictionaryFile.getAbsolutePathWithID());
+		// Delete removes possible read-only flags
+		if (file.exists()) {
+			file.delete();
+		}
+
+		TraceDictionaryEncoder encoder = new TraceDictionaryEncoder();
+		File path = file.getParentFile();
+		if (!path.exists()) {
+			FileUtils.createDirectories(path);
+		}
+		encoder.createNewDictionary(file.getAbsolutePath());
+		Dictionary.startDictionary();
+		createTypedefs();
+		createDefs();
+		createLocations();
+		createComponent();
+		Dictionary.endDictionary();
+	}
+
+	/**
+	 * Creates the type definitions
+	 */
+	private void createTypedefs() {
+		TypeDefStore.startTypeDefs();
+		ArrayList<String> typeList = buildTypeList();
+		writeTypeDefinitions(typeList);
+		TypeDefStore.endTypeDefs();
+	}
+
+	/**
+	 * Builds the list of parameter types
+	 * 
+	 * @return the list of types found from the model
+	 */
+	private ArrayList<String> buildTypeList() {
+		TraceModel model = dictionaryFile.getOwner().getModel();
+		ArrayList<String> typeList = new ArrayList<String>();
+		for (TraceGroup group : model) {
+			for (Trace trace : group) {
+				for (TraceParameter parameter : trace) {
+					if ((parameter.getExtension(HiddenTraceObjectRule.class) == null)
+							|| (parameter
+									.getExtension(FillerParameterRule.class) != null)) {
+						String type = parameter.getType();
+						if (!typeList.contains(type)) {
+							typeList.add(type);
+						}
+					}
+				}
+			}
+		}
+		return typeList;
+	}
+
+	/**
+	 * Writes the data type definitions
+	 * 
+	 * @param typeList
+	 *            the list of data types
+	 */
+	private void writeTypeDefinitions(ArrayList<String> typeList) {
+		for (String type : typeList) {
+			DataType dt = mapTypeToDataType(type);
+			if (dt != null) {
+				// Normal parameters
+				int size = mapParameterTypeToSize(type);
+				String formatChar = SourceUtils.mapNormalTypeToFormat(type);
+				if (formatChar != null && formatChar.length() > 1
+						&& formatChar.charAt(0) == '%') {
+					formatChar = formatChar.substring(1);
+					TypeDefStore.writeTypeDef(type, size, formatChar, dt);
+
+					// Write alternative format characters
+					writeAlternativeFormatChars(formatChar, type, size, dt);
+
+				} else {
+					TypeDefStore.writeTypeDef(type, size, null, dt);
+				}
+			} else {
+				// Enum parameters
+				TraceModel model = dictionaryFile.getOwner().getModel();
+				TraceConstantTable table = model.findConstantTableByName(type);
+				if (table != null) {
+					TypeDefStore.startTypeDef(table.getName(),
+							mapParameterTypeToSize(table.getType()), null,
+							DataType.ENUM);
+					for (TraceConstantTableEntry entry : table) {
+						TypeDef.writeTypeMember(entry.getID(), entry.getName(),
+								null);
+					}
+					TypeDefStore.endTypeDef();
+				}
+			}
+		}
+	}
+
+	/**
+	 * Writes alternative format characters to the Dictionary
+	 * 
+	 * @param formatChar
+	 *            formatchar
+	 * @param type
+	 *            parameter type
+	 * @param size
+	 *            parameter size
+	 * @param dt
+	 *            data type
+	 */
+	private void writeAlternativeFormatChars(String formatChar, String type,
+			int size, DataType dt) {
+
+		// If there's big L, write also 'll' type
+		if (formatChar.indexOf('L') != -1) {
+
+			// Double small l
+			String newFormatChar = formatChar.replace("L", "ll"); //$NON-NLS-1$ //$NON-NLS-2$
+			TypeDefStore.writeTypeDef(type, size, newFormatChar, dt);
+			writeCapitalHexType(newFormatChar, type, size, dt);
+
+		}
+
+		// Write alternative option to float types
+		else if (formatChar.equals("f") || formatChar.equals("e") //$NON-NLS-1$//$NON-NLS-2$
+				|| formatChar.equals("g")) { //$NON-NLS-1$
+
+			String newFormatChar = 'L' + formatChar;
+			TypeDefStore.writeTypeDef(type, size, newFormatChar, dt);
+		}
+
+		else {
+			// If length is one, add also formatchar with "l"
+			if (formatChar.length() == 1) {
+				String newFormatChar = "l" + formatChar; //$NON-NLS-1$
+				TypeDefStore.writeTypeDef(type, size, newFormatChar, dt);
+				writeCapitalHexType(newFormatChar, type, size, dt);
+			}
+
+			// Check capital hex need
+			writeCapitalHexType(formatChar, type, size, dt);
+		}
+	}
+
+	/**
+	 * Writes capital hex type
+	 * 
+	 * @param formatChar
+	 *            formatchar
+	 * @param type
+	 *            parameter type
+	 * @param size
+	 *            parameter size
+	 * @param dt
+	 *            data type
+	 */
+	private void writeCapitalHexType(String formatChar, String type, int size,
+			DataType dt) {
+
+		// Write also capital X if there are hex values
+		if (formatChar.indexOf('x') != -1) {
+			type = type.toUpperCase();
+			TypeDefStore.writeTypeDef(type, size, formatChar.replace('x', 'X'),
+					dt);
+		}
+	}
+
+	/**
+	 * Gets the parameter size from type
+	 * 
+	 * @param type
+	 *            the type
+	 * @return the size in bytes
+	 */
+	private int mapParameterTypeToSize(String type) {
+		int size = SourceUtils.mapParameterTypeToSize(type);
+		if (size == 0) {
+			if (type.equals(TraceParameter.ASCII)) {
+				size = 1;
+			} else if (type.equals(TraceParameter.UNICODE)) {
+				size = 2; // CodForChk_Dis_Magic
+			}
+		}
+		return size;
+	}
+
+	/**
+	 * Creates the trace definitions
+	 */
+	private void createDefs() {
+		// This should check for duplicates
+		TraceDataStore.startDataStore();
+		TraceModel model = dictionaryFile.getOwner().getModel();
+		TraceProjectAPI api = model.getExtension(TraceProjectAPI.class);
+		for (TraceGroup group : model) {
+			for (Trace trace : group) {
+				trace.addExtension(new DictionaryDefRef(++defref));
+				TraceFormatFlags flags = new TraceFormatFlags();
+				flags.isFormattingSupported = true;
+				String data = api.formatTraceForExport(trace, flags);
+				data = replaceUnescapeQuotes(data);
+				TraceDataStore.writeData(defref, DataType.STRING, data);
+			}
+		}
+		TraceDataStore.endDataStore();
+	}
+
+	/**
+	 * Replaces unescape quates
+	 * 
+	 * @param data
+	 *            the data
+	 * @return the new string
+	 */
+	private String replaceUnescapeQuotes(String data) {
+		data = data.replace("\\\"", "\""); //$NON-NLS-1$ //$NON-NLS-2$
+		return data;
+	}
+
+	/**
+	 * Maps a basic type to a Dictionary data type
+	 * 
+	 * @param type
+	 *            the type
+	 * @return the data type
+	 */
+	private DataType mapTypeToDataType(String type) { // CodForChk_Dis_ComplexFunc
+		DataType retval;
+		// Unsigned is not supported in Dictionary
+		if (type.equals(TraceParameter.SDEC32)) {
+			retval = DataType.INTEGER;
+		} else if (type.equals(TraceParameter.HEX32)) {
+			retval = DataType.HEX;
+		} else if (type.equals(TraceParameter.UDEC32)) {
+			retval = DataType.INTEGER;
+		} else if (type.equals(TraceParameter.OCT32)) {
+			retval = DataType.OCTAL;
+		} else if (type.equals(TraceParameter.SDEC16)) {
+			retval = DataType.INTEGER;
+		} else if (type.equals(TraceParameter.HEX16)) {
+			retval = DataType.HEX;
+		} else if (type.equals(TraceParameter.UDEC16)) {
+			retval = DataType.INTEGER;
+		} else if (type.equals(TraceParameter.OCT16)) {
+			retval = DataType.OCTAL;
+		} else if (type.equals(TraceParameter.SDEC8)) {
+			retval = DataType.INTEGER;
+		} else if (type.equals(TraceParameter.HEX8)) {
+			retval = DataType.HEX;
+		} else if (type.equals(TraceParameter.UDEC8)) {
+			retval = DataType.INTEGER;
+		} else if (type.equals(TraceParameter.OCT8)) {
+			retval = DataType.OCTAL;
+		} else if (type.equals(TraceParameter.SDEC64)) {
+			retval = DataType.INTEGER;
+		} else if (type.equals(TraceParameter.HEX64)) {
+			retval = DataType.HEX;
+		} else if (type.equals(TraceParameter.UDEC64)) {
+			retval = DataType.INTEGER;
+		} else if (type.equals(TraceParameter.OCT64)) {
+			retval = DataType.OCTAL;
+		} else if (type.equals(TraceParameter.ASCII)) {
+			retval = DataType.STRING;
+		} else if (type.equals(TraceParameter.UNICODE)) {
+			retval = DataType.STRING;
+		} else if (type.equals(TraceParameter.FLOAT_FIX)) {
+			retval = DataType.FLOAT;
+		} else if (type.equals(TraceParameter.FLOAT_EXP)) {
+			retval = DataType.FLOAT;
+		} else if (type.equals(TraceParameter.FLOAT_OPT)) {
+			retval = DataType.FLOAT;
+		} else if (type.equals(TraceParameter.POINTER)) {
+			retval = DataType.HEX;
+		} else {
+			retval = null;
+		}
+		return retval;
+	}
+
+	/**
+	 * Creates the location definitions
+	 */
+	private void createLocations() {
+		ArrayList<DictionaryFileRef> files = new ArrayList<DictionaryFileRef>();
+		LocationStore.startLocations();
+		for (TraceGroup group : dictionaryFile.getOwner().getModel()) {
+			for (Trace trace : group) {
+				writeLocation(files, trace);
+			}
+		}
+		// Build XML and assign ID's to refs
+		Collections.sort(files, new FileRefComparator());
+		String lastpath = null;
+		for (DictionaryFileRef ref : files) {
+			if (!ref.path.equals(lastpath)) {
+				if (lastpath != null) {
+					LocationStore.endPath();
+				}
+				LocationStore.startPath(ref.path);
+				lastpath = ref.path;
+			}
+			LocationStore.writeFile(++fileref, ref.file);
+			ref.refid = fileref;
+		}
+		if (lastpath != null) {
+			LocationStore.endPath();
+		}
+		LocationStore.endLocations();
+	}
+
+	/**
+	 * Writes the location of a trace
+	 * 
+	 * @param files
+	 *            file references
+	 * @param trace
+	 *            trace to be written
+	 */
+	private void writeLocation(ArrayList<DictionaryFileRef> files, Trace trace) {
+		LocationProperties loc = findFirstLocation(trace);
+		if (loc != null) {
+			String path = loc.getFilePath();
+			String file = loc.getFileName();
+			if (path != null) {
+				path = FileUtils.convertSeparators(
+						SourceConstants.FORWARD_SLASH_CHAR, path, true);
+				// TODO: Remove drive letter. Actually cannot remove drive
+				// letter because EPOCROOT might not be in the root of the drive
+			}
+			DictionaryFileRef ref = getRef(files, file, path);
+			if (ref == null) {
+				ref = new DictionaryFileRef(file, path, trace);
+				files.add(ref);
+				trace.addExtension(ref);
+			} else {
+				trace.addExtension(ref);
+			}
+		}
+	}
+
+	/**
+	 * Finds the first location from trace
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @return the location
+	 */
+	private LocationProperties findFirstLocation(Trace trace) {
+		Iterator<LocationListBase> itr = trace
+				.getExtensions(LocationListBase.class);
+		LocationProperties loc = null;
+		while (itr.hasNext() && loc == null) {
+			Iterator<LocationProperties> locs = itr.next().iterator();
+			if (locs.hasNext()) {
+				loc = locs.next();
+			}
+		}
+		return loc;
+	}
+
+	/**
+	 * Gets a file reference
+	 * 
+	 * @param files
+	 *            the list of file references
+	 * @param file
+	 *            file name
+	 * @param path
+	 *            file path
+	 * @return the file reference
+	 */
+	private DictionaryFileRef getRef(ArrayList<DictionaryFileRef> files,
+			String file, String path) {
+		DictionaryFileRef retval = null;
+		for (int i = 0; i < files.size() && retval == null; i++) {
+			DictionaryFileRef ref = files.get(i);
+			if (ref.file.equals(file) && ref.path.equals(path)) {
+				retval = ref;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Creates the component definition
+	 */
+	private void createComponent() {
+		TraceModel model = dictionaryFile.getOwner().getModel();
+		int compid = model.getID();
+		// Component prefix and suffix are in property file.
+		// If not there, the default values are used
+		String prefix = TraceObjectUtils.findProperty(model,
+				PropertyNames.PREFIX);
+		if (prefix == null || prefix.length() == 0) {
+			prefix = FormattingUtils.getDefaultComponentPrefix(model);
+		}
+		String suffix = TraceObjectUtils.findProperty(model,
+				PropertyNames.SUFFIX);
+		if (suffix == null || suffix.length() == 0) {
+			suffix = FormattingUtils.getDefaultComponentSuffix(model);
+		}
+		Dictionary.startComponent(compid, dictionaryFile.getProjectName(),
+				prefix, suffix);
+		for (TraceGroup group : model) {
+			createGroup(group);
+		}
+		Dictionary.endComponent();
+	}
+
+	/**
+	 * Creates a group definition
+	 * 
+	 * @param group
+	 *            the group
+	 */
+	private void createGroup(TraceGroup group) {
+		String prefix = TraceObjectUtils.findProperty(group,
+				PropertyNames.PREFIX);
+		if (prefix == null || prefix.length() == 0) {
+			prefix = FormattingUtils.getDefaultGroupPrefix(group);
+		}
+		String suffix = TraceObjectUtils.findProperty(group,
+				PropertyNames.SUFFIX);
+		if (suffix == null || suffix.length() == 0) {
+			suffix = FormattingUtils.getDefaultGroupSuffix(group);
+		}
+		TraceComponent.startGroup(group.getID(), group.getName(), prefix,
+				suffix);
+		for (Trace trace : group) {
+			createTrace(trace);
+		}
+		TraceComponent.endGroup();
+	}
+
+	/**
+	 * Creates a trace definition
+	 * 
+	 * @param trace
+	 *            the trace
+	 */
+	private void createTrace(Trace trace) {
+		DictionaryDefRef defref = trace.getExtension(DictionaryDefRef.class);
+		if (defref != null) {
+			DictionaryFileRef fileref = trace
+					.getExtension(DictionaryFileRef.class);
+			com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TraceGroup.startTrace(defref
+					.getRefId(), trace.getName());
+			if (fileref != null) {
+				writeTraceWithLocation(fileref.getRefId(), trace);
+			} else {
+				com.nokia.tracecompiler.decodeplugins.dictionary.encoder.Trace.writeInstance(trace
+						.getID(), 0, 0, "", //$NON-NLS-1$
+						""); //$NON-NLS-1$
+			}
+			com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TraceGroup.endTrace();
+		}
+		trace.removeExtensions(DictionaryRef.class);
+
+	}
+
+	/**
+	 * Writes a trace which has a source location
+	 * 
+	 * @param refId
+	 *            file reference number
+	 * @param trace
+	 *            the trace
+	 */
+	private void writeTraceWithLocation(int refId, Trace trace) {
+		LocationProperties loc = findFirstLocation(trace);
+		int line = 0;
+		String className = ""; //$NON-NLS-1$
+		String functionName = ""; //$NON-NLS-1$
+		if (loc != null) {
+			line = loc.getLineNumber();
+			className = loc.getClassName();
+			functionName = loc.getFunctionName();
+		}
+		com.nokia.tracecompiler.decodeplugins.dictionary.encoder.Trace.writeInstance(trace.getID(),
+				refId, line, functionName, className);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryPreferences.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Preferences for dictionary
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary;
+
+/**
+ * Preferences for dictionary
+ * 
+ */
+public interface DictionaryPreferences {
+
+	/**
+	 * Export path for dictionary files
+	 */
+	String EXPORT_PATH = "Dictionary.exportPath"; //$NON-NLS-1$
+
+	/**
+	 * Default path where to export dictionary files
+	 */
+	String DEFAULT_EXPORT_PATH = "epoc32/ost_dictionaries"; //$NON-NLS-1$
+
+	/**
+	 * Gets a property from preferences
+	 * 
+	 * @param name
+	 *            the property name
+	 * @return the property value
+	 */
+	public String getString(String name);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryRef.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,72 @@
+/*
+* 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:
+*
+* Reference base class
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary;
+
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceObject;
+
+/**
+ * Reference base class
+ * 
+ */
+class DictionaryRef implements TraceModelExtension {
+
+	/**
+	 * Reference id
+	 */
+	int refid;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param refid
+	 *            the reference id
+	 */
+	DictionaryRef(int refid) {
+		this.refid = refid;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtension#getOwner()
+	 */
+	public TraceObject getOwner() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtension#
+	 *      setOwner(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void setOwner(TraceObject owner) {
+	}
+
+	/**
+	 * Gets the reference id
+	 * 
+	 * @return ID
+	 */
+	int getRefId() {
+		return refid;
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/Messages.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,64 @@
+/*
+* 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:
+*
+* Localization for dictionary package
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Localization for dictionary package
+ * 
+ */
+class Messages {
+
+	/**
+	 * Bundle name
+	 */
+	private static final String BUNDLE_NAME = "com.nokia.tracecompiler.decodeplugins.dictionary.messages"; //$NON-NLS-1$
+
+	/**
+	 * Bundle
+	 */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Prevents construction
+	 */
+	private Messages() {
+
+	}
+
+	/**
+	 * Gets localized string based on key
+	 * 
+	 * @param key
+	 *            the resource key
+	 * @return the localized resource
+	 */
+	public static String getString(String key) {
+		String value;
+		try {
+			value = RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			value = '!' + key + '!';
+		}
+		return value;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/DataType.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,96 @@
+/*
+* 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:
+*
+* DataType enumeration
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * DataType enumeration
+ * 
+ */
+public enum DataType {
+
+	/**
+	 * String type
+	 */
+	STRING("string"), //$NON-NLS-1$
+
+	/**
+	 * Integer type
+	 */
+	INTEGER("integer"), //$NON-NLS-1$
+
+	/**
+	 * Float type
+	 */
+	FLOAT("float"), //$NON-NLS-1$
+
+	/**
+	 * Hex type
+	 */
+	HEX("hex"), //$NON-NLS-1$
+
+	/**
+	 * Binary type
+	 */
+	BINARY("binary"), //$NON-NLS-1$
+
+	/**
+	 * Octal type
+	 */
+	OCTAL("octal"), //$NON-NLS-1$
+
+	/**
+	 * Enum type
+	 */
+	ENUM("enum"), //$NON-NLS-1$
+
+	/**
+	 * Raw type
+	 */
+	RAW("raw"), //$NON-NLS-1$
+
+	/**
+	 * Compound type
+	 */
+	COMPOUND("compound"); //$NON-NLS-1$
+
+	/**
+	 * Data type
+	 */
+	private final String type;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param type
+	 *            the type
+	 */
+	private DataType(String type) {
+		this.type = type;
+	}
+
+	/**
+	 * Gets the type as string
+	 * 
+	 * @return type
+	 */
+	public String getType() {
+		return type;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/Dictionary.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,101 @@
+/*
+* 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:
+*
+* Dictionary tag
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * Dictionary tag
+ * 
+ */
+public class Dictionary {
+
+	/**
+	 * Writes start of the XML file and starts &lt;tracedictionary&gt; structure
+	 */
+	public static void startDictionary() {
+		TagWriter.write(TagWriter.XML_START, TagWriter.INDENT_0);
+		TagWriter.write(TagWriter.DICTIONARY_START, TagWriter.INDENT_0);
+	}
+
+	/**
+	 * Writes &lt;/tracedictionary&gt;
+	 */
+	public static void endDictionary() {
+		TagWriter.write(TagWriter.DICTIONARY_END, TagWriter.INDENT_0);
+		TagWriter.close();
+	}
+
+	/**
+	 * Starts &lt;component id="", name="" prefix="" suffix=""&gt; structure
+	 * 
+	 * @param id
+	 *            unique component id within dictionary
+	 * @param name
+	 *            name of the component
+	 * @param prefix
+	 *            optional prefix for the component
+	 * @param suffix
+	 *            optional suffix for the component
+	 */
+	public static void startComponent(int id, String name, String prefix,
+			String suffix) {
+		TraceComponent.startComponent(id, name, prefix, suffix);
+
+	}
+
+	/**
+	 * Writes &lt;/component&gt;
+	 */
+	public static void endComponent() {
+		TraceComponent.endComponent();
+	}
+
+	/**
+	 * Starts &lt;metadata&gt; structure
+	 */
+	public static void startMetaData() {
+		TagWriter.write(TagWriter.METADATA_START, TagWriter.INDENT_1);
+	}
+
+	/**
+	 * Writes user defined tags &lt;mytagXXX&gt;value&lt;/mytagXXX&gt;
+	 * 
+	 * @param name
+	 *            tag
+	 * @param value
+	 *            value of the tag
+	 */
+	public static void writeMetaData(String name, String value) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.START_TAG_OPEN);
+		sb.append(name);
+		sb.append(TagWriter.TAG_CLOSE);
+		sb.append(XMLDataFilter.changeData(value));
+		sb.append(TagWriter.END_TAG_OPEN);
+		sb.append(name);
+		sb.append(TagWriter.TAG_CLOSE);
+		TagWriter.write(sb.toString(), TagWriter.INDENT_2);
+	}
+
+	/**
+	 * Writes &lt;/metadata&gt;
+	 */
+	public static void endMetaData() {
+		TagWriter.write(TagWriter.METADATA_END, TagWriter.INDENT_1);
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/LocationStore.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,81 @@
+/*
+* 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:
+*
+* Location store
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * Location store
+ * 
+ */
+public class LocationStore {
+
+	/**
+	 * Writes &lt;locations&gt;
+	 */
+	public static void startLocations() {
+		TagWriter.write(TagWriter.LOCATIONS_START, TagWriter.INDENT_1);
+	}
+
+	/**
+	 * Starts &lt;path val=""&gt; structure
+	 * 
+	 * @param path
+	 *            relative or absolute path to some directory
+	 */
+	public static void startPath(String path) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.PATH_START_OPEN);
+		TagWriter.appendAttribute(sb, TagWriter.VAL_ATTR, path, false);
+		sb.append(TagWriter.TAG_CLOSE);
+		TagWriter.write(sb.toString(), TagWriter.INDENT_2);
+	}
+
+	/**
+	 * Writes &lt;file id=""&gt;fileName&lt;/file&gt; structure
+	 * 
+	 * @param id
+	 *            unique number within &lt;locations&gt; structure
+	 * @param fileName
+	 *            value of the file element
+	 */
+	public static void writeFile(int id, String fileName) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.FILE_START_OPEN);
+		TagWriter.appendAttribute(sb, TagWriter.ID_ATTR, String.valueOf(id),
+				false);
+		sb.append(TagWriter.TAG_CLOSE);
+		sb.append(XMLDataFilter.changeData(fileName));
+		sb.append(TagWriter.FILE_END);
+		TagWriter.write(sb.toString(), TagWriter.INDENT_3);
+	}
+
+	/**
+	 * Writes &lt;/path&gt;
+	 */
+	public static void endPath() {
+		TagWriter.write(TagWriter.PATH_END, TagWriter.INDENT_2);
+	}
+
+	/**
+	 * Writes &lt;/locations&gt;
+	 */
+	public static void endLocations() {
+		TagWriter.write(TagWriter.LOCATIONS_END, TagWriter.INDENT_1);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/Options.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,69 @@
+/*
+* 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:
+*
+* Options
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * Options
+ * 
+ */
+public class Options {
+
+	/**
+	 * Writes &lt;options&gt;
+	 * 
+	 * @param indent
+	 *            amount of tabs for indent
+	 */
+	static void startOptions(int indent) {
+		TagWriter.write(TagWriter.OPTIONS_START, indent);
+	}
+
+	/**
+	 * Writes &lt;/options&gt;
+	 * 
+	 * @param indent
+	 *            amount of tabs for indent
+	 */
+	static void endOptions(int indent) {
+		TagWriter.write(TagWriter.OPTIONS_END, indent);
+	}
+
+	/**
+	 * Writes user defined tags &lt;mytagXXX&gt;value&lt;/mytagXXX&gt;
+	 * 
+	 * @param tag
+	 *            user defined tag
+	 * @param value
+	 *            value of the tag
+	 * @param indent
+	 *            amount of tabs for indent
+	 */
+	static void writeOptions(String tag, String value, int indent) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.START_TAG_OPEN);
+		sb.append(tag);
+		sb.append(TagWriter.TAG_CLOSE);
+		sb.append(XMLDataFilter.changeData(value));
+		sb.append(TagWriter.END_TAG_OPEN);
+		sb.append(tag);
+		sb.append(TagWriter.TAG_CLOSE);
+		TagWriter.write(sb.toString(), indent);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TagWriter.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,489 @@
+/*
+* 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:
+*
+* Tag writer
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+
+/**
+ * Tag writer
+ * 
+ */
+class TagWriter {
+
+	/**
+	 * 
+	 */
+	private static final String OUTPUT_FORMAT_UTF8 = "UTF-8"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	private static OutputStreamWriter m_writer = null;
+
+	/**
+	 * 
+	 */
+	static final String XML_START = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String CLASSIFICATION_ATTR = "classification="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String CLASSNAME_ATTR = "classname="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String COMPONENT_START_OPEN = "<component "; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String COMPONENT_END = "</component>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String DATA_REF_ATTR = "data-ref="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String DATASTORE_START = "<datastore>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String DATASTORE_END = "<datastore>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String DEF_END = "</def>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String DEF_START_OPEN = "<def "; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String DICTIONARY_START = "<tracedictionary xmlns:xsi=" + //$NON-NLS-1$
+			"\"http://www.w3.org/2001/XMLSchema-instance\" " + //$NON-NLS-1$
+			"xsi:noNamespaceSchemaLocation=\"DictionarySchema.xsd\">";//$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String DICTIONARY_END = "</tracedictionary>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String END_TAG_OPEN = "</"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String EXTERNAL_DEF_END = "</external-def>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String EXTERNAL_DEF_START = "<external-def>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String FILE_START_OPEN = "<file "; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String FILE_END = "</file>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String FORMATCHAR_ATTR = "formatchar="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String GROUP_END = "</group>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String GROUP_START_OPEN = "<group "; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String ID_ATTR = "id="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String INSTANCE_START_OPEN = "<instance "; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String INSTANCE_END = "</instance>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String LINE_ATTR = "line="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String LOC_REF_ATTR = "loc-ref="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String LOCATIONS_START = "<locations>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String LOCATIONS_END = "</locations>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String METHODNAME_ATTR = "methodname="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String METADATA_START = "<metadata>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String METADATA_END = "</metadata>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String NAME_ATTR = "name="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String NAME_START = "<name>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String NAME_END = "</name>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String OBJECT_END = "</object>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String OBJECT_START = "<object>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String OBJECT_START_OPEN = "<object "; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String OPTIONS_START = "<options>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String OPTIONS_START_OPEN = "<options "; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String OPTIONS_END = "</options>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String PATH_START_OPEN = "<path "; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String PATH_END = "</path>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String PREFIX_ATTR = "prefix="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String QUOTE = "\""; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String ROW_CHANGE = "\n"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String SIZE_ATTR = "size="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String SPACE = " "; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String START_TAG_OPEN = "<"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String SUFFIX_ATTR = "suffix="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TAB = "\t"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TAG_CLOSE = ">"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TAG_END = "/>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TRACE_END = "</trace>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TRACE_START = "<trace>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TRACE_START_OPEN = "<trace "; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TRACE_DATA_END = "</data>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TRACE_DATA_START = "<data>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TYPE_ATTR = "type="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TYPEDEFS_START = "<typedefs>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TYPEDEFS_END = "</typedefs>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TYPEMEMBER_END = "</typemember>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TYPEMEMBER_START = "<typemember>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String TYPEMEMBER_START_OPEN = "<typemember "; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String VAL_ATTR = "val="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String VALUE_ATTR = "value="; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String VALUE_START = "<value>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final String VALUE_END = "</value>"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	static final int INDENT_0 = 0;
+
+	/**
+	 * 
+	 */
+	static final int INDENT_1 = 1;
+
+	/**
+	 * 
+	 */
+	static final int INDENT_2 = 2; // CodForChk_Dis_Magic
+
+	/**
+	 * 
+	 */
+	static final int INDENT_3 = 3;// CodForChk_Dis_Magic
+
+	/**
+	 * 
+	 */
+	static final int INDENT_4 = 4;// CodForChk_Dis_Magic
+
+	/**
+	 * 
+	 */
+	static final int INDENT_5 = 5;// CodForChk_Dis_Magic
+
+	/**
+	 * 
+	 */
+	static final int INDENT_6 = 6;// CodForChk_Dis_Magic
+
+	/**
+	 * Initializes TagWriter
+	 * 
+	 * @param filePath
+	 *            name of the output file
+	 */
+	static void initialize(String filePath) {
+		try {
+			OutputStream fout = new FileOutputStream(filePath);
+			OutputStream bout = new BufferedOutputStream(fout);
+			m_writer = new OutputStreamWriter(bout, OUTPUT_FORMAT_UTF8);
+		} catch (java.io.IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Writes tag to XML file
+	 * 
+	 * @param tag
+	 *            name of the tag
+	 * @param indent
+	 *            amount of tabs for indent
+	 */
+	static void write(String tag, int indent) {
+		try {
+			StringBuffer sb = new StringBuffer();
+			for (int i = 0; i < indent; i++) {
+				sb.append(TAB);
+			}
+			sb.append(tag);
+			sb.append(ROW_CHANGE);
+			m_writer.write(sb.toString());
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Appends attribute to given StringBuffer
+	 * 
+	 * @param sb
+	 *            buffer to be updated
+	 * @param attribute
+	 *            attribute to append
+	 * @param value
+	 *            value of the attribute
+	 * @param withSpace
+	 *            is there leading space before attribute
+	 */
+	static void appendAttribute(StringBuffer sb, String attribute,
+			String value, boolean withSpace) {
+		if (value != null) {
+			if (withSpace) {
+				sb.append(SPACE);
+			}
+			sb.append(attribute);
+			sb.append(QUOTE);
+			sb.append(value);
+			sb.append(QUOTE);
+		}
+	}
+
+	/**
+	 * Closes TagWriter
+	 */
+	static void close() {
+		try {
+			m_writer.flush();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+		try {
+			m_writer.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TestEncoder.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,133 @@
+/*
+* 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:
+*
+* Testing class for Encoder
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * Testing class for Encoder
+ * 
+ */
+public class TestEncoder {
+
+	/**
+	 * 
+	 */
+	private static final String DICTIONARY1 = "c:\\Temp\\traces.xml"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	private static final String DICTIONARY2 = "c:\\Temp\\traces2.xml"; //$NON-NLS-1$
+
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		TraceDictionaryEncoder encoder = new TraceDictionaryEncoder();
+		encoder.createNewDictionary(DICTIONARY1);
+		Dictionary.startDictionary();
+		Dictionary.startMetaData();
+		Dictionary.writeMetaData("name", "<Metadata>"); //$NON-NLS-1$ //$NON-NLS-2$
+		Dictionary.writeMetaData("id", "1"); //$NON-NLS-1$ //$NON-NLS-2$
+		Dictionary.endMetaData();
+		TypeDefStore.startTypeDefs();
+		TypeDefStore.writeExternalDefFile("<?xml version=\"1.0\" encoding=" //$NON-NLS-1$
+				+ "\"UTF-8\"?> <external>c:\\Temp\\ExternalDef.xml</external>"); //$NON-NLS-1$
+		TypeDefStore.startTypeDef("TBool", 1, null, DataType.BINARY); //$NON-NLS-1$
+		TypeDef.writeTypeMember(0, "EFalse", "BOOL"); //$NON-NLS-1$ //$NON-NLS-2$
+		TypeDef.writeTypeMember(-1, "iX", "TInt"); //$NON-NLS-1$ //$NON-NLS-2$
+		TypeDef.writeTypeMember(0, "EFalse", null); //$NON-NLS-1$
+		TypeDefStore.endTypeDef();
+		TypeDefStore.startTypeDef("TPoint", -1, null, DataType.COMPOUND); //$NON-NLS-1$
+		TypeDef.writeTypeMember(-1, "iX", "TInt"); //$NON-NLS-1$ //$NON-NLS-2$
+		TypeDef.writeTypeMember(-1, "iY", "TInt"); //$NON-NLS-1$ //$NON-NLS-2$
+		TypeDefStore.endTypeDef();
+		TypeDefStore.writeTypeDef("TPixel", 1, "u", DataType.RAW); //$NON-NLS-1$ //$NON-NLS-2$
+		TypeDefStore.endTypeDefs();
+		TraceDataStore.startDataStore();
+		TraceDataStore.writeData(3, DataType.HEX, "<hex> value is 0xFF"); //$NON-NLS-1$ CodForChk_Dis_Magic
+		TraceDataStore.writeData(2, DataType.OCTAL, "<octal> value is 8"); //$NON-NLS-1$ CodForChk_Dis_Magic
+		TraceDataStore.writeData(1, DataType.BINARY, "<binary> value is 0"); //$NON-NLS-1$
+		TraceDataStore.endDataStore();
+		LocationStore.startLocations();
+		LocationStore.startPath("<?xml version=\"1.0\" encoding=" //$NON-NLS-1$
+				+ "\"UTF-8\"?><file>C:\\Temp\\</file>"); //$NON-NLS-1$
+		LocationStore.writeFile(1, "<?xml version=\"1.0\" encoding=" //$NON-NLS-1$
+				+ "\"UTF-8\"?><file>C:\\Temp\\file1.txt</file>"); //$NON-NLS-1$
+		LocationStore.writeFile(2, "<?xml version=\"1.0\" encoding=" //$NON-NLS-1$ CodForChk_Dis_Magic
+				+ "\"UTF-8\"?><file>C:\\Temp\\file2.txt</file>"); //$NON-NLS-1$
+		LocationStore.endPath();
+		LocationStore.endLocations();
+		Dictionary.startComponent(666, "Satan", null, null); //$NON-NLS-1$ CodForChk_Dis_Magic
+		TraceComponent.startOptions();
+		TraceComponent.writeOption("background", "red"); //$NON-NLS-1$ //$NON-NLS-2$
+		TraceComponent.startGroup(1, "Group UNO", "pre", "suf"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		TraceGroup.startOptions();
+		TraceGroup.writeOption("JeesTag", "<Tampura>"); //$NON-NLS-1$ //$NON-NLS-2$
+		TraceGroup.writeOption("NoTag", "<Ilkves>"); //$NON-NLS-1$ //$NON-NLS-2$
+		TraceGroup.endOptions();
+		TraceGroup.startTrace(-1, null);
+		Trace.startOptions();
+		Trace.writeOption("MyTag", "Value"); //$NON-NLS-1$ //$NON-NLS-2$
+		Trace.endOptions();
+		Trace.writeInstance(99, 1, 22, "testMethod", "testClass"); //$NON-NLS-1$ //$NON-NLS-2$ CodForChk_Dis_Magic
+		TraceGroup.endTrace();
+		TraceGroup.startTrace(-1, null);
+		Trace.writeInstance(100, 1, 235, "heyBabe", "auts"); //$NON-NLS-1$ //$NON-NLS-2$ CodForChk_Dis_Magic
+		Trace.writeInstance(100, 2, 291, "heyBabe2", "auts2"); //$NON-NLS-1$ //$NON-NLS-2$ CodForChk_Dis_Magic
+		TraceGroup.endTrace();
+		TraceComponent.endGroup();
+		Dictionary.endComponent();
+		Dictionary.endDictionary();
+
+		TraceDictionaryEncoder encoder2 = new TraceDictionaryEncoder();
+		encoder2.createNewDictionary(DICTIONARY2);
+		Dictionary.startDictionary();
+		Dictionary.startMetaData();
+		Dictionary.writeMetaData("id", "1"); //$NON-NLS-1$ //$NON-NLS-2$
+		Dictionary.writeMetaData("name", "Metadata Example"); //$NON-NLS-1$ //$NON-NLS-2$
+		Dictionary.endMetaData();
+		TypeDefStore.startTypeDefs();
+		TypeDefStore.writeExternalDefFile("StandardTypeDefs.xml"); //$NON-NLS-1$
+		TypeDefStore.writeTypeDef("TUint", 4, "u", DataType.ENUM); //$NON-NLS-1$ //$NON-NLS-2$ CodForChk_Dis_Magic
+		TypeDefStore.startTypeDef("TBool", 1, null, DataType.ENUM); //$NON-NLS-1$
+		TypeDef.writeTypeMember(0, "EFalse", null); //$NON-NLS-1$
+		TypeDef.writeTypeMember(1, "ETrue", null); //$NON-NLS-1$
+		TypeDefStore.endTypeDef();
+		TraceDataStore.startDataStore();
+		TraceDataStore.writeData(1, DataType.STRING, "My integer value: %d"); //$NON-NLS-1$
+		TraceDataStore.endDataStore();
+		LocationStore.startLocations();
+		LocationStore.startPath("../src"); //$NON-NLS-1$
+		LocationStore.writeFile(1, "foo.cpp"); //$NON-NLS-1$
+		LocationStore.writeFile(2, "foo2.cpp"); //$NON-NLS-1$ CodForChk_Dis_Magic
+		LocationStore.endPath();
+		LocationStore.endLocations();
+		Dictionary.startComponent(12345678, "ComName", "ComPrefix", null); //$NON-NLS-1$ //$NON-NLS-2$ CodForChk_Dis_Magic
+		TraceComponent.startGroup(1, "Flow", "GroupPrefix", "GroupSuffix"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		TraceGroup.startTrace(1, null);
+		Trace.writeInstance(1, 1, 14, "MyGlobalMethodL", null); //$NON-NLS-1$ CodForChk_Dis_Magic
+		Trace.writeInstance(2, 1, 214, "MyClassMethod", null); //$NON-NLS-1$ CodForChk_Dis_Magic
+		TraceGroup.endTrace();
+		TraceComponent.endGroup();
+		Dictionary.endComponent();
+		Dictionary.endDictionary();
+
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/Trace.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,120 @@
+/*
+* 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:
+*
+* Writes Trace objects
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * Writes Trace objects
+ * 
+ */
+public class Trace {
+
+	/**
+	 * Starts &lt;trace data-ref=""&gt; structure
+	 * 
+	 * @param dataRef
+	 *            reference to actual data stored in &lt;data&gt; structure
+	 * @param name
+	 *            name of the trace. Can be null if trace doesn't have name
+	 */
+	static void startTrace(int dataRef, String name) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.TRACE_START_OPEN);
+		if (dataRef >= 0) {
+			TagWriter.appendAttribute(sb, TagWriter.DATA_REF_ATTR, String
+					.valueOf(dataRef), false);
+
+			if (name != null && name != "") { //$NON-NLS-1$
+				TagWriter.appendAttribute(sb, TagWriter.NAME_ATTR, name, true);
+			}
+		}
+		sb.append(TagWriter.TAG_CLOSE);
+		TagWriter.write(sb.toString(), TagWriter.INDENT_3);
+
+	}
+
+	/**
+	 * Writes &lt;/trace&gt;
+	 */
+	static void endTrace() {
+		TagWriter.write(TagWriter.TRACE_END, TagWriter.INDENT_3);
+	}
+
+	/**
+	 * Writes &lt;options&gt;
+	 */
+	public static void startOptions() {
+		Options.startOptions(TagWriter.INDENT_4);
+	}
+
+	/**
+	 * Writes &lt;/options&gt;
+	 */
+	public static void endOptions() {
+		Options.endOptions(TagWriter.INDENT_4);
+	}
+
+	/**
+	 * Writes user defined tags &lt;mytagXXX&gt;value&lt;/mytagXXX&gt;
+	 * 
+	 * @param tag
+	 *            user defined tag
+	 * @param value
+	 *            value of the tag
+	 */
+	public static void writeOption(String tag, String value) {
+		Options.writeOptions(tag, value, TagWriter.INDENT_5);
+	}
+
+	/**
+	 * Writes &lt;instance id="" locRef="" line="" methodName=""
+	 * className=""/&gt; structure
+	 * 
+	 * @param id
+	 *            unique id number for this instance in current group structure
+	 * @param locRef
+	 *            unique location reference for instance (reference to
+	 *            &lt;locations&gt; structure
+	 * @param line
+	 *            positive number of line where data were founded in source file
+	 * @param methodName
+	 *            name of the function from which trace was generated
+	 * @param className
+	 *            this is class name or namespace name for method described in
+	 *            methodname attribute
+	 */
+	public static void writeInstance(int id, int locRef, int line,
+			String methodName, String className) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.INSTANCE_START_OPEN);
+		TagWriter.appendAttribute(sb, TagWriter.ID_ATTR, String.valueOf(id),
+				false);
+		TagWriter.appendAttribute(sb, TagWriter.LOC_REF_ATTR, String
+				.valueOf(locRef), true);
+		TagWriter.appendAttribute(sb, TagWriter.LINE_ATTR,
+				String.valueOf(line), true);
+		TagWriter.appendAttribute(sb, TagWriter.METHODNAME_ATTR, methodName,
+				true);
+		if (className != null) {
+			TagWriter.appendAttribute(sb, TagWriter.CLASSNAME_ATTR, className,
+					true);
+		}
+		sb.append(TagWriter.TAG_END);
+		TagWriter.write(sb.toString(), TagWriter.INDENT_4);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TraceComponent.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Writes component objects
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * Writes component objects
+ * 
+ */
+public class TraceComponent {
+
+	/**
+	 * Starts &lt;component id="", name="" prefix="" suffix=""&gt; structure
+	 * 
+	 * @param id
+	 *            unique component id within dictionary
+	 * @param name
+	 *            name of the component
+	 * @param prefix
+	 *            optional prefix for the component
+	 * @param suffix
+	 *            optional suffix for the component
+	 */
+	static void startComponent(int id, String name, String prefix, String suffix) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.COMPONENT_START_OPEN);
+		TagWriter.appendAttribute(sb, TagWriter.ID_ATTR, String.valueOf(id),
+				false);
+		TagWriter.appendAttribute(sb, TagWriter.NAME_ATTR, name, true);
+		if (prefix != null) {
+			TagWriter.appendAttribute(sb, TagWriter.PREFIX_ATTR, prefix, true);
+		}
+		if (suffix != null) {
+			TagWriter.appendAttribute(sb, TagWriter.SUFFIX_ATTR, suffix, true);
+		}
+		sb.append(TagWriter.TAG_CLOSE);
+		TagWriter.write(sb.toString(), TagWriter.INDENT_1);
+	}
+
+	/**
+	 * Writes &lt;/component&gt;
+	 */
+	static void endComponent() {
+		TagWriter.write(TagWriter.COMPONENT_END, TagWriter.INDENT_1);
+	}
+
+	/**
+	 * Writes &lt;options&gt;
+	 */
+	public static void startOptions() {
+		Options.startOptions(TagWriter.INDENT_2);
+	}
+
+	/**
+	 * Writes user defined tags &lt;mytagXXX&gt;value&lt;/mytagXXX&gt;
+	 * 
+	 * @param tag
+	 *            user defined tag
+	 * @param value
+	 *            value of the tag
+	 */
+	public static void writeOption(String tag, String value) {
+		Options.writeOptions(tag, value, TagWriter.INDENT_3);
+	}
+
+	/**
+	 * Writes &lt;/options&gt;
+	 */
+	public static void endOptions() {
+		Options.endOptions(TagWriter.INDENT_2);
+	}
+
+	/**
+	 * Starts &lt;group id="", name="" prefix="" suffix=""&gt; structure
+	 * 
+	 * @param id
+	 *            unique group identifier within dictionary
+	 * @param name
+	 *            group name
+	 * @param prefix
+	 *            optional prefix for the group
+	 * @param suffix
+	 *            optional suffix for the group
+	 */
+	public static void startGroup(int id, String name, String prefix,
+			String suffix) {
+		TraceGroup.startGroup(id, name, prefix, suffix);
+	}
+
+	/**
+	 * Writes &lt;/group&gt;
+	 */
+	public static void endGroup() {
+		TraceGroup.endGroup();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TraceDataStore.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,66 @@
+/*
+* 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:
+*
+* Writes Data objects
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * Writes Data objects
+ * 
+ */
+public class TraceDataStore {
+
+	/**
+	 * Writes &lt;data&gt;
+	 */
+	public static void startDataStore() {
+		TagWriter.write(TagWriter.TRACE_DATA_START, TagWriter.INDENT_1);
+	}
+
+	/**
+	 * Writes &lt;def id="" dataType=""&gt;value&lt;/def&gt; structure
+	 * 
+	 * @param id
+	 *            unique number in &lt;data&gt; structure, it is data identifier
+	 * @param dataType
+	 *            data type, defaults to string
+	 * @param value
+	 *            the value
+	 * 
+	 */
+	public static void writeData(int id, DataType dataType, String value) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.DEF_START_OPEN);
+		TagWriter.appendAttribute(sb, TagWriter.ID_ATTR, String.valueOf(id),
+				false);
+		if (dataType != null) {
+			TagWriter.appendAttribute(sb, TagWriter.TYPE_ATTR, dataType
+					.getType(), true);
+		}
+		sb.append(TagWriter.TAG_CLOSE);
+		sb.append(XMLDataFilter.changeData(value));
+		sb.append(TagWriter.DEF_END);
+		TagWriter.write(sb.toString(), TagWriter.INDENT_2);
+	}
+
+	/**
+	 * Writes &lt;/data&gt;
+	 */
+	public static void endDataStore() {
+		TagWriter.write(TagWriter.TRACE_DATA_END, TagWriter.INDENT_1);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TraceDictionaryEncoder.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,42 @@
+/*
+* 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:
+*
+* Dictionary encoder class
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * Dictionary encoder class
+ * 
+ */
+public class TraceDictionaryEncoder {
+
+	/**
+	 * Constructor
+	 */
+	public TraceDictionaryEncoder() {
+	}
+
+	/**
+	 * Creates a new dictionary XML file to given path
+	 * 
+	 * @param filePath
+	 *            the path
+	 */
+	public void createNewDictionary(String filePath) {
+		TagWriter.initialize(filePath);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TraceGroup.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,107 @@
+/*
+* 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:
+*
+* Writes groups objects
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * Writes groups objects
+ * 
+ */
+public class TraceGroup {
+
+	/**
+	 * Writes &lt;options&gt;
+	 */
+	public static void startOptions() {
+		Options.startOptions(TagWriter.INDENT_3);
+	}
+
+	/**
+	 * Writes user defined tags &lt;mytagXXX&gt;value&lt;/mytagXXX&gt;
+	 * 
+	 * @param tag
+	 *            user defined tag
+	 * @param value
+	 *            value of the tag
+	 */
+	public static void writeOption(String tag, String value) {
+		Options.writeOptions(tag, value, TagWriter.INDENT_4);
+	}
+
+	/**
+	 * Writes &lt;/options&gt;
+	 */
+	public static void endOptions() {
+		Options.endOptions(TagWriter.INDENT_3);
+	}
+
+	/**
+	 * Starts &lt;trace data-ref=""&gt; structure
+	 * 
+	 * @param dataRef
+	 *            reference to actual data stored in &lt;data&gt; structure
+	 * @param name
+	 *            name of the trace. Can be null if trace doesn't have name            
+	 */
+	public static void startTrace(int dataRef, String name) {
+		Trace.startTrace(dataRef, name);
+	}
+
+	/**
+	 * Writes &lt;/trace&gt;
+	 */
+	public static void endTrace() {
+		Trace.endTrace();
+	}
+
+	/**
+	 * Starts &lt;group id="", name="" prefix="" suffix=""&gt; structure
+	 * 
+	 * @param id
+	 *            unique group identifier within dictionary
+	 * @param name
+	 *            group name
+	 * @param prefix
+	 *            optional prefix for the group
+	 * @param suffix
+	 *            optional suffix for the group
+	 */
+	static void startGroup(int id, String name, String prefix, String suffix) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.GROUP_START_OPEN);
+		TagWriter.appendAttribute(sb, TagWriter.ID_ATTR, String.valueOf(id),
+				false);
+		TagWriter.appendAttribute(sb, TagWriter.NAME_ATTR, name, true);
+		if (prefix != null) {
+			TagWriter.appendAttribute(sb, TagWriter.PREFIX_ATTR, prefix, true);
+		}
+		if (suffix != null) {
+			TagWriter.appendAttribute(sb, TagWriter.SUFFIX_ATTR, suffix, true);
+		}
+		sb.append(TagWriter.TAG_CLOSE);
+		TagWriter.write(sb.toString(), TagWriter.INDENT_2);
+
+	}
+
+	/**
+	 * Writes &lt;/group&gt;
+	 */
+	static void endGroup() {
+		TagWriter.write(TagWriter.GROUP_END, TagWriter.INDENT_2);
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TypeDef.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,52 @@
+/*
+* 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:
+*
+* Writes type def objects
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * Writes type def objects
+ * 
+ */
+public class TypeDef {
+
+	/**
+	 * Writes &lt;typemember value="" name="" type=""/&gt; structure
+	 * 
+	 * @param value
+	 *            value which will be assigned to name attribute in case where
+	 *            object have classification equals enum
+	 * @param name
+	 *            text which is assigned to value attribute or to type attribute
+	 * @param type
+	 *            name of data type that will be assigned to name attribute in
+	 *            case where object classification equals compound
+	 */
+	public static void writeTypeMember(int value, String name, String type) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.TYPEMEMBER_START_OPEN);
+		TagWriter.appendAttribute(sb, TagWriter.VALUE_ATTR, String
+				.valueOf(value), false);
+		TagWriter.appendAttribute(sb, TagWriter.NAME_ATTR, name, true);
+		if (type != null) { // optional attribute
+			TagWriter.appendAttribute(sb, TagWriter.TYPE_ATTR, type, true);
+		}
+		sb.append(TagWriter.TAG_END);
+		TagWriter.write(sb.toString(), TagWriter.INDENT_3);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/TypeDefStore.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,128 @@
+/*
+* 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:
+*
+* Writes type definition objects
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * Writes type definition objects
+ * 
+ */
+public class TypeDefStore {
+
+	/**
+	 * Writes &lt;typedef&gt;
+	 */
+	public static void startTypeDefs() {
+		TagWriter.write(TagWriter.TYPEDEFS_START, TagWriter.INDENT_1);
+	}
+
+	/**
+	 * Writes &lt;external-def&gt;path&lt;/external-def&gt; structure
+	 * 
+	 * @param path
+	 *            path to external dictionary file
+	 */
+	public static void writeExternalDefFile(String path) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.EXTERNAL_DEF_START);
+		sb.append(XMLDataFilter.changeData(path));
+		sb.append(TagWriter.EXTERNAL_DEF_END);
+		TagWriter.write(sb.toString(), TagWriter.INDENT_2);
+	}
+
+	/**
+	 * Starts &lt;object type="" size="" formatChar="" dataType=""&gt; structure
+	 * 
+	 * @param type
+	 *            original type name
+	 * @param size
+	 *            size of typical object, it’s optional because dictionary user
+	 *            can calculate size for compound types by sum size of each
+	 *            member. Give -1 if not used.
+	 * @param formatChar
+	 *            used for formatting
+	 * @param dataType
+	 *            one value form &lt;datatype&gt; enumeration
+	 */
+	public static void startTypeDef(String type, int size, String formatChar,
+			DataType dataType) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.OBJECT_START_OPEN);
+		TagWriter.appendAttribute(sb, TagWriter.TYPE_ATTR, type, false);
+		if (size >= 0) { // optional attribute
+			TagWriter.appendAttribute(sb, TagWriter.SIZE_ATTR, String
+					.valueOf(size), true);
+		}
+		if (formatChar != null) { // optional attribute
+			TagWriter.appendAttribute(sb, TagWriter.FORMATCHAR_ATTR,
+					formatChar, true);
+		}
+		TagWriter.appendAttribute(sb, TagWriter.CLASSIFICATION_ATTR, dataType
+				.getType(), true);
+		sb.append(TagWriter.TAG_CLOSE);
+		TagWriter.write(sb.toString(), TagWriter.INDENT_2);
+	}
+
+	/**
+	 * Writes &lt;object type="" size="" formatChar="" dataType=""/&gt;
+	 * structure
+	 * 
+	 * @param type
+	 *            original type name
+	 * @param size
+	 *            size of typical object, it’s optional because dictionary user
+	 *            can calculate size for compound types by sum size of each
+	 *            member. Give -1 if not used.
+	 * @param formatChar
+	 *            used for formatting
+	 * @param dataType
+	 *            one value form &lt;datatype&gt; enumeration
+	 */
+	public static void writeTypeDef(String type, int size, String formatChar,
+			DataType dataType) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(TagWriter.OBJECT_START_OPEN);
+		TagWriter.appendAttribute(sb, TagWriter.TYPE_ATTR, type, false);
+		if (size >= 0) {
+			TagWriter.appendAttribute(sb, TagWriter.SIZE_ATTR, String
+					.valueOf(size), true);
+		}
+		if (formatChar != null) {
+			TagWriter.appendAttribute(sb, TagWriter.FORMATCHAR_ATTR,
+					formatChar, true);
+		}
+		TagWriter.appendAttribute(sb, TagWriter.CLASSIFICATION_ATTR, dataType
+				.getType(), true);
+		sb.append(TagWriter.TAG_END);
+		TagWriter.write(sb.toString(), TagWriter.INDENT_2);
+	}
+
+	/**
+	 * Writes &lt;/object&gt;
+	 */
+	public static void endTypeDef() {
+		TagWriter.write(TagWriter.OBJECT_END, TagWriter.INDENT_2);
+	}
+
+	/**
+	 * Writes &lt;/typedef&gt;
+	 */
+	public static void endTypeDefs() {
+		TagWriter.write(TagWriter.TYPEDEFS_END, TagWriter.INDENT_1);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/XMLDataFilter.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,85 @@
+/*
+* 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:
+*
+* Replaces special characters with escape sequences 
+*
+*/
+package com.nokia.tracecompiler.decodeplugins.dictionary.encoder;
+
+/**
+ * Replaces special characters with escape sequences
+ * 
+ */
+class XMLDataFilter {
+
+	/**
+	 * XML start tag
+	 */
+	private static final String LEFT_ARROW = "<"; //$NON-NLS-1$
+
+	/**
+	 * XML end tag
+	 */
+	private static final String RIGHT_ARROW = ">"; //$NON-NLS-1$
+
+	/**
+	 * XML entity tag
+	 */
+	private static final String AMPERSAND = "&"; //$NON-NLS-1$
+
+	/**
+	 * XML start tag escaped
+	 */
+	private static final String LEFT_ARROW_SUBST = "&lt;"; //$NON-NLS-1$
+
+	/**
+	 * XML end tag escaped
+	 */
+	private static final String RIGHT_ARROW_SUBST = "&gt;"; //$NON-NLS-1$
+
+	/**
+	 * XML entity tag escaped
+	 */
+	private static final String AMPERSAND_SUBST = "&amp;"; //$NON-NLS-1$
+
+	/**
+	 * Not found result
+	 */
+	private static final int NOT_FOUND = -1;
+
+	/**
+	 * Changes XML data
+	 * 
+	 * @param data
+	 *            data to be changed
+	 * @return changed data
+	 */
+	static String changeData(String data) {
+
+		// This must be before any other that will add & marks to the text.
+		// Otherwise those will be replaced also.
+		if (data.indexOf(AMPERSAND) != NOT_FOUND) {
+			data = data.replaceAll(AMPERSAND, AMPERSAND_SUBST);
+		}
+		if (data.indexOf(LEFT_ARROW) != NOT_FOUND) {
+			data = data.replaceAll(LEFT_ARROW, LEFT_ARROW_SUBST);
+		}
+		if (data.indexOf(RIGHT_ARROW) != NOT_FOUND) {
+			data = data.replaceAll(RIGHT_ARROW, RIGHT_ARROW_SUBST);
+		}
+
+		return data;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/encoder/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+Dictionary encoder is used to create dictionary XML files
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/messages.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,1 @@
+DictionaryFile.Title=Dictionary File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+TraceCompiler plug-in implementation to export the project to Symbian Dictionary format
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/document/FileDocument.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,89 @@
+/*
+* 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-based implementation of the document interface
+*
+*/
+package com.nokia.tracecompiler.document;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import com.nokia.tracecompiler.file.FileUtils;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SourcePropertyProvider;
+
+/**
+ * File-based implementation of the document interface. This extends the string
+ * document with SourcePropertyProvider implementation which can provide the
+ * file name to TraceCompiler source framework
+ * 
+ */
+final class FileDocument extends StringDocument implements
+		SourcePropertyProvider {
+
+	/**
+	 * The file
+	 */
+	private File file;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param file
+	 *            the document file
+	 * @throws IOException
+	 *             if processing fails
+	 */
+	FileDocument(File file) throws IOException {
+		this.file = file;
+		byte[] buf = new byte[(int) file.length()];
+		FileInputStream fis = new FileInputStream(file);
+		fis.read(buf);
+		fis.close();
+		setSourceData(new String(buf));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.utils.DocumentAdapter#getPropertyProvider()
+	 */
+	@Override
+	public SourcePropertyProvider getPropertyProvider() {
+		return this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourcePropertyProvider#getFileName()
+	 */
+	public String getFileName() {
+		return file.getName();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourcePropertyProvider#getFilePath()
+	 */
+	public String getFilePath() {
+		return FileUtils.convertSeparators(
+				SourceConstants.FORWARD_SLASH_CHAR, file.getParent(), true);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/document/FileDocumentMonitor.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,135 @@
+/*
+* Copyright (c) 2010 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:
+*
+* Document monitor implementation which reads all files from a directory
+*
+*/
+package com.nokia.tracecompiler.document;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import com.nokia.tracecompiler.TraceCompilerGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorMessages;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.source.SourceEngine;
+import com.nokia.tracecompiler.file.FileUtils;
+import com.nokia.tracecompiler.source.SourceDocumentFactory;
+import com.nokia.tracecompiler.source.SourceDocumentProcessor;
+import com.nokia.tracecompiler.utils.DocumentMonitorBase;
+
+/**
+ * Document monitor implementation which reads files
+ * 
+ */
+public final class FileDocumentMonitor extends DocumentMonitorBase {
+
+	/**
+	 * Document factory
+	 */
+	private StringDocumentFactory documentFactory;
+
+	/**
+	 * Files to be processed
+	 */
+	private static String[] files;
+
+	/**
+	 * Sets the files to be used by the document monitor
+	 * 
+	 * @param files
+	 *            the files
+	 */
+	public static void setFiles(String[] files) {
+		FileDocumentMonitor.files = files;
+	}
+
+	/**
+	 * Constructor
+	 */
+	public FileDocumentMonitor() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.utils.DocumentMonitorBase#getFactory()
+	 */
+	@Override
+	public SourceDocumentFactory getFactory() {
+		if (documentFactory == null) {
+			documentFactory = new StringDocumentFactory();
+		}
+		return documentFactory;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.utils.DocumentMonitorAdapter#
+	 *      startMonitor(com.nokia.tracecompiler.source.SourceDocumentProcessor)
+	 */
+	@Override
+	public void startMonitor(SourceDocumentProcessor processor) throws Exception {
+		
+		// Put source files and non-source files to same list
+		SourceEngine sourceEngine = TraceCompilerEngineGlobals.getSourceEngine();
+		ArrayList<String> list = sourceEngine.getNonSourceFiles();
+		for (int i=0; i < files.length; i++) {
+			String fileName = files[i];
+			if (!list.contains(fileName)) {
+				list.add(fileName);
+			}
+		}		
+		String[] fileArr = new String[list.size()];
+		list.toArray(fileArr);
+		String err = ""; //$NON-NLS-1$
+		
+		for (String fileName : fileArr) {
+			File file = new File(fileName);
+			if (file.exists() && !file.isDirectory()
+					&& FileUtils.isFileAllowed(file.getName())) {
+				try {
+					TraceCompilerEngineGlobals.getEvents().postInfoMessage(Messages.getString("FileDocumentMonitor.processingSourceFileText") + file.getAbsolutePath(), null); //$NON-NLS-1$
+					processor.sourceOpened(new FileDocument(file));
+				} catch (Exception e) {
+					// Error after processing one file
+					String msg = TraceCompilerEngineErrorMessages
+							.getErrorMessage(
+									TraceCompilerErrorCode.CANNOT_OPEN_SOURCE_FILE,
+									null);
+					TraceCompilerEngineGlobals.getEvents().postErrorMessage(msg,
+							file.getAbsolutePath(),true);
+					err = e.getMessage();
+				} finally {
+					if (TraceCompilerEngineGlobals.getEvents().hasErrorHappened() && !TraceCompilerGlobals.keepGoing())  {
+						throw new Exception("TraceCompiler stopping on error. " + err); //$NON-NLS-1$
+					}
+				}
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.utils.DocumentMonitorAdapter#stopMonitor()
+	 */
+	@Override
+	public void stopMonitor() {
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/document/Messages.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 2010 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:
+*
+* Localized strings for engine package
+*
+*/
+package com.nokia.tracecompiler.document;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+
+	/**
+	 * Bundle name
+	 */
+	private static final String BUNDLE_NAME = "com.nokia.tracecompiler.document.messages"; //$NON-NLS-1$
+
+	/**
+	 * Bundle
+	 */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Prevents construction
+	 */
+	private Messages() {
+	}
+
+	/**
+	 * Gets localized string based on key
+	 * 
+	 * @param key
+	 *            the resource key
+	 * @return the localized resource
+	 */
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/document/StringDocument.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,126 @@
+/*
+* 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:
+*
+* String-based document object
+*
+*/
+package com.nokia.tracecompiler.document;
+
+import java.util.ArrayList;
+
+import com.nokia.tracecompiler.source.SourceParserException;
+import com.nokia.tracecompiler.utils.DocumentAdapter;
+
+/**
+ * String-based document object
+ * 
+ */
+class StringDocument extends DocumentAdapter {
+
+	/**
+	 * The document data
+	 */
+	private String sourceData;
+
+	/**
+	 * Line information
+	 */
+	private ArrayList<Integer> lines = new ArrayList<Integer>();
+
+	/**
+	 * Constructor
+	 */
+	StringDocument() {
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param data
+	 *            the document data
+	 */
+	StringDocument(String data) {
+		setSourceData(data);
+	}
+
+	/**
+	 * Sets the source data
+	 * 
+	 * @param data
+	 *            the source data
+	 */
+	void setSourceData(String data) {
+		this.sourceData = data;
+		if (data.length() > 0) {
+			lines.add(0);
+		}
+		for (int i = 0; i < data.length(); i++) {
+			if (data.charAt(i) == '\n') {
+				lines.add(i + 1);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.utils.DocumentAdapter#get(int, int)
+	 */
+	@Override
+	public String get(int start, int length) throws SourceParserException {
+		return sourceData.substring(start, start + length);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.utils.DocumentAdapter#getChar(int)
+	 */
+	@Override
+	public char getChar(int offset) throws SourceParserException {
+		return sourceData.charAt(offset);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.utils.DocumentAdapter#getLength()
+	 */
+	@Override
+	public int getLength() {
+		return sourceData.length();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.utils.DocumentAdapter#getLineOfOffset(int)
+	 */
+	@Override
+	public int getLineOfOffset(int offset) throws SourceParserException {
+		int retval = -1;
+		if (offset >= 0 && offset < sourceData.length()) {
+			for (int i = 0; i < lines.size(); i++) {
+				int lineStart = lines.get(i);
+				if (lineStart > offset) {
+					retval = i - 1;
+					i = lines.size();
+				}
+			}
+		}
+		return retval;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/document/StringDocumentFactory.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Document factory for file-based documents
+*
+*/
+package com.nokia.tracecompiler.document;
+
+import com.nokia.tracecompiler.source.SourceDocumentInterface;
+import com.nokia.tracecompiler.utils.DocumentFactoryBase;
+
+/**
+ * Document factory for string-based documents and simple locations which do not
+ * support changes or selections.
+ * 
+ */
+public final class StringDocumentFactory extends DocumentFactoryBase {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.utils.DocumentFactoryBase#createDocument(java.lang.String)
+	 */
+	@Override
+	public SourceDocumentInterface createDocument(String sourceData) {
+		return new StringDocument(sourceData);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/document/messages.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,1 @@
+FileDocumentMonitor.processingSourceFileText=Processing source file : 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/ConfigurationDelegate.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,204 @@
+/*
+* 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:
+*
+* Delegate to configuration of the view
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import java.util.ArrayList;
+
+/**
+ * Delegate to configuration of the view
+ * 
+ */
+final class ConfigurationDelegate implements TraceCompilerEngineConfiguration {
+
+	/**
+	 * Configuration from view
+	 */
+	private TraceCompilerEngineConfiguration configuration;
+
+	/**
+	 * Temporary list of configuration listeners
+	 */
+	private ArrayList<TraceCompilerEngineConfigurationListener> tempListeners;
+
+	/**
+	 * Sets the configuration delegate
+	 * 
+	 * @param configuration
+	 *            the configuration
+	 */
+	void setConfiguration(TraceCompilerEngineConfiguration configuration) {
+		this.configuration = configuration;
+		if (configuration != null && tempListeners != null) {
+			for (int i = 0; i < tempListeners.size(); i++) {
+				TraceCompilerEngineConfigurationListener listener = tempListeners
+						.get(i);
+				configuration.addConfigurationListener(listener);
+				listener.configurationCreated();
+			}
+			tempListeners.clear();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#isAvailable()
+	 */
+	public boolean isAvailable() {
+		boolean retval;
+		if (configuration != null) {
+			retval = configuration.isAvailable();
+		} else {
+			retval = false;
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#
+	 *      addConfigurationListener(com.nokia.tracecompiler.engine.TraceCompilerConfigurationListener)
+	 */
+	public void addConfigurationListener(
+			TraceCompilerEngineConfigurationListener configurationListener) {
+		if (configuration != null) {
+			configuration.addConfigurationListener(configurationListener);
+		} else {
+			if (tempListeners == null) {
+				tempListeners = new ArrayList<TraceCompilerEngineConfigurationListener>();
+			}
+			tempListeners.add(configurationListener);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#
+	 *      removeConfigurationListener(com.nokia.tracecompiler.engine.TraceCompilerConfigurationListener)
+	 */
+	public void removeConfigurationListener(
+			TraceCompilerEngineConfigurationListener configurationListener) {
+		if (configuration != null) {
+			configuration.removeConfigurationListener(configurationListener);
+		} else {
+			if (tempListeners != null) {
+				tempListeners.remove(configurationListener);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#getFlag(java.lang.String)
+	 */
+	public boolean getFlag(String flagName) {
+		boolean retval;
+		if (configuration != null) {
+			retval = configuration.getFlag(flagName);
+		} else {
+			retval = false;
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#getText(java.lang.String)
+	 */
+	public String getText(String textName) {
+		String retval;
+		if (configuration != null) {
+			retval = configuration.getText(textName);
+		} else {
+			retval = ""; //$NON-NLS-1$
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#getValue(java.lang.String)
+	 */
+	public int getValue(String valueName) {
+		int retval;
+		if (configuration != null) {
+			retval = configuration.getValue(valueName);
+		} else {
+			retval = 0;
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#hasEntry(java.lang.String)
+	 */
+	public boolean hasEntry(String entryName) {
+		boolean retval;
+		if (configuration != null) {
+			retval = configuration.hasEntry(entryName);
+		} else {
+			retval = false;
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#
+	 *      setFlag(java.lang.String, boolean)
+	 */
+	public void setFlag(String flagName, boolean flag) {
+		if (configuration != null) {
+			configuration.setFlag(flagName, flag);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#
+	 *      setText(java.lang.String, java.lang.String)
+	 */
+	public void setText(String textName, String text) {
+		if (configuration != null) {
+			configuration.setText(textName, text);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfiguration#setValue(java.lang.String,
+	 *      int)
+	 */
+	public void setValue(String valueName, int value) {
+		if (configuration != null) {
+			configuration.setValue(valueName, value);
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/LocationListBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,121 @@
+/*
+* 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:
+*
+* Base class for TraceLocationList and PersistentLocationList
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceObject;
+
+/**
+ * Base class for TraceLocationList and PersistentLocationList
+ * 
+ */
+public class LocationListBase implements TraceModelExtension,
+		Iterable<LocationProperties> {
+
+	/**
+	 * List of locations
+	 */
+	private ArrayList<LocationProperties> locations = new ArrayList<LocationProperties>();
+
+	/**
+	 * Owning trace object
+	 */
+	private TraceObject owner;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtension#getOwner()
+	 */
+	public TraceObject getOwner() {
+		return owner;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtension#setOwner(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void setOwner(TraceObject owner) {
+		this.owner = owner;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Iterable#iterator()
+	 */
+	public Iterator<LocationProperties> iterator() {
+		return locations.iterator();
+	}
+
+	/**
+	 * Gets the location count of this list
+	 * 
+	 * @return the count
+	 */
+	public final int getLocationCount() {
+		return locations.size();
+	}
+
+	/**
+	 * Checks if there are locations in this list
+	 * 
+	 * @return true if list has locations
+	 */
+	public final boolean hasLocations() {
+		return !locations.isEmpty();
+	}
+
+	/**
+	 * Adds a location to this list
+	 * 
+	 * @param location
+	 *            the location to be added
+	 */
+	void add(LocationProperties location) {
+		locations.add(location);
+	}
+
+	/**
+	 * Removes a location from this list
+	 * 
+	 * @param location
+	 *            the location to be removed
+	 * @return true if removed
+	 */
+	boolean remove(LocationProperties location) {
+		return locations.remove(location);
+	}
+
+	/**
+	 * Checks if location exists
+	 * 
+	 * @param location
+	 *            the location
+	 * @return true if exists
+	 */
+	boolean contains(LocationProperties location) {
+		return locations.contains(location);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/LocationMapModelListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,113 @@
+/*
+* 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:
+*
+* Model listener for trace location mapper
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceGroup;
+import com.nokia.tracecompiler.model.TraceModelListener;
+import com.nokia.tracecompiler.model.TraceObject;
+import com.nokia.tracecompiler.model.TraceParameter;
+
+/**
+ * Model listener for trace location mapper
+ * 
+ */
+final class LocationMapModelListener implements TraceModelListener {
+
+	/**
+	 * Trace location mapper
+	 */
+	private final TraceLocationMap locationMap;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param map
+	 *            the location mapper
+	 */
+	LocationMapModelListener(TraceLocationMap map) {
+		locationMap = map;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      objectAdded(com.nokia.tracecompiler.model.TraceObject,
+	 *      com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectAdded(TraceObject owner, TraceObject object) {
+		// A trace does not have a name yet, so this does nothing
+		// The locations are assigned to the trace in propertyChanged
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      objectRemoved(com.nokia.tracecompiler.model.TraceObject,
+	 *      com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectRemoved(TraceObject owner, TraceObject object) throws TraceCompilerException {
+		if (object instanceof Trace) {
+			locationMap.moveToUnrelated((Trace) object);
+		} else if (object instanceof TraceGroup) {
+			// Moves locations to unrelated list
+			for (Trace trace : (TraceGroup) object) {
+				locationMap.moveToUnrelated(trace);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      propertiesUpdated(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void propertyUpdated(TraceObject object, int property) throws TraceCompilerException {
+		if (object instanceof Trace && property == NAME && object.isComplete()) {
+			Trace trace = (Trace) object;
+			locationMap.moveFromUnrelated(trace);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      objectCreationComplete(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectCreationComplete(TraceObject object) throws TraceCompilerException {
+		if (object instanceof Trace) {
+			Trace trace = (Trace) object;
+			locationMap.moveFromUnrelated(trace);
+		} else if (object instanceof TraceParameter) {
+			// If a parameter is added, the validity needs to be checked
+			TraceLocationList list = ((TraceParameter) object).getTrace()
+					.getExtension(TraceLocationList.class);
+			if (list != null) {
+				for (LocationProperties loc : list) {
+					((TraceLocation) loc).runValidityCheck();
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/LocationProperties.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,62 @@
+/*
+* 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:
+*
+* Common properties of locations
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+/**
+ * Common properties of locations
+ * 
+ */
+public interface LocationProperties {
+
+	/**
+	 * Gets the file path
+	 * 
+	 * @return the file path
+	 */
+	public String getFilePath();
+
+	/**
+	 * Gets the file name
+	 * 
+	 * @return the file name
+	 */
+	public String getFileName();
+
+	/**
+	 * Gets the line number
+	 * 
+	 * @return the line number
+	 */
+	public int getLineNumber();
+
+	/**
+	 * Gets the name of the class which owns this location
+	 * 
+	 * @return the class name
+	 */
+	public String getClassName();
+
+	/**
+	 * Gets the name of function which owns this location
+	 * 
+	 * @return the function name
+	 */
+	public String getFunctionName();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/Messages.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* 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:
+*
+* Localized strings for engine package
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Messages for engine package
+ * 
+ */
+public class Messages {
+
+	/**
+	 * Bundle name
+	 */
+	private static final String BUNDLE_NAME = "com.nokia.tracecompiler.engine.messages"; //$NON-NLS-1$
+
+	/**
+	 * Bundle
+	 */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Prevents construction
+	 */
+	private Messages() {
+	}
+
+	/**
+	 * Gets localized string based on key
+	 * 
+	 * @param key
+	 *            the resource key
+	 * @return the localized resource
+	 */
+	public static String getString(String key) {
+		String value;
+		try {
+			value = RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			value = '!' + key + '!';
+		}
+		return value;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/SourceContextManager.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Interface to change the currently active source context
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import com.nokia.tracecompiler.source.SourceContext;
+
+/**
+ * Interface to the currently active source context
+ * 
+ */
+public interface SourceContextManager {
+
+	/**
+	 * Gets the active source context
+	 * 
+	 * @return the context
+	 */
+	public SourceContext getContext();
+
+	/**
+	 * Sets the active source context
+	 * 
+	 * @param context
+	 *            the context
+	 */
+	public void setContext(SourceContext context);
+
+	/**
+	 * Checks if the auto-converter is running
+	 * 
+	 * @return true if converter is running, false otherwise
+	 */
+	public boolean isConverting();
+
+	/**
+	 * Sets the auto-converter flag
+	 * 
+	 * @param flag
+	 *            the new flag value
+	 */
+	public void setConverting(boolean flag);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/SourceContextManagerImpl.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,84 @@
+/*
+* 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:
+*
+* SourceContextManager interface implementation
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import com.nokia.tracecompiler.source.SourceContext;
+
+/**
+ * SourceContextManager interface implementation
+ * 
+ */
+final class SourceContextManagerImpl implements SourceContextManager {
+
+	/**
+	 * Active context
+	 */
+	private SourceContext activeContext;
+
+	/**
+	 * Converting flag
+	 */
+	private boolean isConverting;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param sourceEngine
+	 *            the source engine
+	 */
+	SourceContextManagerImpl() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.SourceContextManager#getContext()
+	 */
+	public SourceContext getContext() {
+		return activeContext;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.SourceContextManager#
+	 *      setContext(com.nokia.tracecompiler.source.SourceContext)
+	 */
+	public void setContext(SourceContext context) {
+		activeContext = context;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.SourceContextManager#isConverting()
+	 */
+	public boolean isConverting() {
+		return isConverting;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.SourceContextManager#setConverting(boolean)
+	 */
+	public void setConverting(boolean flag) {
+		this.isConverting = flag;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngine.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,393 @@
+/*
+ * 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 singleton access point to functionality of Trace Compiler
+ *
+ */
+package com.nokia.tracecompiler.engine;
+
+import java.util.ArrayList;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.event.EventEngine;
+import com.nokia.tracecompiler.engine.header.HeaderEngine;
+import com.nokia.tracecompiler.engine.plugin.PluginEngine;
+import com.nokia.tracecompiler.engine.project.ProjectEngine;
+import com.nokia.tracecompiler.engine.propertyfile.PropertyFileEngine;
+import com.nokia.tracecompiler.engine.rules.RulesEngine;
+import com.nokia.tracecompiler.engine.source.SourceEngine;
+import com.nokia.tracecompiler.engine.source.SourceListener;
+import com.nokia.tracecompiler.engine.source.SourceProperties;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.plugin.TraceCompilerPlugin;
+
+/**
+ * A singleton access point to functionality of Trace Compiler
+ * 
+ */
+final class TraceCompilerEngine implements SourceListener, TraceCompilerEngineInterface {
+
+	/**
+	 * TraceCompiler plug-in engine
+	 */
+	private PluginEngine pluginEngine;
+
+	/**
+	 * Event handler interface implementation
+	 */
+	private TraceCompilerEngineEvents eventEngine;
+
+	/**
+	 * Source editor engine
+	 */
+	private SourceEngine sourceEngine;
+
+	/**
+	 * Trace header engine
+	 */
+	private HeaderEngine headerEngine;
+
+	/**
+	 * Trace project engine
+	 */
+	private ProjectEngine projectEngine;
+
+	/**
+	 * Rule engine
+	 */
+	private RulesEngine rulesEngine;
+
+	/**
+	 * Trace property file engine
+	 */
+	private PropertyFileEngine propertyFileEngine;
+
+	/**
+	 * Source context manager
+	 */
+	private SourceContextManager contextManager;
+
+	/**
+	 * Location map
+	 */
+	private TraceLocationMap locationMap;
+
+	/**
+	 * Location converter
+	 */
+	private TraceLocationConverter locationConverter;
+
+	/**
+	 * Trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * Interface to the view
+	 */
+	private TraceCompilerEngineView view = new ViewAdapter();
+
+	/**
+	 * Configuration
+	 */
+	private ConfigurationDelegate configurationDelegate;
+
+	/**
+	 * List of engines that need project open / export / close notifications
+	 */
+	private ArrayList<TraceCompilerEngineBase> engines = new ArrayList<TraceCompilerEngineBase>();
+
+	/**
+	 * View has been registered flag
+	 */
+	private boolean isViewRegistered = false;
+
+	/**
+	 * Project path is stored in case the view unregisters and re-registers
+	 */
+	private String currentProjectPath;
+
+	/**
+	 * Gets the configuration of TraceCompiler
+	 * 
+	 * @return the configuration
+	 */
+	TraceCompilerEngineConfiguration getConfiguration() {
+		return configurationDelegate;
+	}
+
+	/**
+	 * Gets the trace compiler interface
+	 * 
+	 * @return this object
+	 */
+	TraceCompilerEngineInterface getTraceCompiler() {
+		return this;
+	}
+
+	/**
+	 * Gets the trace model
+	 * 
+	 * @return the trace model
+	 */
+	TraceModel getModel() {
+		return model;
+	}
+
+	/**
+	 * Gets the source engine
+	 * 
+	 * @return the source engine
+	 */
+	SourceEngine getSourceEngine() {
+		return sourceEngine;
+	}
+
+	/**
+	 * Gets the events interface
+	 * 
+	 * @return the events interface
+	 */
+	TraceCompilerEngineEvents getEvents() {
+		return eventEngine;
+	}
+
+	/**
+	 * Adds a plug-in
+	 * 
+	 * @param plugin
+	 *            the plugin
+	 */
+	void registerPlugin(TraceCompilerPlugin plugin) {
+		pluginEngine.add(plugin);
+	}
+
+	/**
+	 * Removes an existing plug-in
+	 * 
+	 * @param plugin
+	 *            the plugin
+	 */
+	void unregisterPlugin(TraceCompilerPlugin plugin) {
+		pluginEngine.remove(plugin);
+	}
+
+	/**
+	 * Gets the source context manager
+	 * 
+	 * @return the context manager
+	 */
+	public SourceContextManager getSourceContextManager() {
+		return contextManager;
+	}
+
+	/**
+	 * Starts TraceCompiler.
+	 * @throws TraceCompilerException 
+	 */
+	void start() throws TraceCompilerException {
+		configurationDelegate = new ConfigurationDelegate();
+		rulesEngine = new RulesEngine();
+		pluginEngine = new PluginEngine();
+		model = new TraceModel(rulesEngine, pluginEngine.getVerifier());
+		pluginEngine.setModel(model);
+		projectEngine = new ProjectEngine(model);
+		propertyFileEngine = new PropertyFileEngine(model);
+		eventEngine = new EventEngine(model);
+		sourceEngine = new SourceEngine(model);
+		locationMap = new TraceLocationMap(model);
+		locationConverter = new TraceLocationConverter(model);
+		sourceEngine.addSourceListener(this);
+		contextManager = new SourceContextManagerImpl();
+		headerEngine = new HeaderEngine(model);
+		// Keep this order -> Exports need to be in correct order
+		// Property file engine manages the ID cache so it needs to be run
+		// before plug-in's and header
+		engines.add(projectEngine);
+		engines.add(propertyFileEngine);
+		engines.add(headerEngine);
+		engines.add(pluginEngine);
+	}
+
+	/**
+	 * Shuts down TraceCompiler
+	 * @throws TraceCompilerException 
+	 */
+	void shutdown() throws TraceCompilerException {
+		closeProject();
+	}
+
+	/**
+	 * Registers the view
+	 * 
+	 * @param view
+	 *            the view
+	 * @throws TraceCompilerException 
+	 */
+	void setView(TraceCompilerEngineView view) throws TraceCompilerException {
+		if (view == null) {
+			// Closes the project, but leaves the currentProjectName and
+			// currentProjectPath variables. When view re-registers the project
+			// is opened back
+			internalCloseProject();
+			this.view = new ViewAdapter();
+			isViewRegistered = false;
+		} else {
+			this.view = view;
+			isViewRegistered = true;
+		}
+		configurationDelegate.setConfiguration(this.view.getConfiguration());
+	}
+
+	/**
+	 * Checks that model is valid
+	 * 
+	 * @throws TraceCompilerException
+	 *             if model is not valid
+	 */
+	private void checkIsModelValid() throws TraceCompilerException {
+		if (!model.isValid()) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.MODEL_NOT_READY);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngineInterface#openProject(java.lang.String,
+	 *      java.lang.String)
+	 */
+	public void openProject(String modelName) throws Exception {
+		try {
+			if (view != null && isViewRegistered && !model.isValid()) {
+				projectEngine.openTraceProject(currentProjectPath, modelName);
+				for (TraceCompilerEngineBase engine : engines) {
+					engine.projectOpened();
+				}
+				model.setValid(true);
+				sourceEngine.start();
+			}
+		} catch (TraceCompilerException e) {
+			closeModel();
+			throw e;
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngineInterface#exportProject()
+	 */
+	public void exportProject() throws TraceCompilerException {
+		checkIsModelValid();
+		if (model.getID() != 0) {
+			for (TraceCompilerEngineBase engine : engines) {
+					engine.exportProject();
+			}
+		} else {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.INVALID_MODEL_PROPERTIES_FOR_EXPORT);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngineInterface#closeProject()
+	 */
+	public void closeProject() throws TraceCompilerException {
+		internalCloseProject();
+		currentProjectPath = null;
+	}
+
+	/**
+	 * Closes the project
+	 * @throws TraceCompilerException 
+	 */
+	private void internalCloseProject() throws TraceCompilerException {
+		if (model.isValid()) {
+			if (!TraceCompilerEngineGlobals.getConfiguration().getFlag(
+					TraceCompilerEngineConfiguration.CONSOLE_UI_MODE)) {
+				try {
+					// Plug-in's are not exported when project is closed
+					// They can do cleanup in traceProjectClosed call
+					for (TraceCompilerEngineBase engine : engines) {
+						if (engine != pluginEngine) {
+							engine.exportProject();
+						}
+					}
+				} catch (TraceCompilerException e) {
+					getEvents().postError(e);
+						throw e;
+				}
+			}
+			// Engines are closed in reverse order
+			for (int i = engines.size() - 1; i >= 0; i--) {
+				engines.get(i).projectClosed();
+			}
+			sourceEngine.shutdown();
+			closeModel();
+		}
+	}
+
+	/**
+	 * Closes the trace model
+	 */
+	private void closeModel() {
+		try {
+			if (model != null) {
+				model.reset();
+				model.setValid(false);
+			}
+		} catch (Exception e) {
+			if (TraceCompilerEngineConfiguration.ASSERTIONS_ENABLED) {
+				getEvents().postAssertionFailed("Failed to close model", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.SourceListener#
+	 *      sourceOpened(com.nokia.tracecompiler.engine.SourceProperties)
+	 */
+	public void sourceOpened(SourceProperties properties) throws TraceCompilerException {
+		locationMap.addSource(properties);
+		locationConverter.sourceOpened(properties);
+	}
+
+	/**
+	 * Get project path
+	 * 
+	 * @return project path
+	 */
+	public String getProjectPath() {
+		return currentProjectPath;
+	}
+
+	/**
+	 * Set project path
+	 * 
+	 * @param path
+	 *            the path
+	 */
+	public void setProjectPath(String path) {
+		currentProjectPath = path;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineActions.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,35 @@
+/*
+* 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:
+*
+* Action interface
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+/**
+ * Action interface
+ * 
+ */
+public interface TraceCompilerEngineActions {
+
+	/**
+	 * Enables actions based on selected object
+	 * 
+	 * @param object
+	 *            the object that has been selected
+	 */
+	public void enableActions(Object object);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,48 @@
+/*
+* 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:
+*
+* Base class for all engine classes
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import com.nokia.tracecompiler.model.TraceCompilerException;
+
+/**
+ * Base class for all engine classes
+ * 
+ */
+public abstract class TraceCompilerEngineBase {
+
+	/**
+	 * Called after trace project has been opened
+	 * @throws TraceCompilerException 
+	 */
+	public abstract void projectOpened() throws TraceCompilerException;
+
+	/**
+	 * Called when trace project is closed
+	 */
+	public abstract void projectClosed();
+
+	/**
+	 * Called when exporting the project
+	 * 
+	 * @throws TraceCompilerException
+	 *             if export fails
+	 */
+	public abstract void exportProject() throws TraceCompilerException;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineConfiguration.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,188 @@
+/*
+* 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:
+*
+* Access to configuration of TraceCompiler
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+/**
+ * Access to configuration of TraceCompiler
+ * 
+ */
+public interface TraceCompilerEngineConfiguration {
+
+	/**
+	 * Name of the currently selected source formatter
+	 */
+	public String FORMATTER_NAME = "TraceCompiler.sourceFormatter"; //$NON-NLS-1$
+
+	/**
+	 * Environment root
+	 */
+	public String ENVIRONMENT_ROOT = "TraceCompiler.environmentRoot"; //$NON-NLS-1$
+
+	/**
+	 * Printf support flag
+	 */
+	public String PRINTF_SUPPORT = "TraceCompiler.printfSupport"; //$NON-NLS-1$
+
+	/**
+	 * Printf extension macro
+	 */
+	public String PRINTF_EXTENSION = "TraceCompiler.printfMacro"; //$NON-NLS-1$
+
+	/**
+	 * Console UI mode flag
+	 */
+	public String CONSOLE_UI_MODE = "TraceCompiler.consoleUI"; //$NON-NLS-1$
+
+	/**
+	 * Flag to show the project files in view
+	 */
+	public boolean SHOW_PROJECT_FILES = false;
+
+	/**
+	 * Compiler flag to show hidden parameters in view
+	 */
+	public boolean SHOW_HIDDEN_PARAMETERS_IN_VIEW = false;
+
+	/**
+	 * Compiler flag to show location tag in view
+	 */
+	public boolean SHOW_LOCATION_TAG_IN_VIEW = false;
+
+	/**
+	 * Assertions events are enabled
+	 */
+	public boolean ASSERTIONS_ENABLED = true;
+
+	/**
+	 * Trace location assertions are enabled
+	 */
+	public boolean GLOBAL_LOCATION_ASSERTS = false;
+
+	/**
+	 * Traces the view state
+	 */
+	public boolean TRACE_VIEW_STATE = false;
+
+	/**
+	 * Allow changes to source formatter
+	 */
+	public boolean ALLOW_FORMAT_CHANGE = false;
+
+	/**
+	 * Comment after trace
+	 */
+	public String COMMENT_POSITION_AFTER_TRACE = "before"; //$NON-NLS-1$
+
+	/**
+	 * Comment before trace
+	 */
+	public String COMMENT_POSITION_BEFORE_TRACE = "after"; //$NON-NLS-1$
+
+	/**
+	 * Flag which determines if the configuration is available
+	 * 
+	 * @return true if available, false if not
+	 */
+	public boolean isAvailable();
+
+	/**
+	 * Stores a boolean flag into properties
+	 * 
+	 * @param flagName
+	 *            name for the flag
+	 * @param flag
+	 *            flag to be stored
+	 */
+	public void setFlag(String flagName, boolean flag);
+
+	/**
+	 * Gets a configuration flag based on flag name
+	 * 
+	 * @param flagName
+	 *            the confiugration flag name
+	 * @return the flag value
+	 */
+	public boolean getFlag(String flagName);
+
+	/**
+	 * Stores an integer value into properties
+	 * 
+	 * @param valueName
+	 *            name for the value
+	 * @param value
+	 *            value to be stored
+	 */
+	public void setValue(String valueName, int value);
+
+	/**
+	 * Gets a configuration value based on value name
+	 * 
+	 * @param valueName
+	 *            configuration value name
+	 * @return the value
+	 */
+	public int getValue(String valueName);
+
+	/**
+	 * Stores text into properties
+	 * 
+	 * @param textName
+	 *            name for the text
+	 * @param text
+	 *            text to be stored
+	 */
+	public void setText(String textName, String text);
+
+	/**
+	 * Gets a text entry based on property name
+	 * 
+	 * @param textName
+	 *            configuration value name
+	 * @return the text
+	 */
+	public String getText(String textName);
+
+	/**
+	 * Checks if the given entry exists in configuration.
+	 * 
+	 * @param entryName
+	 *            the name of the entry
+	 * @return true if entry exists, false otherwise
+	 */
+	public boolean hasEntry(String entryName);
+
+	/**
+	 * Adds a configuration listener to this configuration
+	 * 
+	 * @param configurationListener
+	 *            the listener to be added
+	 */
+	public void addConfigurationListener(
+			TraceCompilerEngineConfigurationListener configurationListener);
+
+	/**
+	 * Removes an existing configuration listener
+	 * 
+	 * @param configurationListener
+	 *            the listener to be removed
+	 */
+	public void removeConfigurationListener(
+			TraceCompilerEngineConfigurationListener configurationListener);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineConfigurationListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Configuration listener interface
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+/**
+ * Configuration listener interface
+ * 
+ */
+public interface TraceCompilerEngineConfigurationListener {
+
+	/**
+	 * Configuration creation notification
+	 */
+	public void configurationCreated();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineErrorCodes.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,489 @@
+/*
+ * 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:
+ *
+ * Error codes for TraceCompiler
+ *
+ */
+package com.nokia.tracecompiler.engine;
+
+import com.nokia.tracecompiler.model.TraceCompilerErrorParameters;
+import com.nokia.tracecompiler.model.TraceCompilerException.TraceCompilerExceptionCode;
+
+/**
+ * Error codes for TraceCompiler
+ * 
+ */
+public interface TraceCompilerEngineErrorCodes {
+
+	/**
+	 * Error parameters for a file-related errors
+	 */
+	public class FileErrorParameters extends TraceCompilerErrorParameters {
+
+		/**
+		 * Path to the file
+		 */
+		public String file;
+
+	}
+
+	/**
+	 * Error parameters for errors related to names, titles etc.
+	 */
+	public class StringErrorParameters extends TraceCompilerErrorParameters {
+
+		/**
+		 * String
+		 */
+		public String string;
+
+	}
+
+	/**
+	 * Error parameters for integer values that must be between two values
+	 */
+	public class RangeErrorParameters extends TraceCompilerErrorParameters {
+
+		/**
+		 * Start of range
+		 */
+		public int start;
+
+		/**
+		 * End of range
+		 */
+		public int end;
+
+		/**
+		 * Hex / decimal flag
+		 */
+		public boolean isHex;
+
+	}
+
+	/**
+	 * Error codes for TraceCompiler
+	 */
+	public enum TraceCompilerErrorCode implements TraceCompilerExceptionCode {
+
+		/**
+		 * Success
+		 */
+		OK,
+
+		/**
+		 * Trace ID was duplicate
+		 */
+		DUPLICATE_TRACE_ID,
+
+		/**
+		 * Group ID was duplicate
+		 */
+		DUPLICATE_GROUP_ID,
+
+		/**
+		 * Trace name was duplicate
+		 */
+		DUPLICATE_TRACE_NAME,
+
+		/**
+		 * Trace name was duplicate
+		 */
+		DUPLICATE_GROUP_NAME,
+
+		/**
+		 * Trace ID was not valid. Parameters for this error are either
+		 * RangeErrorParameters or null (no range)
+		 */
+		INVALID_TRACE_ID,
+
+		/**
+		 * Group ID was not valid. Parameters for this error are either
+		 * RangeErrorParameters or null (no range)
+		 */
+		INVALID_GROUP_ID,
+
+		/**
+		 * Name was not valid
+		 */
+		INVALID_TRACE_NAME,
+
+		/**
+		 * Name was not valid
+		 */
+		INVALID_GROUP_NAME,
+
+		/**
+		 * Trace string was not valid
+		 */
+		INVALID_TRACE_DATA,
+
+		/**
+		 * Cannot edit source file
+		 */
+		SOURCE_NOT_EDITABLE,
+
+		/**
+		 * Source location was not valid
+		 */
+		INVALID_SOURCE_LOCATION,
+
+		/**
+		 * Unreachable trace location
+		 */
+		UNREACHABLE_TRACE_LOCATION,
+
+		/**
+		 * Tried to perform group operation when group was not selected
+		 */
+		GROUP_NOT_SELECTED,
+
+		/**
+		 * Tried to perform trace operation when trace was not selected
+		 */
+		TRACE_NOT_SELECTED,
+
+		/**
+		 * Not enough parameters in trace
+		 */
+		NOT_ENOUGH_PARAMETERS,
+
+		/**
+		 * Unexpected exception occurred
+		 */
+		UNEXPECTED_EXCEPTION,
+
+		/**
+		 * Trace model is not ready
+		 */
+		MODEL_NOT_READY,
+
+		/**
+		 * No trace groups
+		 */
+		NO_TRACE_GROUPS,
+
+		/**
+		 * Parameter name is not valid
+		 */
+		INVALID_PARAMETER_NAME,
+
+		/**
+		 * Model properties are not valid
+		 */
+		INVALID_MODEL_PROPERTIES_FOR_EXPORT,
+
+		/**
+		 * Model name is not valid
+		 */
+		INVALID_MODEL_NAME,
+
+		/**
+		 * Trace project file cannot be parsed
+		 */
+		INVALID_PROJECT_FILE,
+
+		/**
+		 * File was not found. This error is related to FileErrorParameters
+		 * class
+		 */
+		FILE_NOT_FOUND,
+
+		/**
+		 * Path was not valid. This is related to FileErrorParameters class
+		 */
+		INVALID_PATH,
+
+		/**
+		 * Constant value was duplicate
+		 */
+		DUPLICATE_CONSTANT_VALUE,
+
+		/**
+		 * Constant name was already in use
+		 */
+		DUPLICATE_CONSTANT_TABLE_NAME,
+
+		/**
+		 * Constant table name was not valid
+		 */
+		INVALID_CONSTANT_TABLE_NAME,
+
+		/**
+		 * Constant table not part of project
+		 */
+		CONSTANT_TABLE_NOT_PART_OF_PROJECT,
+
+		/**
+		 * Constant ID was already in use
+		 */
+		DUPLICATE_CONSTANT_ID,
+
+		/**
+		 * Constant value was not valid
+		 */
+		INVALID_CONSTANT_VALUE,
+
+		/**
+		 * Parameter name was already in use
+		 */
+		DUPLICATE_PARAMETER_NAME,
+
+		/**
+		 * Parameter type was not supported
+		 */
+		INVALID_PARAMETER_TYPE,
+
+		/**
+		 * Parameters cannot be added
+		 */
+		PARAMETER_ADD_NOT_ALLOWED,
+
+		/**
+		 * Parameters cannot be removed
+		 */
+		PARAMETER_REMOVE_NOT_ALLOWED,
+
+		/**
+		 * Parameter name was empty. This is generated when automatically adding
+		 * function parameters to new trace and a parameter does not have a name
+		 * in the declaration.
+		 */
+		EMPTY_PARAMETER_NAME,
+
+		/**
+		 * Parameter template was already used by another parameter
+		 */
+		PARAMETER_TEMPLATE_ALREADY_IN_USE,
+
+		/**
+		 * Tried to remove trace location when one was not selected
+		 */
+		LOCATION_NOT_SELECTED,
+
+		/**
+		 * Cannot add a constant, since constant table was not selected
+		 */
+		CONSTANT_TABLE_NOT_SELECTED,
+
+		/**
+		 * The selected object was not valid target for delete operation
+		 */
+		CANNOT_DELETE_SELECTED_OBJECT,
+
+		/**
+		 * Trace text format is not valid
+		 */
+		INVALID_TRACE_TEXT_FORMAT,
+
+		/**
+		 * Trace name format is not valid
+		 */
+		INVALID_TRACE_NAME_FORMAT,
+
+		/**
+		 * Missing function name from trace name format
+		 */
+		TRACE_NAME_FORMAT_MISSING_FUNCTION,
+
+		/**
+		 * No traces to delete
+		 */
+		NO_TRACES_TO_DELETE,
+
+		/**
+		 * Source file is not open
+		 */
+		SOURCE_NOT_OPEN,
+
+		/**
+		 * Failed to parse a constant table from source
+		 */
+		CONSTANT_TABLE_PARSE_FAILED,
+
+		/**
+		 * Cannot open project file
+		 */
+		CANNOT_OPEN_PROJECT_FILE,
+
+		/**
+		 * Cannot write project file
+		 */
+		CANNOT_WRITE_PROJECT_FILE,
+
+		/**
+		 * Parameter ID was already in use
+		 */
+		DUPLICATE_PARAMETER_ID,
+
+		/**
+		 * Constant table ID was already in use
+		 */
+		DUPLICATE_CONSTANT_TABLE_ID,
+
+		/**
+		 * Instrumenter function list was empty
+		 */
+		NO_FUNCTIONS_TO_INSTRUMENT,
+
+		/**
+		 * Instrumenter function list was empty. Related to
+		 * StringErrorParameters
+		 */
+		NO_FUNCTIONS_TO_INSTRUMENT_WITH_TEMPLATE,
+
+		/**
+		 * Multiple errors during an operation
+		 */
+		MULTIPLE_ERRORS_IN_OPERATION,
+
+		/**
+		 * Printf parameter parameter format specification did not match the
+		 * parameter count
+		 */
+		PARAMETER_FORMAT_MISMATCH,
+
+		/**
+		 * A trace does not exist
+		 */
+		TRACE_DOES_NOT_EXIST,
+
+		/**
+		 * Trace needs to be converted to correct API
+		 */
+		TRACE_NEEDS_CONVERSION,
+
+		/**
+		 * Parameter count of location and trace do not match
+		 */
+		PARAMETER_COUNT_MISMATCH,
+
+		/**
+		 * Parameter count in location does not match the API macro
+		 */
+		PARAMETER_COUNT_DOES_NOT_MATCH_API,
+
+		/**
+		 * Location parser failed
+		 */
+		LOCATION_PARSER_FAILED,
+
+		/**
+		 * Trace is not referenced from source files
+		 */
+		TRACE_HAS_NO_LOCATIONS,
+
+		/**
+		 * Trace is used from multiple locations in source files
+		 */
+		TRACE_HAS_MULTIPLE_LOCATIONS,
+
+		/**
+		 * Project was empty when export was called
+		 */
+		NO_TRACES_TO_EXPORT,
+
+		/**
+		 * Source file cannot be opened
+		 */
+		CANNOT_OPEN_SOURCE_FILE,
+
+		/**
+		 * Trace in source cannot be updated
+		 */
+		CANNOT_UPDATE_TRACE_INTO_SOURCE,
+
+		/**
+		 * Parameter format is not supported
+		 */
+		PARAMETER_FORMAT_NOT_SUPPORTED,
+
+		/**
+		 * Parameter format is not supported by default macros
+		 */
+		PARAMETER_FORMAT_NEEDS_EXT_MACRO,
+
+		/**
+		 * Ext macro usage is not necessary with
+		 */
+		PARAMETER_FORMAT_UNNECESSARY_EXT_MACRO,
+
+		/**
+		 * Parameter format cannot be used as an array
+		 */
+		PARAMETER_FORMAT_NOT_SUPPORTED_IN_ARRAY,
+
+		/**
+		 * Property file element was unknown
+		 */
+		PROPERTY_FILE_ELEMENT_NOT_SUPPORTED,
+
+		/**
+		 * Property file element was in wrong place
+		 */
+		PROPERTY_FILE_ELEMENT_MISPLACED,
+
+		/**
+		 * Property file attribute was not valid
+		 */
+		PROPERTY_FILE_ATTRIBUTE_INVALID,
+
+		/**
+		 * Inserting a trace into source will produce incorrect results
+		 */
+		INSERT_TRACE_DOES_NOT_WORK,
+
+		/**
+		 * Trace found from source is not in valid source context
+		 */
+		NO_CONTEXT_FOR_LOCATION,
+
+		/**
+		 * Function parameters could not be parsed
+		 */
+		CANNOT_PARSE_FUNCTION_PARAMETERS,
+
+		/**
+		 * Parameter name is not valid exit trace return parameter name
+		 */
+		INVALID_PARAMETER_NAME_IN_RETURN_VALUE,
+
+		/**
+		 * Run out of Group IDs
+		 */
+		RUN_OUT_OF_GROUP_IDS,
+
+		/**
+		 * Run out of Trace IDs
+		 */
+		RUN_OUT_OF_TRACE_IDS,
+
+		/**
+		 * Cannot add function parameters if there is var arg list
+		 */
+		VAR_ARG_LIST_PARAMETER_FOUND,
+
+		/**
+		 * TRACE_STATE group name was used in non state trace
+		 */
+		INVALID_USAGE_OF_TRACE_STATE_GROUP_NAME,
+
+		/**
+		 * TRACE_PERFORMANCE group name was used in non performance trace
+		 */
+		INVALID_USAGE_OF_TRACE_PERFORMACE_GROUP_NAME
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineErrorMessages.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,722 @@
+/*
+ * 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:
+ *
+ * Error code to error message mapper
+ *
+ */
+package com.nokia.tracecompiler.engine;
+
+import java.io.File;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.FileErrorParameters;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.RangeErrorParameters;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.StringErrorParameters;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.model.TraceCompilerErrorParameters;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SourceUtils;
+
+/**
+ * Error code to error message mapper
+ * 
+ */
+public final class TraceCompilerEngineErrorMessages {
+
+	/**
+	 * Maps an exception to error message
+	 * 
+	 * @param e
+	 *            the exception
+	 * @return the message
+	 */
+	public static String getErrorMessage(TraceCompilerException e) {
+		return TraceCompilerEngineErrorMessages.getErrorMessage(
+				(TraceCompilerErrorCode) e.getErrorCode(), e
+						.getErrorParameters());
+	}
+
+	/**
+	 * Maps error code to error message
+	 * 
+	 * @param error
+	 *            the error code
+	 * @param parameters
+	 *            the parameters of the error
+	 * @return the message
+	 */
+	public static String getErrorMessage(TraceCompilerErrorCode error,
+			TraceCompilerErrorParameters parameters) {
+		// CodForChk_Dis_LengthyFunc
+		// CodForChk_Dis_ComplexFunc
+		String s;
+		StringBuffer sb = new StringBuffer();
+		switch (error) {
+		case DUPLICATE_GROUP_ID:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.DuplicateGroupID")); //$NON-NLS-1$
+			break;
+		case DUPLICATE_GROUP_NAME:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.DuplicateGroupName")); //$NON-NLS-1$
+			break;
+		case DUPLICATE_TRACE_ID:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.DuplicateTraceID")); //$NON-NLS-1$
+			break;
+		case DUPLICATE_TRACE_NAME:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.DuplicateTraceName")); //$NON-NLS-1$
+			break;
+		case DUPLICATE_PARAMETER_ID:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.DuplicateParameterID"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case DUPLICATE_CONSTANT_VALUE:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.DuplicateConstantValue"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case DUPLICATE_CONSTANT_ID:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.DuplicateConstantID"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case DUPLICATE_CONSTANT_TABLE_NAME:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.DuplicateConstantTableName"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case DUPLICATE_CONSTANT_TABLE_ID:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.DuplicateConstantTableID"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case DUPLICATE_PARAMETER_NAME:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.DuplicateParameterName"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case INVALID_GROUP_ID:
+			createInvalidGroupIDMessage(parameters, sb);
+			break;
+		case INVALID_TRACE_ID:
+			createInvalidTraceIDMessage(parameters, sb);
+			break;
+		case INVALID_MODEL_PROPERTIES_FOR_EXPORT:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidModelPropertiesForExport"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case INVALID_MODEL_NAME:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.InvalidProjectName")); //$NON-NLS-1$
+			break;
+		case INVALID_GROUP_NAME:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.InvalidGroupName")); //$NON-NLS-1$
+			break;
+		case INVALID_TRACE_NAME:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.InvalidTraceName")); //$NON-NLS-1$
+			break;
+		case INVALID_PARAMETER_NAME:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidParameterName"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case EMPTY_PARAMETER_NAME:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.EmptyParameterName")); //$NON-NLS-1$
+			break;
+		case INVALID_CONSTANT_TABLE_NAME:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidConstantTableName"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case CONSTANT_TABLE_NOT_PART_OF_PROJECT:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ConstantTableNotPartOfProject"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case INVALID_TRACE_DATA:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.InvalidTraceData")); //$NON-NLS-1$
+			break;
+		case INVALID_PARAMETER_TYPE:
+			createInvalidParameterTypeMessage(parameters, sb);
+			break;
+		case INVALID_CONSTANT_VALUE:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidConstantValue"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case SOURCE_NOT_EDITABLE:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.SourceNotEditable"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case INVALID_SOURCE_LOCATION:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidSourceLocation"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case UNREACHABLE_TRACE_LOCATION:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.UnreachableTraceLocation"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case INVALID_PROJECT_FILE:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.InvalidTraceFile")); //$NON-NLS-1$
+			break;
+		case FILE_NOT_FOUND:
+			createFileNotFoundMessage((FileErrorParameters) parameters, sb);
+			break;
+		case INVALID_PATH:
+			createInvalidPathMessage((FileErrorParameters) parameters, sb);
+			break;
+		case SOURCE_NOT_OPEN:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.SourceNotOpen")); //$NON-NLS-1$
+			break;
+		case CANNOT_OPEN_PROJECT_FILE:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.CannotOpenProjectFile"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case CANNOT_WRITE_PROJECT_FILE:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.CannotWriteProjectFile"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case PARAMETER_FORMAT_MISMATCH:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterFormatMismatch"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case GROUP_NOT_SELECTED:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.GroupNotSelected")); //$NON-NLS-1$
+			break;
+		case TRACE_NOT_SELECTED:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.TraceNotSelected")); //$NON-NLS-1$
+			break;
+		case CONSTANT_TABLE_NOT_SELECTED:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ConstantTableNotSelected"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case LOCATION_NOT_SELECTED:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.TraceLocationNotSelected"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case CANNOT_DELETE_SELECTED_OBJECT:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.CannotDeleteSelectedObject"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case MODEL_NOT_READY:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.TraceProjectNotOpen"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case NO_TRACE_GROUPS:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.NoTraceGroups")); //$NON-NLS-1$
+			break;
+		case NOT_ENOUGH_PARAMETERS:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.NotEnoughParameters"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case PARAMETER_ADD_NOT_ALLOWED:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterAddNotAllowed"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case PARAMETER_REMOVE_NOT_ALLOWED:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterRemoveNotAllowed"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case PARAMETER_TEMPLATE_ALREADY_IN_USE:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterTemplateInUse"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case CONSTANT_TABLE_PARSE_FAILED:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ConstantTableParseFailed"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case UNEXPECTED_EXCEPTION:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.UnexpectedException"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case TRACE_NAME_FORMAT_MISSING_FUNCTION:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.NameFormatMissingFunction"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case INVALID_TRACE_TEXT_FORMAT:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidTraceTextFormat"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case INVALID_TRACE_NAME_FORMAT:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidTraceNameFormat"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case NO_FUNCTIONS_TO_INSTRUMENT_WITH_TEMPLATE:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.NoFunctionsToInstrumentPrefix"); //$NON-NLS-1$
+			sb.append(s);
+			sb.append(((StringErrorParameters) parameters).string);
+			s = Messages
+					.getString("TraceCompilerErrorMessages.NoFunctionsToInstrumentPostfix"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case NO_FUNCTIONS_TO_INSTRUMENT:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.NoFunctionsToInstrument"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case MULTIPLE_ERRORS_IN_OPERATION:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.MultipleErrorsInOperation"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case NO_TRACES_TO_DELETE:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.NoTracesToDelete")); //$NON-NLS-1$
+			break;
+		case TRACE_DOES_NOT_EXIST:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.TraceDoesNotExist"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case TRACE_NEEDS_CONVERSION:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.TraceNeedsConversionPrefix"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case PARAMETER_COUNT_MISMATCH:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterCountMismatch"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case PARAMETER_COUNT_DOES_NOT_MATCH_API:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterCountDoesNotMatchApi"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case TRACE_HAS_NO_LOCATIONS:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.TraceHasNoLocations"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case TRACE_HAS_MULTIPLE_LOCATIONS:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.TraceHasMultipleLocations"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case LOCATION_PARSER_FAILED:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.LocationCouldNotBeParsed"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case NO_TRACES_TO_EXPORT:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.NoTracesToExport"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case CANNOT_OPEN_SOURCE_FILE:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.CannotOpenSourceFile"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case CANNOT_UPDATE_TRACE_INTO_SOURCE:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.CannotUpdateTraceIntoSource"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case PARAMETER_FORMAT_NOT_SUPPORTED:
+			createParameterFormatNotSupportedMessage(parameters, sb);
+			break;
+		case PARAMETER_FORMAT_NEEDS_EXT_MACRO:
+			createParameterFormatNotSupportedInMacroMessage(parameters, sb);
+			break;
+		case PARAMETER_FORMAT_NOT_SUPPORTED_IN_ARRAY:
+			createParameterFormatNotSupportedInArrayMessage(parameters, sb);
+			break;
+		case PARAMETER_FORMAT_UNNECESSARY_EXT_MACRO:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterFormatUnnecessaryExtMacro"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case PROPERTY_FILE_ELEMENT_NOT_SUPPORTED:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.PropertyFileElementNotSupportedPrefix"); //$NON-NLS-1$ CodForChk_Dis_LengthyLine
+			sb.append(s);
+			sb.append(((StringErrorParameters) parameters).string);
+			s = Messages
+					.getString("TraceCompilerErrorMessages.PropertyFileElementNotSupportedPostfix"); //$NON-NLS-1$ CodForChk_Dis_LengthyLine
+			sb.append(s);
+			break;
+		case PROPERTY_FILE_ELEMENT_MISPLACED:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.PropertyFileElementMisplacedPrefix"); //$NON-NLS-1$
+			sb.append(s);
+			sb.append(((StringErrorParameters) parameters).string);
+			s = Messages
+					.getString("TraceCompilerErrorMessages.PropertyFileElementMisplacedPostfix"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case PROPERTY_FILE_ATTRIBUTE_INVALID:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.PropertyFileAttributeInvalidPrefix"); //$NON-NLS-1$
+			sb.append(s);
+			sb.append(((StringErrorParameters) parameters).string);
+			s = Messages
+					.getString("TraceCompilerErrorMessages.PropertyFileAttributeInvalidPostfix"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case INSERT_TRACE_DOES_NOT_WORK:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InsertTraceDoesNotWork"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case NO_CONTEXT_FOR_LOCATION:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.NoContextForLocation"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case CANNOT_PARSE_FUNCTION_PARAMETERS:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.CannotParseFunctionParameters"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case INVALID_PARAMETER_NAME_IN_RETURN_VALUE:
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidParameterNameInReturnValue"); //$NON-NLS-1$
+			sb.append(s);
+			break;
+		case RUN_OUT_OF_GROUP_IDS:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.RunOutOfGroupIDs")); //$NON-NLS-1$
+			break;
+		case RUN_OUT_OF_TRACE_IDS:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.RunOutOfTraceIDs")); //$NON-NLS-1$
+			break;
+		case VAR_ARG_LIST_PARAMETER_FOUND:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.VarArgListParameterFound")); //$NON-NLS-1$
+			break;
+		case INVALID_USAGE_OF_TRACE_STATE_GROUP_NAME:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.InvalidUsageOfTraceStateGroupName")); //$NON-NLS-1$
+			break;
+		case INVALID_USAGE_OF_TRACE_PERFORMACE_GROUP_NAME:
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.InvalidUsageOfTracePerformanceGroupName")); //$NON-NLS-1$
+			break;
+		default:
+			break;
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Creates invalid parameter type message
+	 * 
+	 * @param parameters
+	 *            the parameters
+	 * @param sb
+	 *            the message buffer
+	 */
+	private static void createInvalidParameterTypeMessage(
+			TraceCompilerErrorParameters parameters, StringBuffer sb) {
+		String s;
+		if (parameters instanceof StringErrorParameters) {
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidParameterTypePrefix"); //$NON-NLS-1$
+			sb.append(s);
+			sb.append(((StringErrorParameters) parameters).string);
+			String format = SourceUtils
+					.mapNormalTypeToFormat(((StringErrorParameters) parameters).string);
+			if (format != null) {
+				sb.append(" "); //$NON-NLS-1$
+				sb.append(format);
+			}
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidParameterTypePostfix"); //$NON-NLS-1$
+			sb.append(s);
+		} else {
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidParameterType"); //$NON-NLS-1$
+			sb.append(s);
+		}
+	}
+
+	/**
+	 * Creates parameter format not supported message
+	 * 
+	 * @param parameters
+	 *            the parameters
+	 * @param sb
+	 *            the message buffer
+	 */
+	private static void createParameterFormatNotSupportedMessage(
+			TraceCompilerErrorParameters parameters, StringBuffer sb) {
+		String s;
+		if (parameters instanceof StringErrorParameters) {
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterFormatNotSupportedPrefix"); //$NON-NLS-1$
+			sb.append(s);
+			sb.append(((StringErrorParameters) parameters).string);
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterFormatNotSupportedPostfix"); //$NON-NLS-1$
+			sb.append(s);
+		} else {
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterFormatNotSupported"); //$NON-NLS-1$
+			sb.append(s);
+		}
+	}
+
+	/**
+	 * Creates parameter not supported in macro message
+	 * 
+	 * @param parameters
+	 *            the parameters
+	 * @param sb
+	 *            the message buffer
+	 */
+	private static void createParameterFormatNotSupportedInMacroMessage(
+			TraceCompilerErrorParameters parameters, StringBuffer sb) {
+		String s;
+		if (parameters instanceof StringErrorParameters) {
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterFormatNotSupportedInMacroPrefix"); //$NON-NLS-1$ CodForChk_Dis_LengthyLine
+			sb.append(s);
+			sb.append(((StringErrorParameters) parameters).string);
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterFormatNotSupportedInMacroPostfix"); //$NON-NLS-1$ CodForChk_Dis_LengthyLine
+			sb.append(s);
+		} else {
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterFormatNotSupportedInMacro"); //$NON-NLS-1$
+			sb.append(s);
+		}
+	}
+
+	/**
+	 * Creates parameter not supported in array message
+	 * 
+	 * @param parameters
+	 *            the parameters
+	 * @param sb
+	 *            the message buffer
+	 */
+	private static void createParameterFormatNotSupportedInArrayMessage(
+			TraceCompilerErrorParameters parameters, StringBuffer sb) {
+		String s;
+		if (parameters instanceof StringErrorParameters) {
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterFormatNotSupportedInArrayPrefix"); //$NON-NLS-1$ CodForChk_Dis_LengthyLine
+			sb.append(s);
+			sb.append(((StringErrorParameters) parameters).string);
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterFormatNotSupportedInArrayPostfix"); //$NON-NLS-1$ CodForChk_Dis_LengthyLine
+			sb.append(s);
+		} else {
+			s = Messages
+					.getString("TraceCompilerErrorMessages.ParameterFormatNotSupportedInArray"); //$NON-NLS-1$
+			sb.append(s);
+		}
+	}
+
+	/**
+	 * Creates invalid trace ID message
+	 * 
+	 * @param parameters
+	 *            the parameters
+	 * @param sb
+	 *            the message buffer
+	 */
+	private static void createInvalidTraceIDMessage(
+			TraceCompilerErrorParameters parameters, StringBuffer sb) {
+		String s;
+		if (parameters instanceof RangeErrorParameters) {
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidTraceIDStart"); //$NON-NLS-1$
+			sb.append(s);
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidTraceIDMiddle"); //$NON-NLS-1$
+			addRangeParameter((RangeErrorParameters) parameters, sb, s);
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.InvalidTraceIDEnd")); //$NON-NLS-1$
+		} else {
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.InvalidTraceID")); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Creates invalid group ID message
+	 * 
+	 * @param parameters
+	 *            the parameters
+	 * @param sb
+	 *            the message buffer
+	 */
+	private static void createInvalidGroupIDMessage(
+			TraceCompilerErrorParameters parameters, StringBuffer sb) {
+		String s;
+		if (parameters instanceof RangeErrorParameters) {
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidGroupIDStart"); //$NON-NLS-1$
+			sb.append(s);
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidGroupIDMiddle"); //$NON-NLS-1$
+			addRangeParameter((RangeErrorParameters) parameters, sb, s);
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.InvalidGroupIDEnd")); //$NON-NLS-1$
+		} else {
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.InvalidGroupID")); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Adds a range parameter to error buffer
+	 * 
+	 * @param parameters
+	 *            the range
+	 * @param sb
+	 *            the buffer
+	 * @param middleText
+	 *            the text between the range
+	 */
+	private static void addRangeParameter(RangeErrorParameters parameters,
+			StringBuffer sb, String middleText) {
+		if (parameters.isHex) {
+			sb.append(SourceConstants.HEX_PREFIX);
+			sb.append(Integer.toHexString(parameters.start));
+		} else {
+			sb.append(parameters.start);
+		}
+		sb.append(middleText);
+		if (parameters.isHex) {
+			sb.append(SourceConstants.HEX_PREFIX);
+			sb.append(Integer.toHexString(parameters.end));
+		} else {
+			sb.append(parameters.end);
+		}
+	}
+
+	/**
+	 * Creates "Invalid directory" message
+	 * 
+	 * @param parameters
+	 *            the message parameters
+	 * @param sb
+	 *            the string buffer where the message is stored
+	 */
+	private static void createInvalidPathMessage(
+			FileErrorParameters parameters, StringBuffer sb) {
+		String s;
+		if (parameters != null) {
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidDirectoryPrefix"); //$NON-NLS-1$
+			sb.append(s);
+			sb.append(convertPath(parameters.file));
+			s = Messages
+					.getString("TraceCompilerErrorMessages.InvalidDirectoryPostfix"); //$NON-NLS-1$
+			sb.append(s);
+		} else {
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.InvalidDirectory")); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Creates "File not found" message
+	 * 
+	 * @param parameters
+	 *            the message parameters
+	 * @param sb
+	 *            the string buffer where the message is stored
+	 */
+	private static void createFileNotFoundMessage(
+			FileErrorParameters parameters, StringBuffer sb) {
+		String s;
+		if (parameters != null) {
+			s = Messages
+					.getString("TraceCompilerErrorMessages.FileDoesNotExistPrefix"); //$NON-NLS-1$
+			sb.append(s);
+			sb.append(convertPath(parameters.file));
+			s = Messages
+					.getString("TraceCompilerErrorMessages.FileDoesNotExistPostfix"); //$NON-NLS-1$
+			sb.append(s);
+		} else {
+			sb.append(Messages
+					.getString("TraceCompilerErrorMessages.FileDoesNotExist")); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Adds some spaces to path string to allow folding
+	 * 
+	 * @param path
+	 *            the path
+	 * @return the converted path
+	 */
+	public static String convertPath(String path) {
+		StringBuffer sb = new StringBuffer();
+		int strIndex = -1;
+		do {
+			strIndex++;
+			int lastIndex = strIndex;
+			strIndex = path.indexOf(File.separatorChar, strIndex);
+			if (strIndex != -1) {
+				String sub = path.substring(lastIndex, strIndex);
+				if (sub.length() > 0) {
+					sb.append(sub);
+					sb.append(' ');
+					sb.append(File.separatorChar);
+					sb.append(' ');
+				}
+			} else {
+				// If the data ends with file separator, lastIndex points to
+				// end-of-data. If not, the rest of the data is appended without
+				// further white spaces
+				if (lastIndex < path.length()) {
+					String sub = path.substring(lastIndex);
+					sb.append(sub);
+				}
+			}
+		} while (strIndex != -1);
+		return sb.toString();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineEvents.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,98 @@
+/*
+* 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:
+*
+* Event listener interface
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import com.nokia.tracecompiler.model.TraceCompilerException;
+
+/**
+ * Event listener interface
+ * 
+ */
+public interface TraceCompilerEngineEvents {
+
+	/**
+	 * Posts an error event to TraceCompiler
+	 * 
+	 * @param exception
+	 *            the error data
+	 */
+	public void postError(TraceCompilerException exception);
+
+	/**
+	 * Posts an error event to TraceCompiler
+	 * 
+	 * @param message
+	 *            the error message
+	 * @param source
+	 *            the error source
+	 * @param postEvent
+	 *            defines is error event also posted to trace event view
+	 */
+	public void postErrorMessage(String message, Object source, boolean postEvent);
+
+	/**
+	 * Posts a warning event to TraceCompiler
+	 * 
+	 * @param message
+	 *            the warning message
+	 * @param source
+	 *            the warning source
+	 */
+	public void postWarningMessage(String message, Object source);
+
+	/**
+	 * Posts an info event to TraceCompiler
+	 * 
+	 * @param message
+	 *            the info message
+	 * @param source
+	 *            the info source
+	 */
+	public void postInfoMessage(String message, Object source);
+
+	/**
+	 * Posts a critical assertion failed event
+	 * 
+	 * @param message
+	 *            the message
+	 * @param source
+	 *            the source of the assertion
+	 * @throws TraceCompilerException 
+	 */
+	public void postCriticalAssertionFailed(String message, Object source) throws TraceCompilerException;
+
+	/**
+	 * Posts an assertion failed event
+	 * 
+	 * @param message
+	 *            the message
+	 * @param source
+	 *            the source of the assertion
+	 */
+	public void postAssertionFailed(String message, Object source);
+
+	/**
+	 * Gets the processing error
+	 * 
+	 * @return the error
+	 */
+	public boolean hasErrorHappened();
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineGlobals.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,255 @@
+/*
+* Copyright (c) 2008-2010 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:
+*
+* Access point to the exported interfaces of TraceCompiler engine
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import com.nokia.tracecompiler.TraceCompilerLogger;
+import com.nokia.tracecompiler.engine.source.SourceEngine;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.plugin.TraceCompilerPlugin;
+import com.nokia.tracecompiler.source.SourceConstants;
+
+/**
+ * Access point to the exported interfaces of TraceCompiler engine
+ * 
+ */
+public class TraceCompilerEngineGlobals {
+
+	/**
+	 * Max group ID
+	 */
+	public static final int MAX_GROUP_ID = 65535; // CodForChk_Dis_Magic
+
+	/**
+	 * Max trace ID
+	 */
+	public static final int MAX_TRACE_ID = 65535; // CodForChk_Dis_Magic
+
+	/**
+	 * TraceCompiler engine instance
+	 */
+	private static TraceCompilerEngine instance;
+	
+	/**
+	 * default licence
+	 */
+	static String defaultLicence;
+	
+	/**
+	 * default licence
+	 */
+	static String defaultLicenceWithHash;
+	
+	/**
+	 * Constructor is hidden
+	 */
+	private TraceCompilerEngineGlobals() {
+	}
+
+	/**
+	 * Starts TraceCompiler engine.
+	 * @throws TraceCompilerException 
+	 */
+	public static void start() throws TraceCompilerException {
+		if (instance == null) {
+			instance = new TraceCompilerEngine();
+			instance.start();
+		}
+	}
+
+	/**
+	 * Shuts down the TraceCompiler instance
+	 * @throws TraceCompilerException 
+	 */
+	public static void shutdown() throws TraceCompilerException {
+		if (instance != null) {
+			instance.shutdown();
+			instance = null;
+		}
+	}
+
+	/**
+	 * Gets the configuration interface. The configuration interface is not
+	 * available until view has been registered.
+	 * 
+	 * @return the configuration
+	 */
+	public static TraceCompilerEngineConfiguration getConfiguration() {
+		return instance.getConfiguration();
+	}
+
+	/**
+	 * Gets the trace model
+	 * 
+	 * @return the model
+	 */
+	public static TraceModel getTraceModel() {
+		return instance.getModel();
+	}
+
+	/**
+	 * Gets the source engine
+	 * 
+	 * @return the source engine
+	 */
+	public static SourceEngine getSourceEngine() {
+		return instance.getSourceEngine();
+	}
+
+	/**
+	 * Gets the trace compiler interface
+	 * 
+	 * @return trace compiler
+	 */
+	public static TraceCompilerEngineInterface getTraceCompiler() {
+		return instance.getTraceCompiler();
+	}
+
+	/**
+	 * Gets the events interface
+	 * 
+	 * @return the events interface
+	 */
+	public static TraceCompilerEngineEvents getEvents() {
+		if (instance != null) {
+			return instance.getEvents();
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Called by a plug-in to register itself
+	 * 
+	 * @param plugin
+	 *            the plugin to be registered
+	 */
+	public static void registerPlugin(TraceCompilerPlugin plugin) {
+		instance.registerPlugin(plugin);
+	}
+
+	/**
+	 * Called by a plug-in to unregister itself
+	 * 
+	 * @param plugin
+	 *            the plugin to be unregistered
+	 */
+	public static void unregisterPlugin(TraceCompilerPlugin plugin) {
+		if (instance != null) {
+			instance.unregisterPlugin(plugin);
+		}
+	}
+
+	/**
+	 * Called by the view plug-in to register the view
+	 * 
+	 * @param view
+	 *            the view
+	 * @throws TraceCompilerException 
+	 */
+	public static void setView(TraceCompilerEngineView view) throws TraceCompilerException {
+		instance.setView(view);
+	}
+
+	/**
+	 * Gets the source context manager
+	 * 
+	 * @return the context manager
+	 */
+	public static SourceContextManager getSourceContextManager() {
+		return instance.getSourceContextManager();
+	}
+
+	/**
+	 * Get project path
+	 * 
+	 * @return project path
+	 */
+	public static String getProjectPath() {
+		String projetcPath = instance.getProjectPath();
+		return projetcPath;
+	}
+
+	/**
+	 * Set project path
+	 * 
+	 * @param path
+	 *            the path
+	 */
+	public static void setProjectPath(String path) {
+		instance.setProjectPath(path);
+	}
+	
+	/**
+	 * get default licence from com/nokia/tracecompiler/licence.lic
+	 * c++ comment format
+	 * @param boolean cppCommented
+	 *  if true, it returns the licence in cpp comment \/** ... **\/
+	 *  else it retuen the licence in a # comment ## ... ##
+	 * @return String licence
+	 */
+	public static String getDefaultLicence(boolean cppCommented) {
+		String licenceResourceName;
+		if (cppCommented) {
+			if (defaultLicence == null) {
+				licenceResourceName = "/com/nokia/tracecompiler/licence.lic"; //$NON-NLS-1$
+				defaultLicence = readLicence(licenceResourceName);
+			}
+			return defaultLicence;
+		} else {
+			if (defaultLicenceWithHash == null) {
+				licenceResourceName = "/com/nokia/tracecompiler/licence_hash.lic"; //$NON-NLS-1$
+				defaultLicenceWithHash = readLicence(licenceResourceName);
+			}
+			return defaultLicenceWithHash;
+		}
+	}
+
+	/**
+	 * read the provided resource file and return the text in it.
+	 */
+	private static String readLicence(String aLicenceResourceName) {
+		String licenceText = null;
+		InputStream is = instance.getClass().getResourceAsStream(aLicenceResourceName); 
+		if (is != null) {
+			InputStreamReader isr = new InputStreamReader(is);
+			BufferedReader br = new BufferedReader(isr);
+			StringBuffer sb = new StringBuffer();
+			String line;
+			try {
+				while ((line = br.readLine()) != null) {
+					sb.append(line + SourceConstants.LINE_FEED);
+				}
+				licenceText = sb.toString();
+				br.close();
+				isr.close();
+				is.close();
+			} catch (IOException e) {
+				TraceCompilerLogger.printWarning(Messages.getString("TraceCompilerErrorMessages.LicenceFileError") + e.getMessage()); //$NON-NLS-1$
+			}
+		}
+		return licenceText;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineInterface.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,55 @@
+/*
+* 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:
+*
+* TraceCompiler interface
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import com.nokia.tracecompiler.model.TraceCompilerException;
+
+/**
+ * TraceCompiler interface
+ * 
+ */
+public interface TraceCompilerEngineInterface {
+
+	/**
+	 * Opens the trace project related to given source file
+	 * 
+	 * @param modelName
+	 *            the name for the model
+	 * @throws TraceCompilerException
+	 *             if startup fails
+	 * @throws Exception 
+	 */
+	public void openProject(String modelName)
+			throws Exception; //this include TraceCompilerException
+
+	/**
+	 * Exports the trace project
+	 * 
+	 * @throws TraceCompilerException
+	 *             if export fails
+	 */
+	public void exportProject() throws TraceCompilerException;
+
+	/**
+	 * Closes the trace project
+	 * @throws TraceCompilerException 
+	 */
+	public void closeProject() throws TraceCompilerException;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceCompilerEngineView.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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 implemented by the view of TraceCompiler
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+/**
+ * Interface implemented by the view of TraceCompiler. The view is implemented
+ * as a separate plug-in, which is registered via
+ * {@link TraceCompilerEngineGlobals#setView(TraceCompilerView)}
+ * 
+ * @see com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals#setView(TraceCompilerView)
+ */
+public interface TraceCompilerEngineView {
+
+	/**
+	 * Gets the configuration interface
+	 * 
+	 * @return the configuration interface
+	 */
+	public TraceCompilerEngineConfiguration getConfiguration();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceLocation.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,491 @@
+/*
+* 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:
+*
+* Represents a location of a trace within a source document
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.source.SourceParserResult;
+import com.nokia.tracecompiler.engine.source.SourceParserRule;
+import com.nokia.tracecompiler.engine.source.SourceProperties;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerErrorParameters;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceObject;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SourceLocation;
+import com.nokia.tracecompiler.source.SourceLocationListener;
+
+/**
+ * Represents a location of a trace within a source document. The locations of a
+ * document are updated by TraceLocationUpdater when document is changed
+ * 
+ */
+public class TraceLocation extends SourceLocation implements LocationProperties {
+
+	/**
+	 * Source which owns this location
+	 */
+	private SourceProperties source;
+
+	/**
+	 * Name of the trace as parsed from source
+	 */
+	private String originalName;
+
+	/**
+	 * Name after conversion to valid trace name
+	 */
+	private String convertedName;
+
+	/**
+	 * Text of the trace as parsed from source
+	 */
+	private String traceText;
+
+	/**
+	 * The tag of the parser that found this trace location
+	 */
+	private String tag;
+
+	/**
+	 * Content changed flag
+	 */
+	private boolean contentChanged;
+
+	/**
+	 * Name changed flag
+	 */
+	private boolean nameChanged;
+
+	/**
+	 * The location list
+	 */
+	private TraceLocationList list;
+
+	/**
+	 * The parameters
+	 */
+	private List<String> parameters;
+
+	/**
+	 * Parser-specific data associated with this location
+	 */
+	private List<String> parserData;
+
+	/**
+	 * Rule which defines how the parameters found from source are interpreted
+	 */
+	private SourceParserRule parserRule;
+
+	/**
+	 * Flag, which determines if this location has changed after last convert
+	 * operation
+	 */
+	private boolean changedAfterConvert = true;
+
+	/**
+	 * Last notified validity code
+	 */
+	private TraceCompilerErrorCode notifiedValidity = TraceCompilerErrorCode.OK;
+
+	/**
+	 * Last notified validity parameters
+	 */
+	private TraceCompilerErrorParameters notifiedValidityParameters;
+
+	/**
+	 * Parser error code
+	 */
+	private TraceCompilerErrorCode parserErrorCode = TraceCompilerErrorCode.OK;
+
+	/**
+	 * Parser error parameters
+	 */
+	private TraceCompilerErrorParameters parserErrorParameters;
+
+	/**
+	 * Converter error code
+	 */
+	private TraceCompilerErrorCode converterErrorCode = TraceCompilerErrorCode.OK;
+
+	/**
+	 * Converter error parameters
+	 */
+	private TraceCompilerErrorParameters converterErrorParameters;
+
+	/**
+	 * Creates a new location
+	 * 
+	 * @param source
+	 *            the source where the location is associated
+	 * @param offset
+	 *            the offset to the trace within the source document
+	 * @param length
+	 *            the length of the trace
+	 */
+	public TraceLocation(SourceProperties source, int offset, int length) {
+		super(source.getSourceParser(), offset, length);
+		this.source = source;
+	}
+
+	/**
+	 * Sets the content changed flag. If <i>changed</i> is false this also sets
+	 * the name changed flag to false
+	 * 
+	 * @param changed
+	 *            the new changed flag
+	 */
+	public void setContentChanged(boolean changed) {
+		this.contentChanged = changed;
+		if (!changed) {
+			nameChanged = false;
+		}
+	}
+
+	/**
+	 * Checks if the content has changed.
+	 * 
+	 * @return the content changed flag
+	 */
+	public boolean isContentChanged() {
+		return contentChanged;
+	}
+
+	/**
+	 * Checks if the name has changed.
+	 * 
+	 * @return the name changed flag
+	 */
+	public boolean isNameChanged() {
+		return contentChanged && nameChanged;
+	}
+
+	/**
+	 * Gets the trace this location is associated to or null if unrelated
+	 * 
+	 * @return the trace
+	 */
+	public Trace getTrace() {
+		Trace retval = null;
+		if (list != null) {
+			TraceObject object = list.getOwner();
+			if (object instanceof Trace) {
+				retval = (Trace) object;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets the name of the trace as parsed from source
+	 * 
+	 * @return the name of the trace
+	 */
+	public String getOriginalName() {
+		return originalName;
+	}
+
+	/**
+	 * Gets the name of the trace after conversion to valid name
+	 * 
+	 * @return the name of the trace
+	 */
+	public String getConvertedName() {
+		return convertedName;
+	}
+
+	/**
+	 * Gets the text of the trace
+	 * 
+	 * @return the text of the trace
+	 */
+	public String getTraceText() {
+		return traceText;
+	}
+
+	/**
+	 * Returns the source properties this location belongs to
+	 * 
+	 * @return source properties
+	 */
+	public SourceProperties getSource() {
+		return source;
+	}
+
+	/**
+	 * Sets the location list which owns this location
+	 * 
+	 * @param list
+	 *            the location list
+	 */
+	public void setLocationList(TraceLocationList list) {
+		this.list = list;
+	}
+
+	/**
+	 * Gets the location list this location belongs to
+	 * 
+	 * @return the list
+	 */
+	public TraceLocationList getLocationList() {
+		return list;
+	}
+
+	/**
+	 * Sets the parser rule that will be used to parse the data of this
+	 * location. Must be called before setData
+	 * 
+	 * @param rule
+	 *            the rule used to parse the data
+	 */
+	public void setParserRule(SourceParserRule rule) {
+		parserRule = rule;
+	}
+
+	/**
+	 * Gets the parser rule that found this location
+	 * 
+	 * @return the parser rule
+	 */
+	public SourceParserRule getParserRule() {
+		return parserRule;
+	}
+
+	/**
+	 * Sets the trace tag that was found from source
+	 * 
+	 * @param tag
+	 *            the trace tag
+	 */
+	public void setTag(String tag) {
+		this.tag = tag;
+	}
+
+	/**
+	 * Gets the trace tag
+	 * 
+	 * @return the tag
+	 */
+	public String getTag() {
+		return tag;
+	}
+
+	/**
+	 * Sets the trace data
+	 * 
+	 * @param list
+	 *            the list of parameters
+	 */
+	public void setData(ArrayList<String> list) {
+		try {
+			SourceParserResult result = parserRule.parseParameters(tag, list);
+			setData(result.originalName, result.convertedName,
+					result.traceText, result.parameters, result.parserData);
+			parserRule.getLocationParser().processNewLocation(this);
+			parserErrorCode = TraceCompilerErrorCode.OK;
+			parserErrorParameters = null;
+			converterErrorCode = TraceCompilerErrorCode.OK;
+			converterErrorParameters = null;
+		} catch (TraceCompilerException e) {
+			parserErrorCode = (TraceCompilerErrorCode) e.getErrorCode();
+			parserErrorParameters = e.getErrorParameters();
+		}
+	}
+
+	/**
+	 * Sets the trace name and parameter list
+	 * 
+	 * @param originalName
+	 *            the name parsed from source
+	 * @param convertedName
+	 *            the name after conversion
+	 * @param traceText
+	 *            the text parsed from source
+	 * @param parameters
+	 *            the list of parameters parsed from source
+	 * @param parserData
+	 *            list of parser-specific data
+	 */
+	private void setData(String originalName, String convertedName,
+			String traceText, List<String> parameters, List<String> parserData) {
+		if (!convertedName.equals(this.convertedName)) {
+			this.convertedName = convertedName;
+			nameChanged = true;
+		}
+		this.originalName = originalName;
+		//remove line feed if the trace text spans multiple lines.
+		if (traceText != null ) {
+			this.traceText = traceText.replaceAll(SourceConstants.LINE_FEED, ""); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		this.parameters = parameters;
+		this.parserData = parserData;
+	}
+
+	/**
+	 * Removes the parameter at given index
+	 * 
+	 * @param index
+	 *            the index
+	 */
+	public void removeParameterAt(int index) {
+		// NOTE: Does not cause validity callbacks
+		// This is currently only used temporarily when removing a parameter
+		// from trace. This is needed to correctly update the source code
+		if (parameters != null && index >= 0 && index < parameters.size()) {
+			parameters.remove(index);
+		}
+	}
+
+	/**
+	 * Gets the number of parameters found from the source code
+	 * 
+	 * @return the number of parameters
+	 */
+	public int getParameterCount() {
+		return parameters != null ? parameters.size() : 0;
+	}
+
+	/**
+	 * Gets the parameter at given index
+	 * 
+	 * @param index
+	 *            the parameter index
+	 * @return the parameter at the index
+	 */
+	public String getParameter(int index) {
+		return parameters.get(index);
+	}
+
+	/**
+	 * Gets the parameters
+	 * 
+	 * @return iterator over the parameters
+	 */
+	public Iterator<String> getParameters() {
+		List<String> list = null;
+		if (parameters != null) {
+			list = parameters;
+		} else {
+			list = Collections.emptyList();
+		}
+		return list.iterator();
+	}
+
+	/**
+	 * Gets the parser-specific data
+	 * 
+	 * @return the parser data
+	 */
+	public List<String> getParserData() {
+		return parserData;
+	}
+
+	/**
+	 * Gets the current location validity code.
+	 * 
+	 * @return the validity code
+	 */
+	public TraceCompilerErrorCode getValidityCode() {
+		return notifiedValidity;
+	}
+
+	/**
+	 * Gets the parameters associated with the current location validity code.
+	 * 
+	 * @return the validity code
+	 */
+	public TraceCompilerErrorParameters getValidityParameters() {
+		return notifiedValidityParameters;
+	}
+
+	/**
+	 * Creates a notification if validity has changed. This is initially called
+	 * from the location list when a location is added to it and after that from
+	 * notifyLocationChanged.
+	 */
+	void runValidityCheck() {
+		TraceCompilerErrorCode code;
+		TraceCompilerErrorParameters parameters;
+		if (parserErrorCode != TraceCompilerErrorCode.OK) {
+			code = parserErrorCode;
+			parameters = parserErrorParameters;
+		} else if (converterErrorCode != TraceCompilerErrorCode.OK) {
+			code = converterErrorCode;
+			parameters = converterErrorParameters;
+		} else {
+			code = TraceCompilerErrorCode.TRACE_DOES_NOT_EXIST;
+			parameters = null;
+			if (parserRule != null) {
+				code = parserRule.getLocationParser().checkLocationValidity(
+						this);
+			}
+		}
+		if (code != notifiedValidity) {
+			notifiedValidity = code;
+			notifiedValidityParameters = parameters;
+			Iterator<SourceLocationListener> itr = getListeners();
+			while (itr.hasNext()) {
+				SourceLocationListener listener = itr.next();
+				if (listener instanceof SourceLocationListener) {
+					((SourceLocationListener) listener)
+							.locationValidityChanged(this);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Sets the converter error code and runs the validity check to notify
+	 * listeners about change in error code
+	 * 
+	 * @param errorCode
+	 *            the new error code
+	 * @param parameters
+	 *            the error parameters
+	 */
+	void setConverterErrorCode(TraceCompilerErrorCode errorCode,
+			TraceCompilerErrorParameters parameters) {
+		converterErrorCode = errorCode;
+		converterErrorParameters = parameters;
+		runValidityCheck();
+	}
+
+	/**
+	 * Flag, which determines if the location has changed since last convert
+	 * operation
+	 * 
+	 * @return the flag
+	 */
+	public boolean hasChangedAfterConvert() {
+		return changedAfterConvert;
+	}
+
+	/**
+	 * Called when the location has been converted. Sets the changed after
+	 * convert flag to false
+	 */
+	public void locationConverted() {
+		changedAfterConvert = false;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceLocationConverter.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,679 @@
+/*
+ * Copyright (c) 2008-2010 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:
+ *
+ * Location converter monitors locations and converts them to traces if necessary.
+ *
+ */
+package com.nokia.tracecompiler.engine;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+import com.nokia.tracecompiler.TraceCompilerConstants;
+import com.nokia.tracecompiler.TraceCompilerLogger;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.project.ProjectConstants;
+import com.nokia.tracecompiler.engine.project.ProjectEngine;
+import com.nokia.tracecompiler.engine.project.SortedProperties;
+import com.nokia.tracecompiler.engine.project.TraceIDCache;
+import com.nokia.tracecompiler.engine.rules.PerformanceEventRuleBase;
+import com.nokia.tracecompiler.engine.rules.StateTraceRule;
+import com.nokia.tracecompiler.engine.source.SourceParserRule;
+import com.nokia.tracecompiler.engine.source.SourceProperties;
+import com.nokia.tracecompiler.engine.source.SourceParserRule.ParameterConversionResult;
+import com.nokia.tracecompiler.engine.source.SourceParserRule.TraceConversionResult;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceGroup;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceModelPersistentExtension;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.project.FormattingUtils;
+import com.nokia.tracecompiler.project.GroupNames;
+import com.nokia.tracecompiler.project.ProjectUtils;
+import com.nokia.tracecompiler.source.SourceConstants;
+
+/**
+ * Location converter monitors locations and converts them to traces if
+ * necessary.
+ * 
+ */
+public final class TraceLocationConverter {
+
+	/**
+	 * Number of deprecated groups
+	 */
+	final static int NUMBER_OF_DEPRECATED_GROUPS = 3;
+
+	/**
+	 * Deprecated group name map
+	 */
+	Map<String, String> deprecatedGroupNameMap = new HashMap<String, String>(
+			NUMBER_OF_DEPRECATED_GROUPS);
+
+	/**
+	 * Trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param model
+	 *            the trace model
+	 */
+	TraceLocationConverter(TraceModel model) {
+		this.model = model;
+		initializeDeprecatedGroupNameMap();
+	}
+
+	/**
+	 * Initialize deprecated group name map
+	 */
+	private void initializeDeprecatedGroupNameMap() {
+		deprecatedGroupNameMap.put(GroupNames.TRACE_API,
+				GroupNames.TRACE_BORDER);
+		deprecatedGroupNameMap.put(GroupNames.TRACE_DEBUG,
+				GroupNames.TRACE_DUMP);
+		deprecatedGroupNameMap.put(GroupNames.TRACE_DETAILED,
+				GroupNames.TRACE_INTERNALS);
+	}
+
+	/**
+	 * Source opened notification
+	 * 
+	 * @param properties
+	 *            the source properties
+	 * @throws TraceCompilerException 
+	 */
+	void sourceOpened(SourceProperties properties) throws TraceCompilerException {
+		//make sure all errors are reported AFTER processing a file
+		TraceCompilerEngineGlobals.getSourceContextManager()
+				.setConverting(true);
+		model.startProcessing();
+		try {
+			// Load fixed group and trace ids from definition file to model
+			//no errors are reported here 
+			if (model.getFixedIds() == null) {
+				loadFixedIdsFromDefinitionFileToModel();
+			}
+
+			for (TraceLocation loc : properties) {
+				autoConvertLocation(loc);
+			}
+			// If there are duplicates or unused traces, they are removed
+			// Note that this will work across source files although this
+			// function is processing only one file.
+			// If a trace is created, all locations from all open source files
+			// are linked to that trace and thus it will be removed as
+			// duplicate.
+			removeDuplicateTraces();
+
+		} finally {
+			model.processingComplete();
+			SourceContextManager manager = TraceCompilerEngineGlobals
+					.getSourceContextManager();
+			manager.setConverting(false);
+			manager.setContext(null);
+		}
+	}
+
+	/**
+	 * Load fixed Ids from definiton file to properties
+	 * 
+	 */
+	private void loadFixedIdsFromDefinitionFileToModel() {
+		TraceIDCache cache = model.getExtension(TraceIDCache.class);
+
+		// Create trace Id cache if it does not exist
+		try {
+			if (cache == null) {
+				String path;
+				path = ProjectUtils.getLocationForFile(model,
+						ProjectEngine.traceFolderName,
+						ProjectConstants.FIXED_ID_DEFINITIONS_FILE_NAME, false);
+				if (path != null) {
+					cache = new TraceIDCache(new File(path).getParent());
+					model.addExtension(cache);
+				}
+			}
+			if (cache != null) {
+				File cacheFile = new File(cache.getAbsolutePath());
+				// Try to load Ids from trace Id cache file
+				try {
+					SortedProperties fixedIds = new SortedProperties();
+					if (cacheFile.exists()) {
+						String thisLine;
+						boolean allOldFixedIdsAreValid = true;
+						String group = model.GROUP_PROPERTY_PREFIX;
+						FileInputStream fis = new FileInputStream(cacheFile);
+						BufferedReader myInput = new BufferedReader(
+								new InputStreamReader(fis));
+						// Read the old fixed id definition file
+						while ((thisLine = myInput.readLine()) != null) {
+							if (thisLine.indexOf(group) != -1) {
+								thisLine = thisLine.substring(group.length(),
+										thisLine.length());
+								if (!searchForOldGroupIds(thisLine)) {						
+									String msg  = Messages.getString("TraceLocationConverter.GroupIdValueError"); //$NON-NLS-1$
+									TraceCompilerEngineGlobals.getEvents().postWarningMessage(msg, null);
+									// We need only one old invalid id to make all of them invalid
+									allOldFixedIdsAreValid = false;
+									break;
+								}
+							}
+						}
+						fis.close();
+						
+						if (allOldFixedIdsAreValid) {
+							// Create file input stream again
+							FileInputStream newFis = new FileInputStream(cacheFile);
+							fixedIds.load(newFis);
+							// Load fixed Ids from properties to model
+							model.setFixedIds(fixedIds);
+							newFis.close();
+						}
+						
+					}
+				} catch (IOException e) {
+					// If there is a problem with the cache file, just delete it
+					// make sure the model fixed ids is null
+					model.setFixedIds(null);
+					cacheFile.delete();
+					// We do not raise an exception but we need to report a info
+					TraceCompilerLogger.printWarning(Messages.getString("TraceLocationConverter.FixedIdProblemWarningBeginText") + cacheFile.toString() + Messages.getString("TraceLocationConverter.FixedIdProblemWarningMiddleText") + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			}
+		} catch (TraceCompilerException e) {
+			// This exception can probably be ignored
+			TraceCompilerLogger.printWarning("Could not create ID cache : " + e.getMessage()); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Searches the fixed_id file to see if there are any old definitions
+	 * 
+	 * @param string
+	 *            of text from the fixed_id files
+	 * @return boolean 
+	 */
+	public static boolean searchForOldGroupIds(String str) {
+		
+		boolean oldGroupIdValid = true;
+
+		//get group name from the string
+		int index = str.indexOf(SourceConstants.ASSIGN_WITH_OUT_SPACES);
+		if (index == -1) {
+			//not valid string, so ignore it, just return success
+			return true;
+		}
+
+		String groupName = str.substring(0, index);
+
+		//get group id
+		str = str.substring(str.indexOf(SourceConstants.HEX_PREFIX) + 2, str
+				.length());
+
+		int groupId = -1;
+
+		try {
+			groupId = Integer.parseInt(str.trim(),
+					TraceCompilerConstants.HEX_RADIX);
+		} catch (NumberFormatException e) {
+			//it's not an hex number so fail
+			oldGroupIdValid = false;
+		}
+
+		//get group id from ost header file
+		int fileGroupId = GroupNames.getIdByName(groupName);
+
+		if (fileGroupId != 0) {
+			//found 1
+			if (fileGroupId != groupId) //group id has changed, so old one can't be used
+				oldGroupIdValid = false;
+		} else {
+			if ((GroupNames.USER_GROUP_ID_FIRST > groupId)
+					|| (groupId > GroupNames.USER_GROUP_ID_LAST)) //not within new user defined Ids
+				oldGroupIdValid = false;
+		}
+
+		return oldGroupIdValid;
+	}
+
+	/**
+	 * Converts the given location to trace if parser supports auto-conversion
+	 * 
+	 * @param location
+	 *            the location
+	 */
+	private void autoConvertLocation(TraceLocation location) {
+		// Stores the context of the location to the context manager.
+		TraceCompilerEngineGlobals.getSourceContextManager().setContext(
+				location.getParser().getContext(location.getOffset()));
+		Trace trace = location.getTrace();
+		if (trace == null) {
+			// If the trace does not exist, the parser determines if the
+			// location can be converted
+			if (location.getParserRule().getLocationParser()
+					.isLocationConverted(location)) {
+				try {
+					convertLocation(location, null, true);
+				} catch (TraceCompilerException e) {
+					// If converter fails, the error code is stored into the
+					// location. The location notifies all validity listeners
+					// about the change
+					location.setConverterErrorCode((TraceCompilerErrorCode) e
+							.getErrorCode(), e.getErrorParameters());
+				}
+			}
+		} else {
+			// If the trace already exists in the model, it is updated
+			// based on the source file contents
+			updateLocation(location);
+		}
+	}
+
+	/**
+	 * Recreates the trace from changed location when source is saved
+	 * 
+	 * @param location
+	 *            the location to be checked
+	 */
+	private void updateLocation(TraceLocation location) {
+		// Parser determines if the location can be converted
+		if (location.getParserRule().getLocationParser().isLocationConverted(
+				location)) {
+			try {
+				Trace trace = location.getTrace();
+				// If a location has changed, the old trace is removed
+				// and a new one created. Persistent extensions are moved to the
+				// new trace
+				Iterator<TraceModelPersistentExtension> extensions = null;
+				if (trace != null) {
+					extensions = trace
+							.getExtensions(TraceModelPersistentExtension.class);
+					trace.getGroup().removeTrace(trace);
+				}
+				convertLocation(location, extensions, true);
+
+				// Check that the location is inside a function. Otherwise throw
+				// an error because the code is unreachable
+				if (location.getFunctionName() == null) {
+					throw new TraceCompilerException(
+							TraceCompilerErrorCode.UNREACHABLE_TRACE_LOCATION);
+				}
+
+			} catch (TraceCompilerException e) {
+				// If converter fails, the error code is stored into the
+				// location. The location notifies all validity listeners about
+				// the change
+				location.setConverterErrorCode((TraceCompilerErrorCode) e
+						.getErrorCode(), e.getErrorParameters());
+			}
+		}
+	}
+
+	/**
+	 * Removes all duplicate traces from the model
+	 * @throws TraceCompilerException 
+	 */
+	private void removeDuplicateTraces() throws TraceCompilerException {
+		boolean groupRemoved = true;
+		while (groupRemoved) {
+			groupRemoved = false;
+			for (TraceGroup group : model) {
+				removeDuplicateTracesFromGroup(group);
+				if (!group.hasTraces()) {
+					model.removeGroup(group);
+					groupRemoved = true;
+					break;
+				}
+			}
+		}
+	}
+
+	/**
+	 * Removes duplicate traces from a trace group
+	 * 
+	 * @param group
+	 *            the group
+	 * @throws TraceCompilerException 
+	 */
+	private void removeDuplicateTracesFromGroup(TraceGroup group) throws TraceCompilerException {
+		boolean traceRemoved = true;
+		while (traceRemoved) {
+			traceRemoved = false;
+			for (Trace trace : group) {
+				TraceLocationList list = trace
+						.getExtension(TraceLocationList.class);
+				if (list != null) {
+					if (list.getLocationCount() > 1) {
+						// All the locations are marked as duplicates and the
+						// trace is deleted
+						TraceCompilerErrorCode code = TraceCompilerErrorCode.TRACE_HAS_MULTIPLE_LOCATIONS;
+						for (LocationProperties loc : list) {
+							((TraceLocation) loc).setConverterErrorCode(code,
+									null);
+						}
+						group.removeTrace(trace);
+						traceRemoved = true;
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Converts a location to a Trace object.
+	 * 
+	 * @param location
+	 *            the location to be converted
+	 * @param extensions
+	 *            persistent extensions to be added to the new trace
+	 * @param autoConvert
+	 *            true if converting without user interaction
+	 * @return the new trace
+	 * @throws TraceCompilerException
+	 *             if conversion fails
+	 */
+	private Trace convertLocation(TraceLocation location,
+			Iterator<TraceModelPersistentExtension> extensions,
+			boolean autoConvert) throws TraceCompilerException {
+		Trace trace = null;
+		// If the parser has failed, the validity code is not OK and the
+		// location cannot be converted. Traces marked with no-trace error code
+		// have not yet been converted, so that is OK. Traces that have
+		// duplicate ID's error code can be parsed, since the duplicates might
+		// no longer exist.
+		if (!autoConvert
+				|| location.getValidityCode() == TraceCompilerErrorCode.OK
+				|| location.getValidityCode() == TraceCompilerErrorCode.TRACE_DOES_NOT_EXIST
+				|| location.getValidityCode() == TraceCompilerErrorCode.TRACE_HAS_MULTIPLE_LOCATIONS) {
+			// The parser does the actual conversion
+			SourceParserRule rule = location.getParserRule();
+			TraceConversionResult result = rule.getLocationParser()
+					.convertLocation(location);
+			// After parser has finished, the trace is created.
+			trace = convertWithoutUI(result, extensions);
+
+			if (trace != null) {
+				model.startProcessing();
+				try {
+					createParametersFromConversionResult(location, result,
+							trace);
+					// Runs a location validity check and notifies listeners
+					// that location is now OK
+					location.setConverterErrorCode(TraceCompilerErrorCode.OK,
+							null);
+				} catch (TraceCompilerException e) {
+					// If parameters cannot be created, the trace is removed
+					TraceGroup group = trace.getGroup();
+					trace.getGroup().removeTrace(trace);
+					if (!group.hasTraces()) {
+						group.getModel().removeGroup(group);
+					}
+					throw e;
+				} finally {
+					model.processingComplete();
+				}
+			}
+		}
+		return trace;
+	}
+
+	/**
+	 * Converts a location to trace without UI
+	 * 
+	 * @param result
+	 *            the conversion result from parser
+	 * @param extensions
+	 *            persistent extensions to be added to the new trace
+	 * @return the converted trace
+	 * @throws TraceCompilerException
+	 *             if location properties are not valid
+	 */
+	private Trace convertWithoutUI(TraceConversionResult result,
+			Iterator<TraceModelPersistentExtension> extensions)
+			throws TraceCompilerException {
+		Trace trace = null;
+		if (result.group != null) {
+			String groupName = result.group;
+			TraceGroup group = handleGroup(groupName);
+			trace = handleTrace(result, extensions, group);
+		} else {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.GROUP_NOT_SELECTED);
+		}
+		return trace;
+	}
+
+	/**
+	 * Handle trace
+	 * 
+	 * @param result
+	 *            the conversion result from parser
+	 * @param extensions
+	 *            persistent extensions to be added to the new trace
+	 * @param group
+	 *            the group where trace belongs to
+	 * @return the trace
+	 * @throws TraceCompilerException
+	 */
+	private Trace handleTrace(TraceConversionResult result,
+			Iterator<TraceModelPersistentExtension> extensions, TraceGroup group)
+			throws TraceCompilerException {
+		// First try to find Id to trace from fixed Ids
+		Trace trace = null;
+		Properties fixedIds = model.getFixedIds();
+		String groupName = result.group;
+		String traceName = result.name;
+		int groupId = group.getID();
+		String groupIdString = SourceConstants.HEX_PREFIX
+				+ Integer.toString(groupId, model.HEX_RADIX).toUpperCase();
+		int traceId = 0;
+		if (fixedIds != null) {
+			String tracePropertyName = groupName + model.GROUP_ID_PREFIX
+					+ groupIdString + model.GROUP_ID_SUFFIX
+					+ SourceConstants.UNDERSCORE + traceName;
+			String value = fixedIds.getProperty(model.TRACE_PROPERTY_PREFIX
+					+ tracePropertyName);
+			if (value != null) {
+				try {
+					traceId = Integer.decode(value).intValue();
+				} catch (NumberFormatException e) {
+					// Corrupted, assign a proper Id later on
+					traceId = 0;
+				}
+			}
+		}
+		// If there was no fixed Id to this trace, get Id from model
+		if (traceId == 0) {
+			traceId = model.getNextTraceId(group);
+		}
+
+		String text = result.text;
+		model.getVerifier().checkTraceProperties(group, null, traceId,
+				traceName, text);
+		TraceModelExtension[] extArray = createExtensionArray(result,
+				extensions);
+		trace = model.getFactory().createTrace(group, traceId, traceName, text,
+				extArray);
+
+		if ((trace.getExtension(StateTraceRule.class) == null)
+				&& (group.getName()
+						.equals("TRACE_STATE"))) { //$NON-NLS-1$
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.INVALID_USAGE_OF_TRACE_STATE_GROUP_NAME);
+		} else if ((trace.getExtension(PerformanceEventRuleBase.class) == null)
+				&& (group.getName()
+						.equals("TRACE_PERFORMANCE"))) { //$NON-NLS-1$
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.INVALID_USAGE_OF_TRACE_PERFORMACE_GROUP_NAME);
+		}
+
+		return trace;
+	}
+
+	/**
+	 * Handle group. Try to fnd group from model. If it does not exist then
+	 * create new group.
+	 * 
+	 * @param groupName
+	 *            the name of the group
+	 * @return the handled group
+	 * @throws TraceCompilerException
+	 */
+	private TraceGroup handleGroup(String groupName)
+			throws TraceCompilerException {
+		String deprecatedGroupName = null;
+		
+		// Convert deprecated group name to valid group name if needed
+		if (deprecatedGroupNameMap.containsKey(groupName)) {
+			deprecatedGroupName = groupName;
+			groupName = deprecatedGroupNameMap.get(groupName);
+		}
+
+		// If auto-convert flag is set, the location is converted without
+		// user interaction. A new trace group is created if not found
+		TraceGroup group = model.findGroupByName(groupName);
+		if (group == null) {
+			
+			// Print warning related to deprecated group name change if needed
+			if (deprecatedGroupName != null) {
+				String message = Messages
+						.getString("TraceLocationConverter.DeprecatedGroupIdWarningStart");//$NON-NLS-1$
+				message += SourceConstants.SPACE + deprecatedGroupName
+						+ SourceConstants.SPACE;
+				message += Messages
+						.getString("TraceLocationConverter.DeprecatedGroupIdWarningMiddle");//$NON-NLS-1$
+				message += SourceConstants.SPACE + groupName
+						+ SourceConstants.SPACE;
+				message += Messages
+						.getString("TraceLocationConverter.DeprecatedGroupIdWarningEnd");//$NON-NLS-1$
+				TraceCompilerLogger.printWarning(message);
+			}
+
+			int groupId = 0;
+			Properties fixedIds = model.getFixedIds();
+
+			// First try to find Id to group from fixed Ids
+			if (fixedIds != null) {
+				String value = fixedIds.getProperty(model.GROUP_PROPERTY_PREFIX
+						+ groupName);
+				if (value != null) {
+					try {
+						groupId = Integer.decode(value).intValue();
+					} catch (NumberFormatException e) {
+						// Corrupted, assign a proper Id later on
+						groupId = 0;
+					}
+				}
+			}
+			// If there was no fixed Id to this group, get Id from model
+			if (groupId == 0) {
+				groupId = FormattingUtils.getGroupID(model, groupName);
+			}
+			model.getVerifier().checkTraceGroupProperties(model, null, groupId,
+					groupName);
+			group = model.getFactory().createTraceGroup(groupId, groupName,
+					null);
+		}
+
+		return group;
+	}
+
+	/**
+	 * Combines extensions into one array
+	 * 
+	 * @param result
+	 *            the conversion result
+	 * @param extensions
+	 *            the persistent extensions from old trace
+	 * @return the combined array of extensions
+	 */
+	private TraceModelExtension[] createExtensionArray(
+			TraceConversionResult result,
+			Iterator<TraceModelPersistentExtension> extensions) {
+		TraceModelExtension[] extArray = null;
+		ArrayList<TraceModelExtension> ext = null;
+		if (result.extensions != null) {
+			ext = new ArrayList<TraceModelExtension>();
+			ext.addAll(result.extensions);
+		}
+		if (extensions != null) {
+			if (ext == null) {
+				ext = new ArrayList<TraceModelExtension>();
+			}
+			while (extensions.hasNext()) {
+				ext.add(extensions.next());
+			}
+		}
+		if (ext != null) {
+			extArray = new TraceModelExtension[ext.size()];
+			ext.toArray(extArray);
+		}
+		return extArray;
+	}
+
+	/**
+	 * Creates the trace parameters based on trace conversion result
+	 * 
+	 * @param converted
+	 *            the location that was converted
+	 * @param result
+	 *            the conversion result
+	 * @param trace
+	 *            the trace
+	 * @throws TraceCompilerException
+	 *             if parameters cannot be created
+	 */
+	private void createParametersFromConversionResult(TraceLocation converted,
+			TraceConversionResult result, Trace trace)
+			throws TraceCompilerException {
+		if (result.parameters != null) {
+			for (int i = 0; i < result.parameters.size(); i++) {
+				int id = trace.getNextParameterID();
+				ParameterConversionResult res = result.parameters.get(i);
+				boolean warning = false;
+				if (res.type == null) {
+					warning = true;
+					res.type = TraceParameter.HEX32;
+				}
+				model.getVerifier().checkTraceParameterProperties(trace, null,
+						id, res.name, res.type);
+				TraceModelExtension[] extArray = null;
+				if (res.extensions != null) {
+					extArray = new TraceModelExtension[res.extensions.size()];
+					res.extensions.toArray(extArray);
+				}
+				TraceParameter param = model.getFactory().createTraceParameter(
+						trace, id, res.name, res.type, extArray);
+				if (warning) {
+					String msg = Messages
+							.getString("TraceCompiler.UnknownTypeWarning"); //$NON-NLS-1$
+					TraceCompilerEngineGlobals.getEvents().postWarningMessage(
+							msg, param);
+				}
+			}
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceLocationList.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,146 @@
+/*
+* 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:
+*
+* List of trace locations
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import java.util.ArrayList;
+
+import com.nokia.tracecompiler.model.TraceCompilerException;
+
+/**
+ * List of trace locations.
+ * 
+ */
+public class TraceLocationList extends LocationListBase {
+
+	/**
+	 * Location list listeners
+	 */
+	private ArrayList<TraceLocationListListener> listeners = new ArrayList<TraceLocationListListener>();
+
+	/**
+	 * List title, returned by getTitle
+	 */
+	private String listTitle;
+
+	/**
+	 * Constructor
+	 */
+	TraceLocationList() {
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param listTitle
+	 *            the title of this location list
+	 */
+	TraceLocationList(String listTitle) {
+		this.listTitle = listTitle;
+	}
+
+	/**
+	 * Adds a location to this list.
+	 * 
+	 * @param location
+	 *            the location to be added
+	 * @throws TraceCompilerException 
+	 */
+	void addLocation(TraceLocation location) throws TraceCompilerException {
+		if (TraceCompilerEngineConfiguration.ASSERTIONS_ENABLED) {
+			if (contains(location)) {
+				//this can only happen if there is a programming error
+				TraceCompilerEngineGlobals.getEvents().postCriticalAssertionFailed(
+						"Duplicate trace location", //$NON-NLS-1$
+						location.getConvertedName());
+				throw new TraceCompilerException(null);
+			}
+		}
+		location.setLocationList(this);
+		add(location);
+		fireLocationAdded(location);
+		location.runValidityCheck();
+	}
+
+	/**
+	 * Removes a location from this list.
+	 * 
+	 * @param location
+	 *            the location to be removed
+	 */
+	void removeLocation(TraceLocation location) {
+		if (remove(location)) {
+			fireLocationRemoved(location);
+			location.setLocationList(null);
+		}
+	}
+
+	/**
+	 * Adds a location list listener to this object
+	 * 
+	 * @param listener
+	 *            the listener interface
+	 */
+	public void addLocationListListener(TraceLocationListListener listener) {
+		listeners.add(listener);
+	}
+
+	/**
+	 * Removes the location list listener
+	 * 
+	 * @param listener
+	 *            the listener interface
+	 */
+	public void removeLocationListListener(TraceLocationListListener listener) {
+		listeners.remove(listener);
+	}
+
+	/**
+	 * Creates locationAdded event to location list listeners
+	 * 
+	 * @param location
+	 *            the location that was added
+	 */
+	private void fireLocationAdded(TraceLocation location) {
+		for (TraceLocationListListener l : listeners) {
+			l.locationAdded(location);
+		}
+	}
+
+	/**
+	 * Creates locationRemoved event to location list listeners
+	 * 
+	 * @param location
+	 *            the location that was added
+	 */
+	void fireLocationRemoved(TraceLocation location) {
+		for (TraceLocationListListener l : listeners) {
+			l.locationRemoved(location);
+		}
+	}
+
+	/**
+	 * Gets the list title or null
+	 * 
+	 * @return the list title
+	 */
+	public String getListTitle() {
+		return listTitle;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceLocationListListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,43 @@
+/*
+* 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:
+*
+* Listener for trace location lists
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+/**
+ * Listener for trace location lists
+ * 
+ */
+public interface TraceLocationListListener {
+
+	/**
+	 * Location was added to this list
+	 * 
+	 * @param location
+	 *            the new location
+	 */
+	public void locationAdded(TraceLocation location);
+
+	/**
+	 * Location was removed from this list
+	 * 
+	 * @param location
+	 *            the location that was removed
+	 */
+	public void locationRemoved(TraceLocation location);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceLocationMap.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,174 @@
+/*
+* 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:
+*
+* Maps trace locations into traces and vice versa
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.engine.source.SourceProperties;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+
+/**
+ * Maps trace locations into traces and vice versa.
+ * 
+ */
+final class TraceLocationMap {
+
+	/**
+	 * List of unrelated traces
+	 */
+	private TraceLocationList unrelated = new TraceLocationList();
+
+	/**
+	 * Parser groups
+	 */
+	private HashMap<String, TraceLocationList> parserGroups = new HashMap<String, TraceLocationList>();
+
+	/**
+	 * The trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * Global list of locations, used for verification purposes with
+	 * GLOBAL_LOCATION_ASSERTS configuration flag
+	 */
+	private ArrayList<TraceLocation> globalList;
+
+	/**
+	 * Creates a location mapper
+	 * 
+	 * @param model
+	 *            the trace model
+	 */
+	public TraceLocationMap(TraceModel model) {
+		if (TraceCompilerEngineConfiguration.GLOBAL_LOCATION_ASSERTS) {
+			globalList = new ArrayList<TraceLocation>();
+		}
+		this.model = model;
+		model.addModelListener(new LocationMapModelListener(this));
+		model.addExtension(unrelated);
+	}
+
+	/**
+	 * Adds the locations from the source file to the map
+	 * 
+	 * @param source
+	 *            properties of the source to be added
+	 * @throws TraceCompilerException 
+	 */
+	void addSource(SourceProperties source) throws TraceCompilerException {
+		for (TraceLocation location : source) {
+			if (TraceCompilerEngineConfiguration.GLOBAL_LOCATION_ASSERTS) {
+				if (globalList.contains(location)) {
+					TraceCompilerEngineGlobals.getEvents().postAssertionFailed(
+							"Location already in global list", //$NON-NLS-1$
+							location.getConvertedName());
+				} else {
+					globalList.add(location);
+				}
+			}
+			// Generates locationAdded event via TraceLocationListListener
+			addNewLocationToTrace(location);
+		}
+	}
+
+	/**
+	 * Adds a location to trace or to the unrelated list if a trace cannot be
+	 * found.
+	 * 
+	 * @param location
+	 *            the location to be added
+	 * @throws TraceCompilerException 
+	 */
+	private void addNewLocationToTrace(TraceLocation location) throws TraceCompilerException {
+		TraceLocationList list;
+		Trace trace = model.findTraceByName(location.getOriginalName());
+		if (trace != null) {
+			list = trace.getExtension(TraceLocationList.class);
+			if (list == null) {
+				list = new TraceLocationList();
+				trace.addExtension(list);
+			}
+		} else {
+			String name = location.getParserRule().getLocationParser()
+					.getLocationGroup();
+			if (name == null) {
+				list = unrelated;
+			} else {
+				list = parserGroups.get(name);
+				if (list == null) {
+					list = new TraceLocationList(name);
+					model.addExtension(list);
+					parserGroups.put(name, list);
+				}
+			}
+		}
+		list.addLocation(location);
+	}
+
+	/**
+	 * Moves the locations from trace to unrelated list
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @throws TraceCompilerException 
+	 */
+	void moveToUnrelated(Trace trace) throws TraceCompilerException {
+		TraceLocationList list = trace.getExtension(TraceLocationList.class);
+		if (list != null) {
+			trace.removeExtension(list);
+			for (LocationProperties loc : list) {
+				unrelated.addLocation((TraceLocation) loc);
+			}
+		}
+	}
+
+	/**
+	 * Moves locations from unrelated to the given trace
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @throws TraceCompilerException 
+	 */
+	void moveFromUnrelated(Trace trace) throws TraceCompilerException {
+		String name = trace.getName();
+		TraceLocationList list = null;
+		Iterator<LocationProperties> itr = unrelated.iterator();
+		while (itr.hasNext()) {
+			TraceLocation location = (TraceLocation) itr.next();
+			if (name.equals(location.getOriginalName())) {
+				list = trace.getExtension(TraceLocationList.class);
+				if (list == null) {
+					list = new TraceLocationList();
+					trace.addExtension(list);
+				}
+				// NOTE: This must replicate the behavior of
+				// TraceLocationList.removeLocation
+				itr.remove();
+				unrelated.fireLocationRemoved(location);
+				list.addLocation(location);
+			}
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/ViewAdapter.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* View adapter
+*
+*/
+package com.nokia.tracecompiler.engine;
+
+
+/**
+ * View adapter implements the view interface.
+ * 
+ */
+public class ViewAdapter implements TraceCompilerEngineView {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engi.TraceCompilerEngineView#getConfiguration()
+	 */
+	public TraceCompilerEngineConfiguration getConfiguration() {
+		// This can be null, the configuration delegate checks it
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/event/EventEngine.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,239 @@
+/*
+* Copyright (c) 2010 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:
+*
+* Implements TraceCompilerEvents to forward events to the event router plug-in
+*
+*/
+package com.nokia.tracecompiler.engine.event;
+
+import com.nokia.tracecompiler.TraceCompilerGlobals;
+import com.nokia.tracecompiler.TraceCompilerLogger;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorMessages;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineEvents;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SourceLocationBase;
+
+/**
+ * Implements TraceCompilerEvents to forward events to the event router plug-in
+ * 
+ */
+public final class EventEngine implements TraceCompilerEngineEvents {
+
+	/**
+	 * Info event type
+	 */
+	public final static int INFO = 1; // CodForChk_Dis_Magic
+
+	/**
+	 * Warning event type
+	 */
+	public final static int WARNING = 2; // CodForChk_Dis_Magic
+
+	/**
+	 * Error event type
+	 */
+	public final static int ERROR = 3; // CodForChk_Dis_Magic
+
+	/**
+	 * Critical assertion failure event type
+	 */
+	public final static int ASSERT_CRITICAL = 4; // CodForChk_Dis_Magic
+
+	/**
+	 * Non-critical assertion failure event type
+	 */
+	public final static int ASSERT_NORMAL = 5; // CodForChk_Dis_Magic
+	
+
+	/**
+	 * indicates if an error happened for all files
+	 */
+	private boolean globalProcessingError = false;
+	
+
+
+	/**
+	 * Constructor
+	 * 
+	 * @param model
+	 *            the trace model
+	 */
+	public EventEngine(TraceModel model) {
+	}
+
+	/**
+	 * check if an error happened
+	 * 
+	 * @return the error
+	 */
+	public boolean hasErrorHappened() {
+		return globalProcessingError;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEvents#
+	 *      postError(com.nokia.tracecompiler.engine.TraceCompilerException)
+	 */
+	public void postError(TraceCompilerException exception) {
+		String message = TraceCompilerEngineErrorMessages.getErrorMessage(exception);
+		if (message != null && message.length() > 0) {
+			postErrorMessage(message, exception.getErrorSource(), exception.isEventWantedToPost());
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEvents#postErrorMessage(java.lang.String, java.lang.Object, boolean)
+	 */
+	public void postErrorMessage(String message, Object source, boolean postEvent) {
+		
+		if (postEvent) {
+			postEvent(ERROR, message, source);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEvents#
+	 *      postWarningMessage(java.lang.String, java.lang.Object)
+	 */
+	public void postWarningMessage(String message, Object source) {
+		postEvent(WARNING, message, source);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEvents#
+	 *      postInfoMessage(java.lang.String, java.lang.Object)
+	 */
+	public void postInfoMessage(String message, Object source) {
+		postEvent(INFO, message, source);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEvents#
+	 *      postAssertionFailed(java.lang.String, java.lang.Object)
+	 */
+	public void postAssertionFailed(String message, Object source) {
+		message = "Assertion failed. Reason: " //$NON-NLS-1$
+				+ message;
+		postEvent(ASSERT_NORMAL, message, source);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEvents#
+	 *      postCriticalAssertionFailed(java.lang.String, java.lang.Object)
+	 */
+	public void postCriticalAssertionFailed(String message, Object source) throws TraceCompilerException {
+		message = "Critical assertion failure, the project has been closed. Reason: " //$NON-NLS-1$
+				+ message;
+		// Closes the trace project and shows an error message
+		TraceCompilerEngineGlobals.getTraceCompiler().closeProject();
+		postEvent(ASSERT_CRITICAL, message, source);
+	}
+
+
+	/**
+	 * Print an event to console
+	 * @param type
+	 *            event type
+	 * @param message
+	 *            event message
+	 * @param source
+	 *            event source
+	 */
+	private void postEvent(int type, String message, Object source) {
+		switch (type) {
+		case INFO:
+				if (TraceCompilerGlobals.isVebose()) {
+					printEvent(type, message, source);
+
+					// This means that the component has been processed. Let's
+					// print one space to ensure that parse_mmp.pl will print
+					// out something.
+				} else if (message.contains(
+						"Dictionary File written")) { //$NON-NLS-1$
+					System.out.print(" "); //$NON-NLS-1$
+				} else if (!message
+						.contains("No files were written")) { //$NON-NLS-1$
+					// If we get "no files written" message, let's dismiss it ->
+					// parse_mmp.pl won't print out anything
+					printEvent(type, message, source);
+				}
+			break;
+		case WARNING:
+		case ERROR:
+		case ASSERT_NORMAL:
+		case ASSERT_CRITICAL:
+			printEvent(type, message, source);
+			break;
+		}		
+	}
+
+	/**
+	 * Prints event
+	 * @param type error type
+	 * @param message
+	 *            event message
+	 * @param source
+	 *            event source
+	 */
+	private void printEvent(int type, String message, Object source) {
+		if (message == null) {
+			message = Messages.getString("EventEngine.unknowError"); //$NON-NLS-1$
+		}
+		String fullMessage = ""; //$NON-NLS-1$
+
+		
+		if (source instanceof SourceLocationBase) {
+			SourceLocationBase location = (SourceLocationBase) source;
+			fullMessage = location.getFileName() + Messages.getString("EventEngine.lineNumberPrefix") + location.getLineNumber() + SourceConstants.COLON + SourceConstants.SPACE; //$NON-NLS-1$
+		} else if (source instanceof String) {
+			message = (String) source;
+		}
+		fullMessage = fullMessage + message;
+		
+		switch (type) {
+		case INFO:
+			TraceCompilerLogger.printInfo(fullMessage);
+			break;
+		case WARNING:
+		case ASSERT_NORMAL:
+			TraceCompilerLogger.printWarning(fullMessage);
+			break;
+		case ERROR:
+		case ASSERT_CRITICAL:
+			globalProcessingError = true;
+			TraceCompilerLogger.printError(fullMessage);
+			break;
+		default:
+			break;
+		}
+	}
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/event/Messages.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 2010 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:
+*
+* Localized strings for engine package
+*
+*/
+package com.nokia.tracecompiler.engine.event;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+
+	/**
+	 * Bundle name
+	 */
+	private static final String BUNDLE_NAME = "com.nokia.tracecompiler.engine.event.messages"; //$NON-NLS-1$
+
+	/**
+	 * Bundle
+	 */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Prevents construction
+	 */
+	private Messages() {
+	}
+	
+	/**
+	 * Gets localized string based on key
+	 * 
+	 * @param key
+	 *            the resource key
+	 * @return the localized resource
+	 */
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/event/messages.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,2 @@
+EventEngine.lineNumberPrefix=, line 
+EventEngine.unknowError=Unknown error happened, Please report to trace team.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/event/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+TraceCompiler event router implementation
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckFormattedTraceExists.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* Kernel #endif flag check
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+/**
+ * Trace activation length check template element
+ * 
+ */
+public final class CheckFormattedTraceExists extends TemplateCheckBase {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.header.TemplateCheckBase#check()
+	 */
+	@Override
+	boolean check() {
+		return writer.getCurrentTraceFormatted().length() > 0;
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckIsBufferSizeDynamic.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* Dynamic buffer size check
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+/**
+ * Dynamic buffer size check
+ * 
+ */
+public final class CheckIsBufferSizeDynamic extends TemplateCheckBase {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.header.TemplateCheckBase#check()
+	 */
+	@Override
+	boolean check() {
+		return writer.isBufferSizeDynamic();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckIsKernelModeEndifNeeded.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* Kernel #endif flag check
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+/**
+ * __KERNEL_MODE__ #endif flag check
+ * 
+ */
+public final class CheckIsKernelModeEndifNeeded extends TemplateCheckBase {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.header.TemplateCheckBase#check()
+	 */
+	@Override
+	boolean check() {
+		return writer.isKernelModeEndifNeeded();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckIsKernelModeFlagNeeded.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,47 @@
+/*
+* 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:
+*
+* Kernel #endif flag check
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+import com.nokia.tracecompiler.source.SymbianConstants;
+
+/**
+ * Check if __KERNEL_MODE__ flags needs to be added
+ * 
+ */
+public final class CheckIsKernelModeFlagNeeded extends TemplateCheckBase {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.header.TemplateCheckBase#check()
+	 */
+	@Override
+	boolean check() {
+		boolean retval;
+		if (writer.getCurrentTraceFormatted().contains(
+				SymbianConstants.CONST_TDESC16_REF)) {
+			retval = true;
+			writer.setKernelModeEndifNeeded(true);
+		} else {
+			retval = false;
+			writer.setKernelModeEndifNeeded(false);
+		}
+		return retval;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckIsTraceBufferBuilt.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* Trace buffer flag check
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+/**
+ * Trace buffer flag check
+ * 
+ */
+public final class CheckIsTraceBufferBuilt extends TemplateCheckBase {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.header.TemplateCheckBase#check()
+	 */
+	@Override
+	boolean check() {
+		return writer.isTraceBufferBuilt();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckIsTraceFormatDuplicate.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* Checks if a trace format exists
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+/**
+ * Checks if a trace format exists
+ * 
+ */
+public final class CheckIsTraceFormatDuplicate extends TemplateCheckBase {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.header.TemplateCheckBase#check()
+	 */
+	@Override
+	boolean check() {
+		return writer.isTraceFormatDuplicate();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/CheckParameterNeedsAlignment.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* Checks if parameter needs 32-bit alignment
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+/**
+ * Checks if parameter needs 32-bit alignment
+ * 
+ */
+final class CheckParameterNeedsAlignment extends TemplateCheckBase {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.header.TemplateCheckBase#check()
+	 */
+	@Override
+	boolean check() {
+		return writer.isParameterAlignmentNeeded();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/ComplexHeaderRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Rule which specifies that a trace cannot be represented by the normal trace API macros
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+import com.nokia.tracecompiler.model.TraceObjectRule;
+
+/**
+ * Rule which specifies that a trace cannot be represented by the normal trace
+ * API macros
+ * 
+ */
+public interface ComplexHeaderRule extends TraceObjectRule {
+
+	/**
+	 * Returns true if an ext-function needs to be written for this trace
+	 * 
+	 * @return function flag
+	 */
+	public boolean needsFunction();
+
+	/**
+	 * Gets an extension to be added to the trace ID define
+	 * 
+	 * @return the extension
+	 */
+	public String getTraceIDDefineExtension();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/HeaderConstants.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,42 @@
+/*
+* 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:
+*
+* Constants for header engine package
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+/**
+ * Constants for header engine package
+ * 
+ */
+interface HeaderConstants {
+
+	/**
+	 * Number of parent paths to check when locating include directory
+	 */
+	int INC_SEARCH_DEPTH = 3; // CodForChk_Dis_Magic
+
+	/**
+	 * Trace header extension
+	 */
+	String TRACE_HEADER_EXTENSION = "Traces.h"; //$NON-NLS-1$
+
+	/**
+	 * Main trace header name
+	 */
+	String TRACE_HEADER_NAME = "OstTraceDefinitions.h"; //$NON-NLS-1$
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/HeaderEngine.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,289 @@
+/*
+* Copyright (c) 2008-2010 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 engine manages the trace header file that is included into source code
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.engine.LocationListBase;
+import com.nokia.tracecompiler.engine.LocationProperties;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineBase;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineEvents;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.project.ProjectEngine;
+import com.nokia.tracecompiler.file.FileCompareOutputStream;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceGroup;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.plugin.TraceHeaderContribution;
+import com.nokia.tracecompiler.plugin.TraceHeaderContribution.TraceHeaderContributionType;
+import com.nokia.tracecompiler.project.ProjectUtils;
+import com.nokia.tracecompiler.project.TraceProjectAPI;
+import com.nokia.tracecompiler.source.SourceUtils;
+
+/**
+ * Header engine manages the trace header file that is included into source
+ * code. This implements the plug-in interface to get notifications about
+ * project file opening and closing
+ * 
+ */
+public final class HeaderEngine extends TraceCompilerEngineBase {
+
+	/**
+	 * Trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param model
+	 *            trace model
+	 */
+	public HeaderEngine(TraceModel model) {
+		this.model = model;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectOpened()
+	 */
+	@Override
+	public void projectOpened() {
+		TraceHeader header = model.getExtension(TraceHeader.class);
+		if (header == null) {
+			String fileName = null;
+			try {
+				fileName = ProjectUtils.getLocationForFile(model,
+						ProjectEngine.traceFolderName,
+						HeaderConstants.TRACE_HEADER_NAME, false);
+			} catch (TraceCompilerException e) {
+				// Model should always be open when traceProjectOpened is called
+			}
+			if (fileName != null) {
+				header = new TraceHeader(fileName, false);
+				model.addExtension(header);
+			} else {
+				String msg = Messages
+						.getString("HeaderEngine.FailedToAttachHeader"); //$NON-NLS-1$
+				TraceCompilerEngineGlobals.getEvents().postErrorMessage(msg, null, true);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engin.TraceCompilererEngine#projectClosing()
+	 */
+	@Override
+	public void projectClosed() {
+		model.removeExtensions(TraceHeader.class);
+	}
+
+	/**
+	 * Gets the name for the trace header file based on given source
+	 * 
+	 * @param sourceFile
+	 *            the source file name
+	 * @return the header file name
+	 */
+	public String getHeaderFileName(String sourceFile) {
+		String retval = null;
+		if (model != null) {
+			// The header file name is the source file name with extension
+			// replaced by Traces.h
+			File f = new File(sourceFile);
+			retval = removeFileExtension(f.getName())
+					+ HeaderConstants.TRACE_HEADER_EXTENSION;
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engi.TraceCompilerlerEngine#projectExporting()
+	 */
+	@Override
+	public void exportProject() throws TraceCompilerException {
+		if (model.isValid() && model.hasTraces()) {
+			TraceHeader header = model.getExtension(TraceHeader.class);
+			if (header != null) {
+				// Headers for each source are written first
+				String path = header.getPath();
+				ArrayList<String> fileNames = new ArrayList<String>();
+				collectSourceFilesFromTraces(fileNames);
+				for (String fileName : fileNames) {
+					String target = path + File.separator + fileName;
+					writeHeaderFile(target);
+				}
+				// The main header is written after everything else succeeds
+				writeMainHeaderFile(header);
+			}
+		}
+	}
+
+	/**
+	 * Collects the source file names from traces
+	 * 
+	 * @param fileNames
+	 *            the file names
+	 */
+	private void collectSourceFilesFromTraces(ArrayList<String> fileNames) {
+		for (TraceGroup group : model) {
+			for (Trace trace : group) {
+				Iterator<LocationListBase> itr = trace
+						.getExtensions(LocationListBase.class);
+				while (itr.hasNext()) {
+					LocationListBase base = itr.next();
+					for (LocationProperties loc : base) {
+						String locFileName = loc.getFileName();
+						if (locFileName != null) {
+							addFileToList(fileNames, locFileName);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Adds a file to list if it does not exist
+	 * 
+	 * @param fileNames
+	 *            the list
+	 * @param locFileName
+	 *            the file
+	 */
+	private void addFileToList(ArrayList<String> fileNames, String locFileName) {
+		locFileName = removeFileExtension(locFileName);
+		if (!fileNames.contains(locFileName)) {
+			fileNames.add(locFileName);
+		}
+	}
+
+	/**
+	 * Removes the file extension from file name
+	 * 
+	 * @param fileName
+	 *            the file name
+	 * @return name without extension
+	 */
+	private String removeFileExtension(String fileName) {
+		int index = fileName.lastIndexOf('.');
+		int sep1 = fileName.lastIndexOf('/');
+		int sep2 = fileName.lastIndexOf('\\');
+		if (index > sep1 && index > sep2) {
+			fileName = fileName.substring(0, index);
+		}
+		return fileName;
+	}
+
+	/**
+	 * Writes the header to given target
+	 * 
+	 * @param target
+	 *            the target file
+	 * @throws TraceCompilerException
+	 *             if writing fails
+	 */
+	private void writeHeaderFile(String target) throws TraceCompilerException {
+		// The TraceHeader stored into the model is not used when writing
+		// headers, since a separate header is written for each source file
+		TraceHeader header = new TraceHeader(target, true);
+		try {
+			header.setOwner(model);
+			TraceHeaderWriter writer = new TraceHeaderWriter(header);
+			TraceCompilerEngineEvents events = TraceCompilerEngineGlobals.getEvents();
+			if (writer.write()) {
+				header.postFileWrittenEvent(header.getAbsolutePath());
+			} else {
+				String msg = Messages
+						.getString("HeaderEngine.TraceHeaderNotChangedPrefix"); //$NON-NLS-1$
+				events.postInfoMessage(msg + header.getAbsolutePath(), null);
+			}
+		} finally {
+			// The header owner must be reset to null, since that makes
+			// unregisters it from the model
+			header.setOwner(null);
+		}
+	}
+
+	/**
+	 * Writes the main header file to given target
+	 * 
+	 * @param header
+	 *            the header
+	 * @throws TraceCompilerException
+	 *             if writing fails
+	 */
+	private void writeMainHeaderFile(TraceHeader header)
+			throws TraceCompilerException {
+		// The TraceHeader stored into the model is not used when writing
+		// headers, since a separate header is written for each source file
+		TraceCompilerEngineEvents events = TraceCompilerEngineGlobals.getEvents();
+		String path = header.getAbsolutePath();
+		try {
+			if (writeMainHeader(path)) {
+				header.postFileWrittenEvent(path);
+			} else {
+				String msg = Messages
+						.getString("HeaderEngine.TraceHeaderNotChangedPrefix"); //$NON-NLS-1$
+				events.postInfoMessage(msg + path, null);
+			}
+		} catch (IOException e) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.CANNOT_WRITE_PROJECT_FILE, e);
+		}
+	}
+
+	/**
+	 * Writes the main header to given target
+	 * 
+	 * @param target
+	 *            the target
+	 * @return true if written, false if the file already had the same content
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private boolean writeMainHeader(String target) throws IOException {
+		File f = new File(target);
+		FileCompareOutputStream stream = new FileCompareOutputStream(f);
+		String licence = TraceCompilerEngineGlobals.getDefaultLicence(true);
+		if (licence != null) {
+			stream.write(licence.getBytes());
+		}
+		stream.write(SourceUtils.createHeaderGuard(f.getName()).getBytes());
+		TraceProjectAPI api = model.getExtension(TraceProjectAPI.class);
+		if (api instanceof TraceHeaderContribution) {
+			String[] content = ((TraceHeaderContribution) api)
+					.getContribution(TraceHeaderContributionType.MAIN_HEADER_CONTENT);
+			if (content != null && content.length == 1) {
+				stream.write(content[0].getBytes());
+			}
+		}
+		return stream.writeFile();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/HeaderTemplate.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,443 @@
+/*
+* Copyright (c) 2010 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 file template definition
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+import com.nokia.tracecompiler.engine.header.TraceHeaderWriter.HeaderTemplateElementType;
+import com.nokia.tracecompiler.plugin.TraceAPIFormatter.TraceFormatType;
+import com.nokia.tracecompiler.plugin.TraceHeaderContribution.TraceHeaderContributionType;
+import com.nokia.tracecompiler.source.SymbianConstants;
+
+/**
+ * Header file template definition
+ * 
+ */
+interface HeaderTemplate {
+	
+	/**
+	 * Tag written to trace header
+	 */
+	String HEADER_COMMENT_CREATED_BY = "// Created by TraceCompiler"; //$NON-NLS-1$
+	
+	/**
+	 * Empty template
+	 */
+	Object[] EMPTY_TEMPLATE = {};
+
+	/**
+	 * Sets line count to 1
+	 */
+	Object SET_LINES_PACKED = new SetNewLineCount(1);
+
+	/**
+	 * Sets line count to 2
+	 */
+	Object SET_LINES_MIDDLE = new SetNewLineCount(2); // CodForChk_Dis_Magic
+
+	/**
+	 * Sets line count to 3
+	 */
+	Object SET_LINES_LOOSE = new SetNewLineCount(3); // CodForChk_Dis_Magic
+
+	/**
+	 * Template for empty trace macros
+	 */
+	Object[] EMPTY_TRACE_FUNCTION_EXISTS_TEMPLATE = {
+			HeaderTemplateElementType.NEW_LINE, "#define ", //$NON-NLS-1$
+			HeaderTemplateElementType.FORMATTED_TRACE };
+
+	/**
+	 * Empty trace macro template switch. This formats the trace using
+	 * TraceFormatType.EmptyPreprocessorDefinition and checks if the definition
+	 * has already been written using CheckIsTraceFormatDuplicate switch
+	 */
+	Object[] EMPTY_TRACE_FUNCTION_TEMPLATE = {
+			TraceFormatType.EMPTY_MACRO,
+			new TemplateChoice(CheckIsTraceFormatDuplicate.class,
+					EMPTY_TEMPLATE, EMPTY_TRACE_FUNCTION_EXISTS_TEMPLATE), };
+
+	/**
+	 * Template for trace activation check
+	 */
+	Object[] TRACE_FUNCTION_ACTIVATION_CHECK = {
+			"TBool retval = ", //$NON-NLS-1$
+			TraceFormatType.TRACE_ACTIVATION,
+			// Checks if the TraceActivation format exists
+			new TemplateChoice(CheckFormattedTraceExists.class, new Object[] {
+					HeaderTemplateElementType.FORMATTED_TRACE, ";", //$NON-NLS-1$
+					HeaderTemplateElementType.NEW_LINE, "if ( retval )", //$NON-NLS-1$
+					HeaderTemplateElementType.OPEN_BRACE }, new Object[] {
+					"EFalse;", HeaderTemplateElementType.NEW_LINE }), //$NON-NLS-1$
+	};
+
+	/**
+	 * Template if no activation check is needed
+	 */
+	Object[] TRACE_FUNCTION_NO_ACTIVATION_CHECK = { "TBool retval;", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE };
+
+	/**
+	 * Template for trace functions
+	 */
+	Object[] TRACE_FUNCTION_EXISTS_TEMPLATE = {
+			SET_LINES_PACKED,
+			HeaderTemplateElementType.BUILD_TRACE_BUFFER_CHECK,
+			// If the trace contains TDesC16 parameter, __KERNEL_MODE__ flag is
+			// added to it
+			new TemplateChoice(CheckIsKernelModeFlagNeeded.class, new Object[] {
+					"#ifndef __KERNEL_MODE__", //$NON-NLS-1$
+					HeaderTemplateElementType.NEW_LINE }, EMPTY_TEMPLATE),
+			"inline TBool ", //$NON-NLS-1$
+			HeaderTemplateElementType.FORMATTED_TRACE,
+			HeaderTemplateElementType.OPEN_BRACE,
+			// If the trace is buffered activation check is written
+			new TemplateChoice(CheckIsTraceBufferBuilt.class,
+					TRACE_FUNCTION_ACTIVATION_CHECK,
+					TRACE_FUNCTION_NO_ACTIVATION_CHECK),
+			HeaderTemplateElementType.TRACE_FUNCTION_BODY, // Parameters + API
+			HeaderTemplateElementType.CLOSE_EXTRA_BRACES,
+			"return retval;", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			HeaderTemplateElementType.CLOSE_BRACE,
+			// The __KERNEL_MODE__ #ifdef added above needs to be closed
+			new TemplateChoice(
+					CheckIsKernelModeEndifNeeded.class,
+					new Object[] { "#endif", HeaderTemplateElementType.NEW_LINE }, //$NON-NLS-1$
+					EMPTY_TEMPLATE), SET_LINES_LOOSE,
+			HeaderTemplateElementType.NEW_LINE };
+
+	/**
+	 * Trace function template switch. This formats the trace using
+	 * TraceFormatType.Header and checks if the definition has already been
+	 * written using TRACE_FORMAT_EXISTS_TEMPLATE_INDEX switch
+	 */
+	Object[] TRACE_FUNCTION_TEMPLATE = {
+			TraceFormatType.HEADER,
+			new TemplateChoice(CheckIsTraceFormatDuplicate.class,
+					EMPTY_TEMPLATE, TRACE_FUNCTION_EXISTS_TEMPLATE) };
+
+	/**
+	 * Template for trace ID's
+	 */
+	Object[] TRACE_ID_TEMPLATE = {
+			"#define ", //$NON-NLS-1$
+			HeaderTemplateElementType.TRACE_NAME,
+			" 0x", //$NON-NLS-1$
+			HeaderTemplateElementType.TRACE_ID_HEX,
+			HeaderTemplateElementType.NEW_LINE };
+
+	/**
+	 * Main header template
+	 */
+	Object[] HEADER_TEMPLATE = {
+			SET_LINES_PACKED,
+			HeaderTemplateElementType.LICENCE_TEXT,
+			HeaderTemplateElementType.NEW_LINE,
+			HEADER_COMMENT_CREATED_BY, " ", //$NON-NLS-1$
+			HeaderTemplateElementType.TRACE_COMPILER_VERSION,
+			HeaderTemplateElementType.NEW_LINE,
+			"// DO NOT EDIT, CHANGES WILL BE LOST", //$NON-NLS-1$
+			SET_LINES_MIDDLE,
+			HeaderTemplateElementType.NEW_LINE,
+			HeaderTemplateElementType.HEADER_GUARD,
+			HeaderTemplateElementType.NEW_LINE,
+			SET_LINES_PACKED,
+			TraceHeaderContributionType.GLOBAL_DEFINES,
+			SET_LINES_MIDDLE,
+			HeaderTemplateElementType.NEW_LINE,
+			SET_LINES_PACKED,
+			TraceHeaderContributionType.GLOBAL_INCLUDES,
+			SET_LINES_MIDDLE,
+			HeaderTemplateElementType.NEW_LINE,
+			SET_LINES_PACKED,
+			new TemplateIterator(IteratorTraces.class, TRACE_ID_TEMPLATE),
+			SET_LINES_LOOSE,
+			HeaderTemplateElementType.NEW_LINE,
+			// Trace functions
+			new TemplateIterator(IteratorComplexTraces.class,
+					TRACE_FUNCTION_TEMPLATE),
+			// End of header guard
+			SET_LINES_MIDDLE, "#endif", HeaderTemplateElementType.NEW_LINE, //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE, "// End of file", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE };
+
+	/**
+	 * Template for parameter with fixed size
+	 */
+	Object[] FIXED_PARAMETER_TEMPLATE = { "*( ( ", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_TYPE, "* )ptr ) = ", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_NAME, ";", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE, "ptr += sizeof ( ", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_TYPE, " );", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE };
+
+	/**
+	 * Template for parameter with fixed size and length check
+	 */
+	Object[] FIXED_PARAMETER_TEMPLATE_WITH_LENGTH_CHECK = {
+			"// Check that there are enough space to next parameter", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			"if ((length + sizeof ( ", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_TYPE,
+			" )) <= KOstMaxDataLength)", //$NON-NLS-1$
+			HeaderTemplateElementType.OPEN_BRACE,
+			FIXED_PARAMETER_TEMPLATE,
+			"length += sizeof ( ", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_TYPE,
+			" );", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			HeaderTemplateElementType.CLOSE_BRACE};	
+	
+	/**
+	 * Template for writing 32-bit alignment for parameters
+	 */
+	Object[] DYNAMIC_PARAMETER_ALIGNMENT_TEMPLATE = {
+			"// Fillers are written to get 32-bit alignment", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			"while ( length", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_INDEX,
+			"++ < lengthAligned", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_INDEX,
+			" )", //$NON-NLS-1$
+			HeaderTemplateElementType.OPEN_BRACE,
+			"*ptr++ = 0;", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			HeaderTemplateElementType.CLOSE_BRACE };
+
+	/**
+	 * Template for parameter with dynamic size
+	 */
+	Object[] DYNAMIC_PARAMETER_TEMPLATE = {
+			"if (length", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_INDEX,
+			" > 0)", //$NON-NLS-1$
+			HeaderTemplateElementType.OPEN_BRACE,
+			"// Number of elements is written before data", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			"// In case of Unicode string, number of elements is half of length", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			"*( ( TUint32* )ptr ) = length", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_INDEX,
+			" / (", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_NAME,
+			".Size() / ", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_NAME,
+			".Length());", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			"ptr += sizeof ( TUint32 );", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			"memcpy( ptr, ", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_NAME,
+			".Ptr(), length", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_INDEX,
+			" );", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			"ptr += length", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_INDEX,
+			";", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			new TemplateChoice(CheckParameterNeedsAlignment.class,
+					DYNAMIC_PARAMETER_ALIGNMENT_TEMPLATE, EMPTY_TEMPLATE),
+			HeaderTemplateElementType.NEW_LINE,
+			"length += sizeof ( TUint32 ) + lengthAligned", //$NON-NLS-1$
+			HeaderTemplateElementType.PARAMETER_INDEX,
+			";", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,			
+			HeaderTemplateElementType.CLOSE_BRACE,
+			"else if (length + sizeof ( TUint32 ) <= KOstMaxDataLength)",  //$NON-NLS-1$
+			HeaderTemplateElementType.OPEN_BRACE,
+			HeaderTemplateElementType.NEW_LINE,
+			"*( ( TUint32* )ptr ) = 0;",  //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			"ptr += sizeof ( TUint32 );",  //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			"length += sizeof ( TUint32 );",  //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			HeaderTemplateElementType.CLOSE_BRACE};
+
+	/**
+	 * Template to allocate the buffer for parameters if buffer size is fixed
+	 */
+	Object[] FIXED_BUFFER_ALLOCATION_TEMPLATE = { "TUint8 data[ ", //$NON-NLS-1$
+			HeaderTemplateElementType.FIXED_BUFFER_SIZE, " ];", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE, "TUint8* ptr = data;", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE};
+
+	/**
+	 * Template to allocate the buffer for parameters if buffer size is dynamic
+	 */
+	Object[] DYNAMIC_BUFFER_ALLOCATION_TEMPLATE = {
+			// KOstMaxDataLength is defined in opensystemtrace.h
+			"TUint8 data[ KOstMaxDataLength ];", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE, "TUint8* ptr = data;", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE, "// Set length to zero and calculate it againg", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE, "// when adding parameters", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE, "length = 0;", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE };
+
+	/**
+	 * Template to allocate buffer for trace data
+	 */
+	Object[] BUFFER_ALLOCATION_TEMPLATE = { new TemplateChoice(
+			CheckIsBufferSizeDynamic.class, DYNAMIC_BUFFER_ALLOCATION_TEMPLATE,
+			FIXED_BUFFER_ALLOCATION_TEMPLATE) };
+
+	/**
+	 * Template to length variable definition
+	 */
+	Object[] LENGTH_VARIABLE_DEFINITION_TEMPLATE = {	
+			"TInt length = 0;", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE };
+
+	/**
+	 * Beging template to length variable increase
+	 */
+	Object[] LENGTH_VARIABLE_INCREASE_TEMPLATE_BEGIN = {
+			"// Increase length because of fixed size parameters", //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE,
+			"length += "};	 //$NON-NLS-1$
+
+	/**
+	 * End template to length variable increase
+	 */
+	Object[] LENGTH_VARIABLE_INCREASE_TEMPLATE_END = {	
+			";",	 //$NON-NLS-1$	
+			HeaderTemplateElementType.NEW_LINE };
+	
+	/**
+	 * Template to calculate the length for a dynamic parameter
+	 */
+	Object[] DYNAMIC_PARAMETER_LENGTH_TEMPLATE = {
+	"// Check that parameter lenght is not too long", //$NON-NLS-1$
+	HeaderTemplateElementType.NEW_LINE,
+	"TInt length", //$NON-NLS-1$
+	HeaderTemplateElementType.PARAMETER_INDEX,
+	" = ", //$NON-NLS-1$
+	SymbianConstants.PARAMETER_DECLARATION_PREFIX,
+	HeaderTemplateElementType.PARAMETER_INDEX, ".Size();", //$NON-NLS-1$
+	HeaderTemplateElementType.NEW_LINE,
+		"if ((length + length", //$NON-NLS-1$
+	HeaderTemplateElementType.PARAMETER_INDEX,
+	" + sizeof ( TUint32 )) > KOstMaxDataLength)", //$NON-NLS-1$
+	HeaderTemplateElementType.OPEN_BRACE,
+	"length", //$NON-NLS-1$
+	HeaderTemplateElementType.PARAMETER_INDEX,	
+	" = KOstMaxDataLength - (length + sizeof ( TUint32 ));", //$NON-NLS-1$	
+	HeaderTemplateElementType.NEW_LINE,
+	HeaderTemplateElementType.CLOSE_BRACE,
+	HeaderTemplateElementType.NEW_LINE,
+	"TInt lengthAligned", //$NON-NLS-1$
+	HeaderTemplateElementType.PARAMETER_INDEX,
+	" = ( length", //$NON-NLS-1$
+	HeaderTemplateElementType.PARAMETER_INDEX,
+	" + 3 ) & ~3;", //$NON-NLS-1$
+	HeaderTemplateElementType.NEW_LINE,	
+	"if (lengthAligned", //$NON-NLS-1$
+	HeaderTemplateElementType.PARAMETER_INDEX,
+	" > 0)", //$NON-NLS-1$
+	HeaderTemplateElementType.OPEN_BRACE,
+	"length = length + sizeof ( TUint32 ) + lengthAligned", //$NON-NLS-1$
+	HeaderTemplateElementType.PARAMETER_INDEX,
+	";", //$NON-NLS-1$
+	HeaderTemplateElementType.NEW_LINE,
+	HeaderTemplateElementType.CLOSE_BRACE,
+	HeaderTemplateElementType.NEW_LINE };
+
+	/**
+	 * Template for the optimized single dynamic parameter case, where buffer is
+	 * not needed
+	 */
+	Object[] SINGLE_DYNAMIC_PARAMETER_TEMPLATE = {
+			"TInt size = ", //$NON-NLS-1$
+		    SymbianConstants.PARAMETER_DECLARATION_PREFIX, "1.Size();", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    "// BTrace assumes that parameter size is atleast 4 bytes", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    "if (size % 4 == 0)", //$NON-NLS-1$
+		    HeaderTemplateElementType.OPEN_BRACE,
+		    "TUint8* ptr = ( TUint8* )aParam1.Ptr();", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    "// Data is written directly and length is determined from trace message length", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    "retval = OstSendNBytes( EXTRACT_GROUP_ID(aTraceID), EOstTrace, KOstTraceComponentID, aTraceID, ptr, size );", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    HeaderTemplateElementType.CLOSE_BRACE,
+		    HeaderTemplateElementType.NEW_LINE,
+		    "else", //$NON-NLS-1$
+		    HeaderTemplateElementType.OPEN_BRACE,
+		    "TUint8 data[ KOstMaxDataLength ];", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    "TUint8* ptr = data;", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    "if (size > KOstMaxDataLength)", //$NON-NLS-1$
+		    HeaderTemplateElementType.OPEN_BRACE,
+		    "size = KOstMaxDataLength;", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    HeaderTemplateElementType.CLOSE_BRACE,
+		    HeaderTemplateElementType.NEW_LINE,
+		    "TInt sizeAligned = ( size + 3 ) & ~3;", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,		    
+		    "memcpy( ptr, ", //$NON-NLS-1$
+		    SymbianConstants.PARAMETER_DECLARATION_PREFIX, "1.Ptr(), size );", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    "ptr += size;", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    "// Fillers are written to get 32-bit alignment", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    "while ( size++ < sizeAligned )", //$NON-NLS-1$
+		    HeaderTemplateElementType.OPEN_BRACE,
+		    "*ptr++ = 0;", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    HeaderTemplateElementType.CLOSE_BRACE,
+			HeaderTemplateElementType.NEW_LINE,
+		    "ptr -= sizeAligned;", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    "size = sizeAligned;", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    "// Data is written directly and length is determined from trace message length", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    "retval = OstSendNBytes( EXTRACT_GROUP_ID(aTraceID), EOstTrace, KOstTraceComponentID, aTraceID, ptr, size );", //$NON-NLS-1$
+		    HeaderTemplateElementType.NEW_LINE,
+		    HeaderTemplateElementType.CLOSE_BRACE,
+			HeaderTemplateElementType.NEW_LINE};
+
+	/**
+	 * Template for buffered parameters
+	 */
+	Object[] BUFFERED_PARAMETERS_TEMPLATE = { HeaderTemplateElementType.TRACE_FUNCTION_PARAMETERS };
+
+	/**
+	 * Template when the trace buffer needs to be allocated
+	 */
+	Object[] BUILD_TRACE_BUFFER_TEMPLATE = {
+			new TemplateIterator(IteratorParameters.class,
+					BUFFERED_PARAMETERS_TEMPLATE),
+			"ptr -= ", //$NON-NLS-1$
+			new TemplateChoice(CheckIsBufferSizeDynamic.class,
+					new Object[] { "length;" }, new Object[] { //$NON-NLS-1$
+					HeaderTemplateElementType.FIXED_BUFFER_SIZE, ";" }), //$NON-NLS-1$
+			HeaderTemplateElementType.NEW_LINE };
+
+	/**
+	 * Template for trace parameters.
+	 */
+	Object[] PARAMETERS_TEMPLATE = { new TemplateChoice(
+			CheckIsTraceBufferBuilt.class, BUILD_TRACE_BUFFER_TEMPLATE,
+			SINGLE_DYNAMIC_PARAMETER_TEMPLATE) };
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/IteratorComplexTraces.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,55 @@
+/*
+* 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:
+*
+* Iterator for complex traces
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+import java.io.IOException;
+
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceGroup;
+import com.nokia.tracecompiler.model.TraceModel;
+
+/**
+ * Iterator for complex traces
+ * 
+ */
+public final class IteratorComplexTraces extends TemplateIteratorEntry {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.header.TemplateIteratorEntry#
+	 *      iterate(java.lang.Object[])
+	 */
+	@Override
+	void iterate(Object[] template) throws IOException {
+		TraceModel model = writer.getHeader().getOwner().getModel();
+		for (TraceGroup group : model) {
+			for (Trace trace : group) {
+				ComplexHeaderRule rule = trace
+						.getExtension(ComplexHeaderRule.class);
+				if (rule != null && rule.needsFunction()) {
+					if (writer.startTrace(trace)) {
+						writer.writeTemplate(template);
+					}
+				}
+			}
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/IteratorParameters.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Parameter iterator
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.model.TraceParameter;
+
+/**
+ * Parameter iterator
+ * 
+ */
+public final class IteratorParameters extends TemplateIteratorEntry {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.header.TemplateIteratorEntry#iterate()
+	 */
+	@Override
+	public void iterate(Object[] template) throws IOException {
+		Iterator<TraceParameter> itr = writer.getCurrentTrace().getParameters();
+		while (itr.hasNext()) {
+			writer.startParameter(itr.next());
+			writer.writeTemplate(template);
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/IteratorTraces.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Iterator for all traces
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+import java.io.IOException;
+
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceGroup;
+import com.nokia.tracecompiler.model.TraceModel;
+
+/**
+ * Iterator for all traces
+ * 
+ */
+public final class IteratorTraces extends TemplateIteratorEntry {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.header.TemplateIteratorEntry#
+	 *      iterate(java.lang.Object[])
+	 */
+	@Override
+	void iterate(Object[] template) throws IOException {
+		TraceModel model = writer.getHeader().getOwner().getModel();
+		for (TraceGroup group : model) {
+			for (Trace trace : group) {
+				if (writer.startTrace(trace)) {
+					writer.writeTemplate(template);
+				}
+			}
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/Messages.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* 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:
+*
+* Localization for header package
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Localization for header package
+ * 
+ */
+class Messages {
+
+	/**
+	 * Bundle name
+	 */
+	private static final String BUNDLE_NAME = "com.nokia.tracecompiler.engine.header.messages"; //$NON-NLS-1$
+
+	/**
+	 * Bundle
+	 */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Prevents construction
+	 */
+	private Messages() {
+	}
+
+	/**
+	 * Gets localized string based on key
+	 * 
+	 * @param key
+	 *            the resource key
+	 * @return the localized resource
+	 */
+	public static String getString(String key) {
+		String value;
+		try {
+			value = RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			value = '!' + key + '!';
+		}
+		return value;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/SetNewLineCount.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Changes the new line count
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+/**
+ * Changes the new line count
+ * 
+ */
+public final class SetNewLineCount {
+
+	/**
+	 * Line feed count
+	 */
+	private int count;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param count
+	 *            the line feed count
+	 */
+	SetNewLineCount(int count) {
+		this.count = count;
+	}
+
+	/**
+	 * Gets the count
+	 * 
+	 * @return the count
+	 */
+	final int getLineCount() {
+		return count;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/TemplateCheckBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Template iterator
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+/**
+ * Check function for TemplateChoice
+ * 
+ */
+abstract class TemplateCheckBase {
+
+	/**
+	 * Header writer
+	 */
+	protected TraceHeaderWriter writer;
+
+	/**
+	 * Sets the writer
+	 * 
+	 * @param writer
+	 *            the writer to set
+	 */
+	final void setWriter(TraceHeaderWriter writer) {
+		this.writer = writer;
+	}
+
+	/**
+	 * Runs the check
+	 * 
+	 * @return the result
+	 */
+	abstract boolean check();
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/TemplateChoice.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,86 @@
+/*
+* 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:
+*
+* Template iterator
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+/**
+ * If-check in template
+ * 
+ */
+class TemplateChoice {
+
+	/**
+	 * Templates to be used if check is true
+	 */
+	private Object[] templateTrue;
+
+	/**
+	 * Templates to be used if check is false
+	 */
+	private Object[] templateFalse;
+
+	/**
+	 * Choice class
+	 */
+	private Class<? extends TemplateCheckBase> choiceClass;
+
+	/**
+	 * Constructors
+	 * 
+	 * @param choiceClass
+	 *            the class which does the check
+	 * @param templateTrue
+	 *            the template to be used if check is true
+	 * @param templateFalse
+	 *            the template to be used if check is false
+	 */
+	TemplateChoice(Class<? extends TemplateCheckBase> choiceClass,
+			Object[] templateTrue, Object[] templateFalse) {
+		this.choiceClass = choiceClass;
+		this.templateTrue = templateTrue;
+		this.templateFalse = templateFalse;
+	}
+
+	/**
+	 * Gets the choice class
+	 * 
+	 * @return the class
+	 */
+	Class<? extends TemplateCheckBase> getChoiceClass() {
+		return choiceClass;
+	}
+
+	/**
+	 * Gets the template if choice returns true
+	 * 
+	 * @return the template
+	 */
+	Object[] getTrueTemplate() {
+		return templateTrue;
+	}
+
+	/**
+	 * Gets the template if choice returns false
+	 * 
+	 * @return the template
+	 */
+	Object[] getFalseTemplate() {
+		return templateFalse;
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/TemplateIterator.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,69 @@
+/*
+* 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:
+*
+* Template iterator
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+/**
+ * Template iterator
+ * 
+ */
+final class TemplateIterator {
+
+	/**
+	 * Iterator class
+	 */
+	private Class<? extends TemplateIteratorEntry> iteratorClass;
+
+	/**
+	 * Template to be run by the iterator
+	 */
+	private Object[] template;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param iteratorClass
+	 *            the iterator class
+	 * @param template
+	 *            the template
+	 */
+	TemplateIterator(Class<? extends TemplateIteratorEntry> iteratorClass,
+			Object[] template) {
+		this.iteratorClass = iteratorClass;
+		this.template = template;
+	}
+
+	/**
+	 * Gets the iterator class
+	 * 
+	 * @return the class
+	 */
+	final Class<? extends TemplateIteratorEntry> getIteratorClass() {
+		return iteratorClass;
+	}
+
+	/**
+	 * Gets the template
+	 * 
+	 * @return the template
+	 */
+	final Object[] getTemplate() {
+		return template;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/TemplateIteratorEntry.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,54 @@
+/*
+* 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:
+*
+* Iterator base class
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+import java.io.IOException;
+
+/**
+ * Iterator base class
+ * 
+ */
+abstract class TemplateIteratorEntry {
+
+	/**
+	 * Header writer
+	 */
+	protected TraceHeaderWriter writer;
+
+	/**
+	 * Sets the writer
+	 * 
+	 * @param writer
+	 *            the writer to set
+	 */
+	final void setWriter(TraceHeaderWriter writer) {
+		this.writer = writer;
+	}
+
+	/**
+	 * Runs the iterator on given template
+	 * 
+	 * @param template
+	 *            the template
+	 * @throws IOException
+	 *             if operation fails
+	 */
+	abstract void iterate(Object[] template) throws IOException;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/TraceHeader.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,73 @@
+/*
+* 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:
+*
+* Representation of a header file that gets included into sources
+*
+*/
+package com.nokia.tracecompiler.engine.header;
+
+import com.nokia.tracecompiler.project.TraceProjectFile;
+
+/**
+ * Representation of a header file that gets included into sources when traces
+ * are added.
+ * 
+ */
+final class TraceHeader extends TraceProjectFile {
+
+	/**
+	 * Title shown in UI
+	 */
+	private static final String TITLE = Messages.getString("TraceHeader.Title"); //$NON-NLS-1$
+
+	/**
+	 * Constructor
+	 * 
+	 * @param target
+	 *            target path
+	 * @param hasModelName
+	 *            true if model name should be used with the file
+	 */
+	TraceHeader(String target, boolean hasModelName) {
+		super(target, hasModelName);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectFile#getFileExtension()
+	 */
+	@Override
+	protected String getFileExtension() {
+		String retval;
+		if (hasModelName) {
+			retval = HeaderConstants.TRACE_HEADER_EXTENSION;
+		} else {
+			retval = ""; //$NON-NLS-1$
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectFile#getTitle()
+	 */
+	@Override
+	public String getTitle() {
+		return TITLE;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/TraceHeaderWriter.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,1401 @@
+/*
+ * Copyright (c) 2009-2010 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:
+ *
+ * Writes the TraceHeader to a file
+ *
+ */
+package com.nokia.tracecompiler.engine.header;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.nokia.tracecompiler.TraceCompilerLogger;
+import com.nokia.tracecompiler.engine.LocationListBase;
+import com.nokia.tracecompiler.engine.LocationProperties;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceLocation;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.source.SourceFormatter;
+import com.nokia.tracecompiler.engine.source.TraceFormattingRule;
+import com.nokia.tracecompiler.engine.source.TraceParameterFormattingRule;
+import com.nokia.tracecompiler.file.FileCompareOutputStream;
+import com.nokia.tracecompiler.file.FileUtils;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceGroup;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.plugin.TraceFormatConstants;
+import com.nokia.tracecompiler.plugin.TraceHeaderContribution;
+import com.nokia.tracecompiler.plugin.TraceAPIFormatter.TraceFormatType;
+import com.nokia.tracecompiler.plugin.TraceHeaderContribution.TraceHeaderContributionType;
+import com.nokia.tracecompiler.rules.FillerParameterRule;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SourceExcludedArea;
+import com.nokia.tracecompiler.source.SourceParser;
+import com.nokia.tracecompiler.source.SourceUtils;
+import com.nokia.tracecompiler.source.SymbianConstants;
+import com.nokia.tracecompiler.utils.TraceCompilerVersion;
+
+/**
+ * Writes the TraceHeader to a file
+ * 
+ */
+final class TraceHeaderWriter {
+
+	/**
+	 * return type text of a generated OstTraceGenx function.
+	 */
+	private static final String INLINE_TBOOL = "inline TBool";
+
+	/**
+	 * open bracket in a type cast
+	 */
+	private static final String BEGINCAST = "OBR"; //$NON-NLS-1$
+	
+	/**
+	 * closing bracket in a type cast
+	 */
+	private static final String ENDCAST = "CBR"; //$NON-NLS-1$
+
+	/**
+	 * REF replaces & in a function guard
+	 */
+	private static final String REF = "REF"; //$NON-NLS-1$
+
+	/**
+	 * & character
+	 */
+	private static final String AMPERSANT = "&"; //$NON-NLS-1$
+
+	/**
+	 * closing bracket
+	 */
+	private static final String CLOSING_BRACKET = ")"; //$NON-NLS-1$
+
+	/**
+	 * open bracket
+	 */
+	private static final String OPEN_BRACKET = "("; //$NON-NLS-1$
+
+	/**
+	 * TUint32 definition
+	 */
+	private static final String TUINT32_DEF = "TUint32 "; //$NON-NLS-1$
+
+	/**
+	 * TInt32 definition
+	 */
+	private static final String TINT32_DEF = "TInt32 "; //$NON-NLS-1$
+
+	/**
+	 * TUint definition
+	 */
+	private static final String TUINT_DEF = "TUint "; //$NON-NLS-1$
+
+	/**
+	 * TInt definition
+	 */
+	private static final String TINT_DEF = "TInt "; //$NON-NLS-1$
+
+	/**
+	 * Length variable defined flag
+	 */
+	private boolean lenghtVariableDefined = false;
+	
+	
+	/**
+	 * List of dynamic elements that can be used from the templates
+	 * 
+	 */
+	enum HeaderTemplateElementType {
+
+		/**
+		 * Licence text
+		 */
+		LICENCE_TEXT,
+		
+		/**
+		 * TraceCompiler version number
+		 */
+		TRACE_COMPILER_VERSION,
+
+		/**
+		 * Header guard based on file name
+		 */
+		HEADER_GUARD,
+
+		/**
+		 * Opening brace
+		 */
+		OPEN_BRACE,
+
+		/**
+		 * Closing brace
+		 */
+		CLOSE_BRACE,
+
+		/**
+		 * New line and indent based on open brace count
+		 */
+		NEW_LINE,
+
+		/**
+		 * Writes currentTraceFormatted
+		 */
+		FORMATTED_TRACE,
+
+		/**
+		 * Adds all closing braces except the one that closes the function
+		 */
+		CLOSE_EXTRA_BRACES,
+
+		/**
+		 * Type of current parameter
+		 */
+		PARAMETER_TYPE,
+
+		/**
+		 * Name of current parameter
+		 */
+		PARAMETER_NAME,
+
+		/**
+		 * Name of current trace
+		 */
+		TRACE_NAME,
+
+		/**
+		 * ID of current trace
+		 */
+		TRACE_ID_HEX,
+
+		/**
+		 * Calls a function to add the trace buffer initialization code
+		 */
+		BUILD_TRACE_BUFFER_CHECK,
+
+		/**
+		 * Calls a function to add the function body
+		 */
+		TRACE_FUNCTION_BODY,
+
+		/**
+		 * Calls a function to add function parameters
+		 */
+		TRACE_FUNCTION_PARAMETERS,
+
+		/**
+		 * Writes the fixedBufferSize member variable
+		 */
+		FIXED_BUFFER_SIZE,
+
+		/**
+		 * Writes the dynamicBufferSize member variable
+		 */
+		DYNAMIC_BUFFER_SIZE,
+
+		/**
+		 * Index of the parameter being processed
+		 */
+		PARAMETER_INDEX
+	}
+
+	/**
+	 * Group ID shift bits
+	 */
+	private static final int GROUP_SHIFT = 16; // CodForChk_Dis_Magic
+
+	/**
+	 * Number of bytes in parameter
+	 */
+	private static final int BYTES_IN_PARAMETER = 4; // CodForChk_Dis_Magic
+
+	/**
+	 * Indent
+	 */
+	private static final String INDENT = "    "; //$NON-NLS-1$
+
+	/**
+	 * The header file to be updated
+	 */
+	private TraceHeader header;
+
+	/**
+	 * Output stream for the header
+	 */
+	private OutputStream headerOutput;
+
+	/**
+	 * Temporary flag that specifies if a trace requires a trace buffer or it
+	 * can be represented by the default trace macros
+	 */
+	private boolean buildTraceBuffer;
+
+	/**
+	 * Temporary variable for fixed size
+	 */
+	private int fixedBufferSize;
+
+	/**
+	 * Dynamic size flag
+	 */
+	private boolean dynamicBufferSizeFlag;
+
+	/**
+	 * Flag which is set it trace needs #endif for __KERNEL_MODE__
+	 */
+	private boolean needsKernelEndif;
+
+	/**
+	 * Used via HeaderTemplateElementType.FORMATTED_TRACE
+	 */
+	private String currentTraceFormatted;
+
+	/**
+	 * Type of current parameter
+	 */
+	private String currentParameterType;
+
+	/**
+	 * Name of current parameter
+	 */
+	private String currentParameterName;
+
+	/**
+	 * Index of current parameter
+	 */
+	private int currentParameterIndex;
+
+	/**
+	 * Number of opened brackets
+	 */
+	private int openBraceCount;
+
+	/**
+	 * Trace being processed
+	 */
+	private Trace currentTrace;
+
+	/**
+	 * Parameter being processed
+	 */
+	private TraceParameter currentParameter;
+
+	/**
+	 * List of trace functions already in the header
+	 */
+	private ArrayList<String> traceDeclarations = new ArrayList<String>();
+
+	/**
+	 * Number of sequential new lines
+	 */
+	private int newLineCount;
+
+	/**
+	 * Number of allowed sequential new lines
+	 */
+	private int maxNewLines;
+
+	/**
+	 * Indicates that writing a function to the header file is going
+	 */
+	private boolean firstOpenBraceFound;
+	
+	/**
+	 * boolean indication that we are buffering a function text
+	 */
+	private boolean bufferingFunction;
+
+	/**
+	 * While writing a function to the header file, it's gathered to this
+	 * member. The member is then checked if the function parameters contain
+	 * TInt or TUint values. If so, the function is replicated so that TInt is
+	 * replaced by TInt32 and TUint with TUint32.
+	 */
+	private StringBuilder functionText = new StringBuilder();
+
+	/**
+	 * Number of brackets seen when writing a function. When it gets to 0, the
+	 * function in previousFunction variable is complete and can be written.
+	 */
+	private int numberOfBrackets;
+		
+	/**
+	 * string to hold the function guard
+	 */
+	private String ostTraceGenxFunGuard;
+
+	/**
+	 * Creates a new header writer
+	 * 
+	 * @param header
+	 *            the header to be written
+	 */
+	TraceHeaderWriter(TraceHeader header) {
+		this.header = header;
+	}
+
+	/**
+	 * Writes the header
+	 * 
+	 * @return true if header was written, false if it matched the existing
+	 *         header
+	 * @throws TraceCompilerException
+	 *             if writing fails
+	 */
+	boolean write() throws TraceCompilerException {
+		boolean headerWritten = false;
+		try {
+			openBraceCount = 0;
+			createHeader();
+			writeTemplate(HeaderTemplate.HEADER_TEMPLATE);
+			headerWritten = closeHeader();
+		} catch (IOException e) {
+			e.printStackTrace();
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.CANNOT_WRITE_PROJECT_FILE, e);
+		} finally {
+			traceDeclarations.clear();
+			if (headerOutput != null) {
+				try {
+					headerOutput.close();
+				} catch (IOException e) {
+				}
+			}
+			headerOutput = null;
+		}
+		return headerWritten;
+	}
+
+	/**
+	 * Creates the header file
+	 * 
+	 * @throws IOException
+	 *             if creation fails
+	 */
+	private void createHeader() throws IOException {
+		File file = new File(header.getAbsolutePath());
+		if (file.exists()) {
+			// If header exists, data is written to a byte array and compared
+			// with existing file. If they are the same, the file is not
+			// updated.
+			headerOutput = new FileCompareOutputStream(file);
+		} else {
+			// If header does not exist, the data is written directly to file
+			headerOutput = FileUtils.createOutputStream(file);
+		}
+	}
+
+	/**
+	 * Closes the header file. If data was written to a byte buffer this
+	 * compares the contents of the buffer with the existing file and re-writes
+	 * the file if contents do not match.
+	 * 
+	 * @return true if header was written, false if it matched the existing
+	 *         header
+	 * @throws IOException
+	 *             if closing fails
+	 */
+	private boolean closeHeader() throws IOException {
+		boolean headerWritten = true;
+		if (headerOutput instanceof FileCompareOutputStream) {
+			headerWritten = ((FileCompareOutputStream) headerOutput)
+					.writeFile();
+		}
+		headerOutput.close();
+		headerOutput = null;
+		return headerWritten;
+	}
+
+	/**
+	 * Writes a template to the stream
+	 * 
+	 * @param template
+	 *            the template
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	void writeTemplate(Object[] template) throws IOException {
+		for (Object o : template) {
+			if (o instanceof String) {
+				write((String) o);
+			} else if (o instanceof TraceHeaderContributionType) {
+				writeHeaderContributions((TraceHeaderContributionType) o);
+			} else if (o instanceof HeaderTemplateElementType) {
+				writeTemplateElement((HeaderTemplateElementType) o);
+			} else if (o instanceof Object[]) {
+				// Template within template
+				writeTemplate((Object[]) o);
+			} else if (o instanceof TemplateChoice) {
+				TemplateChoice choice = (TemplateChoice) o;
+				// Gets the array index from template
+				Class<? extends TemplateCheckBase> c = choice.getChoiceClass();
+				try {
+					// Creates a switch-case object based on array index
+					TemplateCheckBase check = c.newInstance();
+					check.setWriter(this);
+					// Gets the case from the switch-case object and uses it to
+					// get the correct template
+					if (check.check()) {
+						writeTemplate(choice.getTrueTemplate());
+					} else {
+						writeTemplate(choice.getFalseTemplate());
+					}
+				} catch (InstantiationException e) {
+				} catch (IllegalAccessException e) {
+				}
+			} else if (o instanceof TemplateIterator) {
+				Class<? extends TemplateIteratorEntry> c = ((TemplateIterator) o)
+						.getIteratorClass();
+				try {
+					// Creates an iterator object based on array index
+					TemplateIteratorEntry itr = c.newInstance();
+					itr.setWriter(this);
+					itr.iterate(((TemplateIterator) o).getTemplate());
+				} catch (InstantiationException e) {
+				} catch (IllegalAccessException e) {
+				}
+			} else if (o instanceof SetNewLineCount) {
+				maxNewLines = ((SetNewLineCount) o).getLineCount();
+			} else if (o instanceof TraceFormatType) {
+				// Stores the formatted trace, but does not write anything
+				// HeaderTemplateElementType.FORMATTED_TRACE writes the trace
+				currentTraceFormatted = SourceFormatter.formatTrace(
+						currentTrace, (TraceFormatType) o);
+			}
+		}
+	}
+
+	/**
+	 * Writes an element from the HeaderTemplateElementType enumeration
+	 * 
+	 * @param type
+	 *            the element type
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeTemplateElement(HeaderTemplateElementType type)
+			throws IOException { // CodForChk_Dis_ComplexFunc
+		switch (type) {
+		case NEW_LINE:
+			writeNewLine();
+			break;
+		case OPEN_BRACE:
+			writeOpenBrace();
+			break;
+		case CLOSE_BRACE:
+			writeCloseBrace();
+			break;
+		case PARAMETER_INDEX:
+			write(String.valueOf(currentParameterIndex));
+			break;
+		case PARAMETER_TYPE:
+			write(currentParameterType);
+			break;
+		case PARAMETER_NAME:
+			write(currentParameterName);
+			break;
+		case FORMATTED_TRACE:
+			writeFormattedTrace(currentTraceFormatted);
+			break;
+		case TRACE_NAME:
+			write(currentTrace.getName());
+			break;
+		case TRACE_ID_HEX:
+			writeTraceID();
+			break;
+		case FIXED_BUFFER_SIZE:
+			write(String.valueOf(fixedBufferSize));
+			break;
+		case TRACE_FUNCTION_BODY:
+			writeFunctionBody(currentTrace);
+			break;
+		case TRACE_FUNCTION_PARAMETERS:
+			writeParameter(currentParameter);
+			break;
+		case BUILD_TRACE_BUFFER_CHECK:
+			buildTraceBuffer = traceNeedsBuffer(currentTrace);
+			break;
+		case HEADER_GUARD:
+			write(SourceUtils.createHeaderGuard(header.getFileName()));
+			break;
+		case TRACE_COMPILER_VERSION:
+			write(TraceCompilerVersion.getVersion());
+			break;
+		case CLOSE_EXTRA_BRACES:
+			while (openBraceCount > 1) {
+				writeCloseBrace();
+			}
+			break;
+		case LICENCE_TEXT:
+		    writeLicence();
+		    break;
+		}
+	}
+
+	/**
+	 * Writes the trace ID to header
+	 * 
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeTraceID() throws IOException {
+		int gid = currentTrace.getGroup().getID() << GROUP_SHIFT;
+		write(Integer.toHexString(gid | currentTrace.getID()));
+		ComplexHeaderRule rule = currentTrace
+				.getExtension(ComplexHeaderRule.class);
+		if (rule != null) {
+			String ext = rule.getTraceIDDefineExtension();
+			if (ext != null) {
+				write(ext);
+			}
+		}
+	}
+
+	/**
+	 * Writes the header contributions from plug-in's
+	 * 
+	 * @param type
+	 *            the contribution type
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeHeaderContributions(TraceHeaderContributionType type)
+			throws IOException {
+		Iterator<String> contributions = getContributions(type);
+		boolean written = false;
+		while (contributions.hasNext()) {
+			writeContribution(contributions.next(), type);
+			written = true;
+		}
+		if (written) {
+			writeNewLine();
+		}
+	}
+
+	/**
+	 * Gets a list of contributions from plug-in's
+	 * 
+	 * @param type
+	 *            the contribution type
+	 * @return the contributions
+	 */
+	private Iterator<String> getContributions(TraceHeaderContributionType type) {
+		Iterator<TraceHeaderContribution> contributions = header.getOwner()
+				.getExtensions(TraceHeaderContribution.class);
+		ArrayList<String> list = new ArrayList<String>();
+		while (contributions.hasNext()) {
+			String[] s = contributions.next().getContribution(type);
+			if (s != null) {
+				for (String element : s) {
+					list.add(element);
+				}
+			}
+		}
+		return list.iterator();
+	}
+
+	/**
+	 * Writes a contribution to the stream
+	 * 
+	 * @param contribution
+	 *            the contribution
+	 * @param type
+	 *            the contribution type
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeContribution(String contribution,
+			TraceHeaderContributionType type) throws IOException {
+		switch (type) {
+		case GLOBAL_DEFINES:
+			writeDefine(contribution);
+			break;
+		case GLOBAL_INCLUDES:
+			writeSystemInclude(contribution);
+			break;
+		case MAIN_HEADER_CONTENT:
+			// Handled by HeaderEngine
+			break;
+		}
+	}
+	
+	/**
+	 * write start of function guard
+	 * @throws IOException
+	 */
+	private void writeStartFunctionGuard() throws IOException {
+		Pattern p = Pattern.compile("inline\\s+TBool\\s+([^\\(]+)\\s*\\((.*)\\)\\s*\\{"); //$NON-NLS-1$
+		String guard = null;
+		String functionName = null;
+		
+		// Get the function definition line
+		int startIndex = functionText.indexOf(SourceConstants.OPENING_BRACE) + 1;
+		String funcDef = functionText.substring(0, startIndex);
+		
+		Matcher m = p.matcher(funcDef);
+		if (m.matches()) {
+			//get function name
+			functionName = m.group(1);
+			if (functionName == null || functionName.length() == 0) {
+				throw new IOException(Messages.getString("TraceHeader.internalError1")); //$NON-NLS-1$
+			}
+			//get raw parameters
+			String parameters = m.group(2);
+			if (parameters == null || parameters.length() == 0) {//there must be at least TraceID
+				throw new IOException(Messages.getString("TraceHeader.internalError2")); //$NON-NLS-1$
+			}
+			
+			functionName = functionName.trim();
+			parameters = parameters.trim();
+			//remove parameters names
+			guard = parameters.replaceAll("(\\S+,)|(\\S+\\s*$)", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			//replace repeated spaces by one space
+			guard = guard.replaceAll("\\s+", SourceConstants.SPACE).trim(); //$NON-NLS-1$
+			//replace space by underscore
+			guard = guard.replace(SourceConstants.SPACE, SourceConstants.UNDERSCORE);
+			//replace ampersant by REF
+			guard = guard.replace(AMPERSANT, REF);
+			//replace ( by OBR
+			guard = guard.replace(OPEN_BRACKET, BEGINCAST);
+			//replace ) by CBR
+			guard = guard.replace(CLOSING_BRACKET, ENDCAST);
+		} else {
+			throw new IOException(Messages.getString("TraceHeader.internalError3")); //$NON-NLS-1$
+		}
+		
+		guard = SourceConstants.DOUBLE_UNDERSCORE 
+				+ functionName.toUpperCase()
+				+ SourceConstants.UNDERSCORE
+				+ guard.toUpperCase()
+				+ SourceConstants.DOUBLE_UNDERSCORE;
+		
+		ostTraceGenxFunGuard = guard;
+		write( SourceConstants.IFNDEF + SourceConstants.SPACE_CHAR + ostTraceGenxFunGuard);
+		write(SourceConstants.LINE_FEED);
+		write( SourceConstants.DEFINE +SourceConstants.SPACE_CHAR + ostTraceGenxFunGuard);
+		write(SourceConstants.LINE_FEED);
+		write(SourceConstants.LINE_FEED);
+	}
+
+	/**
+	 * write end of function guard
+	 * @throws IOException
+	 */
+	private void writeEndFunctionGuard() throws IOException {
+		if (ostTraceGenxFunGuard != null) {
+			write(SourceConstants.LINE_FEED);
+			write(SourceConstants.LINE_FEED);
+			write(SourceConstants.ENDIF 
+					+ SourceConstants.SPACE_CHAR
+					+ SourceConstants.FORWARD_SLASH_CHAR
+					+ SourceConstants.FORWARD_SLASH_CHAR
+					+ SourceConstants.SPACE_CHAR
+					+ ostTraceGenxFunGuard);
+			write(SourceConstants.LINE_FEED);
+		}
+	}
+	/**
+	 * Writes the function body to the stream
+	 * 
+	 * @param trace
+	 *            the trace to be written
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeFunctionBody(Trace trace) throws IOException {
+		writeTraceBufferAllocation(trace);
+		writeTemplate(HeaderTemplate.PARAMETERS_TEMPLATE);
+		// If buffer is not used (single descriptor parameter), trace line is
+		// already written in template
+		if (isTraceBufferBuilt()) {
+			writeTraceLine(trace);
+		}
+	}
+
+	/**
+	 * Writes trace buffer allocation code to the function
+	 * 
+	 * @param trace
+	 *            the trace to be written
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeTraceBufferAllocation(Trace trace) throws IOException {
+		// If buffer is not used (single descriptor parameter), this function
+		// does nothing
+		if (isTraceBufferBuilt()) {
+			Iterator<TraceParameter> parameters = trace.getParameters();
+			lenghtVariableDefined = false;
+			int fixedSizeParametersTotalSize = 0;
+			while (parameters.hasNext()) {
+				TraceParameter parameter = parameters.next();
+				TraceParameterFormattingRule sourceRule = parameter
+						.getExtension(TraceParameterFormattingRule.class);
+				if (sourceRule == null || sourceRule.isShownInSource()
+						|| sourceRule instanceof FillerParameterRule) {
+					// Fillers do not increment parameter index
+					if (!(sourceRule instanceof FillerParameterRule)) {
+						currentParameterIndex++;
+					}
+					int paramSize = SourceUtils
+							.mapParameterTypeToSize(parameter);
+					// calculateParameterSize returns 0 for dynamic parameters,
+					// but 4 extra bytes need to be reserved for the length
+					if (paramSize == 0) {
+						paramSize = BYTES_IN_PARAMETER;
+					}
+					fixedBufferSize += paramSize;
+					fixedSizeParametersTotalSize += paramSize;
+					if (SourceUtils.isParameterSizeDynamic(parameter)) {
+
+						// Define length variable only once
+						if (lenghtVariableDefined == false) {
+							writeTemplate(HeaderTemplate.LENGTH_VARIABLE_DEFINITION_TEMPLATE);
+							lenghtVariableDefined = true;
+						}
+
+						// Increase length variable if needed
+						// This is needed in case that there has been fixed size
+						// parameter
+						// before dynamic parameter
+						if (fixedSizeParametersTotalSize - paramSize > 0) {
+							fixedSizeParametersTotalSize -= paramSize;
+							writeTemplate(HeaderTemplate.LENGTH_VARIABLE_INCREASE_TEMPLATE_BEGIN);
+							write(String.valueOf(fixedSizeParametersTotalSize));
+							writeTemplate(HeaderTemplate.LENGTH_VARIABLE_INCREASE_TEMPLATE_END);
+						}
+
+						fixedSizeParametersTotalSize = 0;
+
+						writeTemplate(HeaderTemplate.DYNAMIC_PARAMETER_LENGTH_TEMPLATE);
+						dynamicBufferSizeFlag = true;
+					}
+				}
+			}
+			writeTemplate(HeaderTemplate.BUFFER_ALLOCATION_TEMPLATE);
+			currentParameterIndex = 0;
+		}
+	}
+
+	/**
+	 * Writes the given parameter to the header
+	 * 
+	 * @param parameter
+	 *            the parameter
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	void writeParameter(TraceParameter parameter) throws IOException {
+		TraceParameterFormattingRule sourceRule = parameter
+				.getExtension(TraceParameterFormattingRule.class);
+		if (sourceRule == null || sourceRule.isShownInSource()
+				|| sourceRule instanceof FillerParameterRule) {
+			String paramType = SourceUtils
+					.mapParameterTypeToSymbianType(parameter);
+			if (SourceUtils.isParameterSizeDynamic(parameter)) {
+				currentParameterIndex++;
+				currentParameterName = SymbianConstants.PARAMETER_DECLARATION_PREFIX
+						+ currentParameterIndex;
+				writeTemplate(HeaderTemplate.DYNAMIC_PARAMETER_TEMPLATE);
+			} else {
+				currentParameterType = paramType;
+				if (sourceRule instanceof FillerParameterRule) {
+					currentParameterName = "0"; //$NON-NLS-1$
+					writeTemplate(HeaderTemplate.FIXED_PARAMETER_TEMPLATE);
+				} else {
+					currentParameterIndex++;
+					currentParameterName = SymbianConstants.PARAMETER_DECLARATION_PREFIX
+							+ currentParameterIndex;
+					if (lenghtVariableDefined == true) {
+						writeTemplate(HeaderTemplate.FIXED_PARAMETER_TEMPLATE_WITH_LENGTH_CHECK);
+					} else {
+						writeTemplate(HeaderTemplate.FIXED_PARAMETER_TEMPLATE);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Writes the trace line to the function
+	 * 
+	 * @param trace
+	 *            the trace to be written
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeTraceLine(Trace trace) throws IOException {
+		StringBuffer sb;
+		StringBuffer bufferData = new StringBuffer();
+		StringBuffer lengthData = new StringBuffer();
+		if (isBufferSizeDynamic()) {
+			sb = writeBufferedTraceLine(trace, bufferData, lengthData);
+		} else {
+			// If buffer size is 4, the buffer can be traced using the
+			// the 32-bit parameter trace macro instead of data macro
+			if (fixedBufferSize / BYTES_IN_PARAMETER == 1) {
+				sb = writePackedTraceLine(trace, bufferData);
+			} else {
+				sb = writeBufferedTraceLine(trace, bufferData, lengthData);
+			}
+		}
+		int index = sb.indexOf(TraceFormatConstants.DATA_BUFFER_FORMAT);
+		if (index >= 0) {
+			sb.replace(index, index
+					+ TraceFormatConstants.DATA_BUFFER_FORMAT.length(),
+					bufferData.toString());
+		}
+		index = sb.indexOf(TraceFormatConstants.DATA_LENGTH_FORMAT);
+		if (index >= 0) {
+			sb.replace(index, index
+					+ TraceFormatConstants.DATA_LENGTH_FORMAT.length(),
+					lengthData.toString());
+		}
+		String s = sb.toString();
+		write("retval = "); //$NON-NLS-1$
+		writeFormattedTrace(s);
+		writeNewLine();
+	}
+
+	/**
+	 * Writes a trace line when the parameters can be fitted into a direct API
+	 * call
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @param bufferData
+	 *            the buffer
+	 * @return formatted trace
+	 */
+	private StringBuffer writePackedTraceLine(Trace trace,
+			StringBuffer bufferData) {
+		StringBuffer sb;
+		// The formatting rule is used to get the API macro
+		sb = new StringBuffer(SourceFormatter.formatTrace(trace,
+				TraceFormatType.TRACE_PACKED));
+		TraceFormattingRule rule = trace
+				.getExtension(TraceFormattingRule.class);
+		if (rule == null) {
+			rule = trace.getModel().getExtension(TraceFormattingRule.class);
+		}
+		int index = sb.indexOf(TraceFormatConstants.PARAM_COUNT_FORMAT);
+		if (index >= 0) {
+			// Single parameter is supported
+			sb.replace(index, index
+					+ TraceFormatConstants.PARAM_COUNT_FORMAT.length(), rule
+					.mapParameterCountToSource(trace, 1));
+		}
+		bufferData.append("*( ( TUint32* )ptr )"); //$NON-NLS-1$
+		return sb;
+	}
+
+	/**
+	 * Writes a trace line when the trace contains more data that the API
+	 * supports
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @param bufferData
+	 *            the trace buffer
+	 * @param lengthData
+	 *            the trace length buffer
+	 * @return the formatted trace
+	 */
+	private StringBuffer writeBufferedTraceLine(Trace trace,
+			StringBuffer bufferData, StringBuffer lengthData) {
+		StringBuffer sb;
+		// Buffer parameter
+		// *( ( TUint32* )ptr ), *( ( TUint32* )( ptr + 4 ) ), ..., ptr + x
+		sb = new StringBuffer(SourceFormatter.formatTrace(trace,
+				TraceFormatType.TRACE_BUFFER));
+		if (isTraceBufferBuilt()) {
+			bufferData.append("ptr"); //$NON-NLS-1$
+			if (isBufferSizeDynamic()) {
+				// In case of dynamic buffer, the length has been calculated
+				// into length variable
+				lengthData.append("length"); //$NON-NLS-1$
+			} else {
+				// Fixed size case
+				lengthData.append(String.valueOf(fixedBufferSize));
+			}
+		} else {
+			// In case of no-buffer, the size variable contain the data size
+			bufferData.append("ptr"); //$NON-NLS-1$
+			lengthData.append("size"); //$NON-NLS-1$
+		}
+		return sb;
+	}
+
+	/**
+	 * Writes a formatted trace to the stream. This removes the newline from the
+	 * trace if it exists
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeFormattedTrace(String trace) throws IOException {
+		if (trace.endsWith(SourceConstants.LINE_FEED)) {
+			write(trace.substring(0, trace.length()
+					- SourceConstants.LINE_FEED.length()));
+		} else {
+			write(trace);
+		}
+	}
+
+	/**
+	 * Increases indent and writes a new line, brace, new line combination
+	 * 
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeOpenBrace() throws IOException {
+		openBraceCount++;
+		writeNewLine();
+		write(SourceConstants.OPENING_BRACE);
+		writeNewLine();
+	}
+
+	/**
+	 * Write brace, decreases indent and writes a new line
+	 * 
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeCloseBrace() throws IOException {
+		write(SourceConstants.CLOSING_BRACE);
+		openBraceCount--;
+		writeNewLine();
+	}
+	
+	/**
+	 * write licence Text
+	 * @throws IOException if write fails
+	 */
+	private void writeLicence() throws IOException {
+		String licence = null;
+		SourceParser parser = null;
+		//first get any of the traces belonging to this header
+		TraceModel model = header.getOwner().getModel();
+		for (TraceGroup group : model) {
+			for (Trace trace : group) {
+				Iterator<LocationListBase> itr = trace.getExtensions(LocationListBase.class);
+				// The trace must have at least one location that belong to this header
+				while (itr.hasNext() && parser == null) {
+					LocationListBase list = itr.next();
+					for (LocationProperties loc : list) {
+						if (isValidTraceForHeader(loc.getFileName())) {
+								parser = ((TraceLocation)loc).getParser();
+								break;
+						}
+					}
+				}
+				if (parser!= null)  {
+					break;
+				}
+			}
+			if (parser != null) {
+				break;
+			}
+		}
+		
+		if (parser!= null) {
+		List<SourceExcludedArea> excludedAreas = parser.getExcludedAreas();
+		//try to find licence from the source
+		if (!excludedAreas.isEmpty()) {
+			SourceExcludedArea sourceExcludedArea = excludedAreas.get(0);
+			int offset = sourceExcludedArea.getOffset();
+			int type = sourceExcludedArea.getType();
+			int length = sourceExcludedArea.getLength();
+			if (offset == 0 && type == SourceExcludedArea.MULTILINE_COMMENT) {
+				String data = sourceExcludedArea.getParser().getData(offset, length);
+				if (data.contains("Copyright")) { //$NON-NLS-1$
+					// licence found write it
+					TraceCompilerLogger.printInfo("Add Licence text from: " + sourceExcludedArea.getFileName() + " to : " + header.getAbsolutePath()); //$NON-NLS-1$
+					licence = data;
+					write(licence);
+				}
+			}	
+		}
+		}
+		
+		if (licence == null) {
+			//get default licence from the licence file
+			licence = TraceCompilerEngineGlobals.getDefaultLicence(true);
+			
+			if(licence != null) {
+				TraceCompilerLogger.printInfo("Add default EPL Licence to : " + header.getAbsolutePath()); //$NON-NLS-1$
+				write(licence);
+			}
+		}
+	}
+
+	/**
+	 * Writes a new line and indent to the stream
+	 * 
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeNewLine() throws IOException {
+		int newLines = newLineCount;
+		while (newLines < maxNewLines) {
+			write(SourceConstants.LINE_FEED);
+			for (int i = 0; i < openBraceCount; i++) {
+				write(INDENT);
+			}
+			newLines++;
+		}
+		newLineCount = maxNewLines;
+	}
+
+	/**
+	 * Writes a define to stream
+	 * 
+	 * @param name
+	 *            the name for the define
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeDefine(String name) throws IOException {
+		write(SourceConstants.DEFINE);
+		write(SourceConstants.SPACE);
+		write(name);
+		writeNewLine();
+	}
+
+	/**
+	 * Writes include to header
+	 * 
+	 * @param name
+	 *            the header name
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeSystemInclude(String name) throws IOException {
+		write(SourceConstants.INCLUDE);
+		write(SourceConstants.SPACE);
+		write("<"); //$NON-NLS-1$
+		write(name);
+		write(">"); //$NON-NLS-1$
+		writeNewLine();
+	}
+
+	/**
+	 * Writes data to a stream
+	 * 
+	 * @param data
+	 *            the string of data
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void write(String data) throws IOException {
+		// Check if function starts
+		if (data.contains(INLINE_TBOOL) || bufferingFunction) {
+			bufferingFunction = true;
+			functionText.append(data);
+		} else {
+			headerOutput.write(data.getBytes());
+		}
+			newLineCount = 0;
+
+		//try to duplicate function if the current function processing is complete and duplicate is needed.
+		writeAndDuplicateFunction(data);
+	}
+
+	/**
+	 * Duplicates the function if needed
+	 * 
+	 * @param data
+	 *            data String
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	private void writeAndDuplicateFunction(String data) throws IOException {
+			// This assumes there is only one start or end bracket in one line!
+			if (data.contains(SourceConstants.OPENING_BRACE)) {
+				firstOpenBraceFound = true;
+				numberOfBrackets++;
+			} else if (data.contains(SourceConstants.CLOSING_BRACE)) {
+				numberOfBrackets--;
+
+				// Function ends
+				if (numberOfBrackets == 0 && firstOpenBraceFound) {
+					firstOpenBraceFound = false;
+					bufferingFunction = false;
+					//write start function guard
+					writeStartFunctionGuard();
+					//write the function
+					headerOutput.write(functionText.toString().getBytes());
+					//write end function guard
+					writeEndFunctionGuard();
+
+					//process duplicate if needed
+					// Get the function definition line
+					int startIndex = functionText.indexOf(SourceConstants.OPENING_BRACE);
+					String funcDef = functionText.substring(0, startIndex);
+
+					// Replace TInt with TInt32 and TUint with TUint32 from the
+					// header and write the function back again
+					if (funcDef.contains(TINT_DEF)
+							|| funcDef.contains(TUINT_DEF)) {
+						//replace and duplicate
+						funcDef = funcDef.replace(TINT_DEF, TINT32_DEF);
+						funcDef = funcDef.replace(TUINT_DEF, TUINT32_DEF);
+						functionText.replace(0, startIndex, funcDef);
+						
+						//write start function guard for duplicate
+						write(SourceConstants.LINE_FEED);
+						write(SourceConstants.LINE_FEED);
+						writeStartFunctionGuard();
+						
+						//write duplicate function
+						headerOutput.write(functionText.toString().getBytes());
+						
+						//write end function guard for duplicate
+						writeEndFunctionGuard();
+					}
+
+					functionText.setLength(0);
+				}
+			}
+	}
+
+	/**
+	 * Checks if a trace needs a buffer or it can be represented with regular
+	 * trace macros.
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @return true if trace needs a buffer
+	 */
+	private boolean traceNeedsBuffer(Trace trace) {
+		// A single dynamic parameter can be passed through the regular
+		// API macros. In that case the parameter length is determined
+		// by the trace message length
+		Iterator<TraceParameter> parameters = trace.getParameters();
+		boolean needsBuffer = false;
+		boolean dynamicFound = false;
+		while (parameters.hasNext() && !needsBuffer) {
+			TraceParameter parameter = parameters.next();
+			if (isParameterVisible(parameter)) {
+				if (SourceUtils.isParameterSizeDynamic(parameter)) {
+					if (dynamicFound) {
+						needsBuffer = true;
+					} else {
+						dynamicFound = true;
+					}
+				} else {
+					needsBuffer = true;
+				}
+			}
+		}
+		return needsBuffer;
+	}
+
+	/**
+	 * Checks if a parameter is visible
+	 * 
+	 * @param parameter
+	 *            the parameter to be checked
+	 * @return true if visible, false if not
+	 */
+	private boolean isParameterVisible(TraceParameter parameter) {
+		boolean retval;
+		TraceParameterFormattingRule sourceRule = parameter
+				.getExtension(TraceParameterFormattingRule.class);
+		if (sourceRule == null || sourceRule.isShownInSource()) {
+			retval = true;
+		} else {
+			retval = false;
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets the formatted trace
+	 * 
+	 * @return the trace
+	 */
+	String getCurrentTraceFormatted() {
+		return currentTraceFormatted;
+	}
+
+	/**
+	 * Checks if trace is already formatted to header
+	 * 
+	 * @return true if formatted
+	 */
+	boolean isTraceFormatDuplicate() {
+		boolean retval;
+		if (traceDeclarations.contains(currentTraceFormatted)) {
+			retval = true;
+		} else {
+			traceDeclarations.add(currentTraceFormatted);
+			retval = false;
+		}
+		return retval;
+	}
+
+	/**
+	 * Checks if the buffer size for current trace is fixed
+	 * 
+	 * @return the flag
+	 */
+	boolean isTraceBufferFixed() {
+		return fixedBufferSize != 0;
+	}
+
+	/**
+	 * Checks if the buffer is built
+	 * 
+	 * @return the flag
+	 */
+	boolean isTraceBufferBuilt() {
+		return buildTraceBuffer;
+	}
+
+	/**
+	 * Gets the current trace
+	 * 
+	 * @return the trace
+	 */
+	Trace getCurrentTrace() {
+		return currentTrace;
+	}
+
+	/**
+	 * Gets the header
+	 * 
+	 * @return the header
+	 */
+	TraceHeader getHeader() {
+		return header;
+	}
+
+	/**
+	 * Starts writing a trace
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @return true if trace can be written, false if not
+	 */
+	boolean startTrace(Trace trace) {
+		boolean validTrace = false;
+		Iterator<LocationListBase> itr = trace
+				.getExtensions(LocationListBase.class);
+		// The trace must have at least one location that belong to this header
+		while (itr.hasNext() && !validTrace) {
+			LocationListBase list = itr.next();
+			for (LocationProperties loc : list) {
+				validTrace = isValidTraceForHeader(loc.getFileName());
+				if (validTrace) {
+					break;
+				}
+			}
+		}
+		if (validTrace) {
+			currentTrace = trace;
+			fixedBufferSize = 0;
+			dynamicBufferSizeFlag = false;
+			buildTraceBuffer = false;
+			currentTraceFormatted = null;
+			currentParameterName = null;
+			currentParameterType = null;
+			currentParameterIndex = 0;
+		}
+		return validTrace;
+	}
+
+	/**
+	 * Checks if the location belongs to this header
+	 * 
+	 * @param locFileName
+	 *            the location
+	 * @return true if location belongs here
+	 */
+	private boolean isValidTraceForHeader(String locFileName) {
+		boolean valid = false;
+		if (locFileName != null) {
+			int index = locFileName.lastIndexOf('.');
+			if (index >= 0) {
+				locFileName = locFileName.substring(0, index);
+			}
+			if (locFileName.equals(header.getProjectName())) {
+				valid = true;
+			}
+		}
+		return valid;
+	}
+
+	/**
+	 * Starts writing a parameter
+	 * 
+	 * @param parameter
+	 *            the parameter
+	 */
+	void startParameter(TraceParameter parameter) {
+		currentParameterName = null;
+		currentParameterType = null;
+		currentParameter = parameter;
+	}
+
+	/**
+	 * Sets the kernel mode #endif needed flag
+	 * 
+	 * @param flag
+	 *            the flag
+	 */
+	void setKernelModeEndifNeeded(boolean flag) {
+		needsKernelEndif = flag;
+	}
+
+	/**
+	 * Gets the kernel mode endif needed flag
+	 * 
+	 * @return the flag
+	 */
+	boolean isKernelModeEndifNeeded() {
+		return needsKernelEndif;
+	}
+
+	/**
+	 * Returns the dynamic buffer size flag
+	 * 
+	 * @return true if buffer size is dynamic
+	 */
+	boolean isBufferSizeDynamic() {
+		return dynamicBufferSizeFlag;
+	}
+
+	/**
+	 * Checks if current parameter needs alignment
+	 * 
+	 * @return true if needed
+	 */
+	boolean isParameterAlignmentNeeded() {
+		return SourceUtils.isParameterAlignementNeeded(currentParameter
+				.getType());
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/messages.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,8 @@
+TraceHeader.Title=Trace Header
+HeaderEngine.TraceHeaderNotChangedPrefix=No changes were made to 
+HeaderEngine.FailedToAttachHeader=Failed to attach trace header to project
+TraceHeader.internalError1=TraceCompiler internal: Error parsing OstTraceGenx function name.
+TraceHeader.internalError2=TraceCompiler internal: Error parsing OstTraceGenx function parameters.
+TraceHeader.internalError3=TraceCompiler internal: TraceCompiler could not identify OstTraceGenx function.
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/header/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,4 @@
+<html><body>
+Maintains the trace header, which contains inline functions 
+for traces that cannot be represented by the normal trace API.
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/messages.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,110 @@
+TraceCompiler.UnknownTypeWarning=Parameter type is unknown. Hex, 32-bit used
+TraceLocationConverter.GroupIdValueError=TC has detected a fixed_id.defintions using different Group Id values. This file will be regenerated with the correct values.
+TraceLocationConverter.DeprecatedGroupIdWarningStart=Deprecated group
+TraceLocationConverter.DeprecatedGroupIdWarningMiddle=detected. Updating to
+TraceLocationConverter.DeprecatedGroupIdWarningEnd=in dictionary. Please update source code!
+TraceLocationConverter.FixedIdProblemWarningBeginText=Found problems with the old fixed id message : 
+TraceLocationConverter.FixedIdProblemWarningMiddleText=. Therfore deleting it.
+TraceLocationMap.SourceWithTraceRemoved=Source file with traces was removed
+TraceCompilerErrorMessages.SourceNotEditable=Source cannot be edited
+TraceCompilerErrorMessages.DuplicateGroupID=Group ID conflict. Please close all the source files, delete traceid and tracecompiler cache files. Then reopen source file.
+TraceCompilerErrorMessages.DuplicateTraceID=Trace ID is already in use
+TraceCompilerErrorMessages.DuplicateGroupName=Group name is already in use
+TraceCompilerErrorMessages.DuplicateTraceName=Trace name is already in use
+TraceCompilerErrorMessages.DuplicateConstantValue=Enum text is already in use
+TraceCompilerErrorMessages.DuplicateConstantID=Enum value is already in use
+TraceCompilerErrorMessages.DuplicateConstantTableName=Enum type is already in use
+TraceCompilerErrorMessages.DuplicateConstantTableID=Enum ID is already in use
+TraceCompilerErrorMessages.DuplicateParameterName=Parameter name is already in use
+TraceCompilerErrorMessages.DuplicateParameterID=Parameter ID is already in use
+TraceCompilerErrorMessages.InvalidGroupName=Invalid group name
+TraceCompilerErrorMessages.InvalidTraceName=Invalid trace name
+TraceCompilerErrorMessages.InvalidGroupID=Invalid group ID
+TraceCompilerErrorMessages.InvalidGroupIDStart=Group ID must be between 
+TraceCompilerErrorMessages.InvalidGroupIDMiddle=\ and 
+TraceCompilerErrorMessages.InvalidGroupIDEnd=
+TraceCompilerErrorMessages.InvalidTraceID=Invalid trace ID
+TraceCompilerErrorMessages.InvalidTraceIDStart=Trace ID must be between 
+TraceCompilerErrorMessages.InvalidTraceIDMiddle=\ and 
+TraceCompilerErrorMessages.InvalidTraceIDEnd=
+TraceCompilerErrorMessages.InvalidModelPropertiesForExport=Before exporting, the trace compiler needs to be run once to generate UID and name for the component.
+TraceCompilerErrorMessages.InvalidProjectName=Project name is not valid
+TraceCompilerErrorMessages.InvalidSourceLocation=Cursor location is not valid
+TraceCompilerErrorMessages.InvalidParameterName=Parameter name is not valid
+TraceCompilerErrorMessages.InvalidParameterNameInReturnValue=Return parameter name is not valid. Parameter was not added to exit trace.
+TraceCompilerErrorMessages.InvalidConstantValue=Enum text is not valid
+TraceCompilerErrorMessages.InvalidParameterType=Parameter type is not supported
+TraceCompilerErrorMessages.InvalidParameterTypePrefix=Parameter type 
+TraceCompilerErrorMessages.InvalidParameterTypePostfix=\ is not supported
+TraceCompilerErrorMessages.InvalidDirectoryPrefix=
+TraceCompilerErrorMessages.InvalidDirectoryPostfix=\ is not a valid directory
+TraceCompilerErrorMessages.InvalidDirectory=Directory is not valid
+TraceCompilerErrorMessages.InvalidConstantTableName=Enum type is not valid. Please select a valid enum from the source code and try again.
+TraceCompilerErrorMessages.ConstantTableNotPartOfProject=The file where enum exist is not part of project. You can parse enums only from files that are part of the project. If you want parse enum from external file, you can copy and paste that enum to some file in your project and parse it from there. After you have parsed enum you can delete it from your project.  
+TraceCompilerErrorMessages.FileDoesNotExistPrefix=
+TraceCompilerErrorMessages.FileDoesNotExistPostfix=\ does not exist
+TraceCompilerErrorMessages.InvalidTraceData=Invalid trace text
+TraceCompilerErrorMessages.InvalidTraceFile=Trace project file is not valid
+TraceCompilerErrorMessages.GroupNotSelected=Group was not selected
+TraceCompilerErrorMessages.NoFunctionsToInstrumentPrefix=None of the functions from open files could be instrumented with 
+TraceCompilerErrorMessages.NoFunctionsToInstrument=Currently open files do not have any functions that can be instrumented
+TraceCompilerErrorMessages.NoFunctionsToInstrumentPostfix=\ template
+TraceCompilerErrorMessages.ParameterFormatMismatch=Parameter count does not match the format specification
+TraceCompilerErrorMessages.ParameterFormatNotSupported=Parameter format is not supported
+TraceCompilerErrorMessages.ParameterFormatNotSupportedPrefix=Parameter format 
+TraceCompilerErrorMessages.ParameterFormatNotSupportedPostfix=\ is not supported
+TraceCompilerErrorMessages.MultipleErrorsInOperation=Multiple errors during operation. See event viewer for details
+TraceCompilerErrorMessages.ParameterAddNotAllowed=Parameters cannot be added to the trace
+TraceCompilerErrorMessages.EmptyParameterName=Parameter did not have a name and was not added to trace
+TraceCompilerErrorMessages.SourceNotOpen=Source file needs to be opened first
+TraceCompilerErrorMessages.ParameterRemoveNotAllowed=The parameter cannot be removed
+TraceCompilerErrorMessages.ConstantTableNotSelected=Enum was not selected
+TraceCompilerErrorMessages.ConstantTableParseFailed=Failed to parse enum
+TraceCompilerErrorMessages.CannotDeleteSelectedObject=The selected object cannot be deleted
+TraceCompilerErrorMessages.CannotUpdateTraceIntoSource=Trace could not be updated to source code
+TraceCompilerErrorMessages.CannotParseFunctionParameters=None of the function parameters could be added to the function entry trace
+TraceCompilerErrorMessages.CannotOpenProjectFile=Cannot open project file. Check that the directory is not read-only
+TraceCompilerErrorMessages.CannotWriteProjectFile=Cannot write project file. Check that the directory is not read-only
+TraceCompilerErrorMessages.CannotOpenSourceFile=Source file could not be opened
+TraceCompilerErrorMessages.ParameterTemplateInUse=Another parameter already uses the selected template
+TraceCompilerErrorMessages.InvalidTraceTextFormat=Trace text format is not valid
+TraceCompilerErrorMessages.InvalidTraceNameFormat=Trace name format is not valid
+TraceCompilerErrorMessages.InsertTraceDoesNotWork=Data traces cannot be inserted to source
+TraceCompilerErrorMessages.TraceLocationNotSelected=Source location was not selected
+TraceCompilerErrorMessages.TraceHasMultipleLocations=Trace is used from multiple places
+TraceCompilerErrorMessages.LocationCouldNotBeParsed=Location could not be parsed
+TraceCompilerErrorMessages.UnreachableTraceLocation=Trace is in unreachable part of the code
+TraceCompilerErrorMessages.NameFormatMissingFunction=Missing function name tag {$FN} from trace name
+TraceCompilerErrorMessages.TraceNotSelected=Trace was not selected
+TraceCompilerErrorMessages.TraceProjectNotOpen=Trace project is not open
+TraceCompilerErrorMessages.TraceHasNoLocations=Trace is not used from source files and will be removed when a source is saved
+TraceCompilerErrorMessages.NoTracesToDelete=No traces to delete
+TraceCompilerErrorMessages.NoTracesToExport=Project does not have any traces -> No files were written
+TraceCompilerErrorMessages.FileDoesNotExist=File does not exist
+TraceCompilerErrorMessages.NoTraceGroups=Cannot add a new trace before a trace group has been created
+TraceCompilerErrorMessages.UnexpectedException=Unknown error occurred
+TraceCompilerErrorMessages.NotEnoughParameters=Trace does not have enough parameters
+TraceCompilerErrorMessages.NoContextForLocation=Class / function name for trace could not be determined
+TraceCompilerErrorMessages.TraceDoesNotExist=Trace will be created when the source file is saved
+TraceCompilerErrorMessages.TraceNeedsConversionPrefix=Trace needs conversion
+TraceCompilerErrorMessages.ParameterCountMismatch=Parameter count in source does not match the parameter count in trace
+TraceCompilerErrorMessages.ParameterCountDoesNotMatchApi=The number of parameters in source does not match the API macro
+TraceCompilerErrorMessages.ParameterFormatNotSupportedInMacro=Extension macro needs to be used with this parameter format type
+TraceCompilerErrorMessages.ParameterFormatUnnecessaryExtMacro=Trace does not need to use extension macro
+TraceCompilerErrorMessages.ParameterFormatNotSupportedInMacroPrefix=Extension macro needs to be used with parameter 
+TraceCompilerErrorMessages.ParameterFormatNotSupportedInMacroPostfix=
+TraceCompilerErrorMessages.ParameterFormatNotSupportedInArrayPrefix=Parameter format 
+TraceCompilerErrorMessages.ParameterFormatNotSupportedInArrayPostfix=\ cannot be used as an array
+TraceCompilerErrorMessages.ParameterFormatNotSupportedInArray=Parameter format cannot be used as an array
+TraceCompilerErrorMessages.PropertyFileElementNotSupportedPrefix=Property file element 
+TraceCompilerErrorMessages.PropertyFileElementNotSupportedPostfix=\ is not supported and was ignored
+TraceCompilerErrorMessages.PropertyFileElementMisplacedPrefix=Property file element 
+TraceCompilerErrorMessages.PropertyFileElementMisplacedPostfix=\ was unexpected
+TraceCompilerErrorMessages.PropertyFileAttributeInvalidPrefix=Property file attribute 
+TraceCompilerErrorMessages.PropertyFileAttributeInvalidPostfix=\ did not have a valid value
+TraceCompilerErrorMessages.RunOutOfGroupIDs=Run out of Group IDs. You can try to reuse unused group ids by deleting fixed id definition file.
+TraceCompilerErrorMessages.RunOutOfTraceIDs=Run out of Trace IDs. You can try to reuse unused trace ids by deleting fixed id definition file.
+TraceCompilerErrorMessages.VarArgListParameterFound=Parameters were not added to the trace because one of the variables is a variable argument list.
+TraceCompilerErrorMessages.InvalidUsageOfTraceStateGroupName=Invalid group name. TRACE_STATE group name is reserved for state traces only.
+TraceCompilerErrorMessages.InvalidUsageOfTracePerformanceGroupName=Invalid group name. TRACE_PERFORMANCE group name is reserved for performance traces only.
+TraceCompilerErrorMessages.LicenceFileError=Failed to read licence file. 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+Contains the main control logic of TraceCompiler.
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/plugin/PluginEngine.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Export plugin manager, which delegates calls to plug-ins
+*
+*/
+package com.nokia.tracecompiler.engine.plugin;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineBase;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineConfiguration;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorMessages;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.model.TraceObjectPropertyVerifier;
+import com.nokia.tracecompiler.plugin.TraceAPIPlugin;
+import com.nokia.tracecompiler.plugin.TraceCompilerExport;
+import com.nokia.tracecompiler.plugin.TraceCompilerPlugin;
+
+/**
+ * Plugin engine, which delegates calls to plug-ins
+ * 
+ */
+public final class PluginEngine extends TraceCompilerEngineBase {
+
+	/**
+	 * List of plug-ins
+	 */
+	private ArrayList<TraceCompilerPlugin> plugins = new ArrayList<TraceCompilerPlugin>();
+
+	/**
+	 * Property verifier
+	 */
+	private PluginTracePropertyVerifier verifier = new PluginTracePropertyVerifier(
+			this);
+
+	/**
+	 * Trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * Project open flag
+	 */
+	private boolean projectOpen;
+
+	/**
+	 * Sets the trace model. This is not set in constructor, since plug-in
+	 * engine is created before the model
+	 * 
+	 * @param model
+	 *            the trace model
+	 */
+	public void setModel(TraceModel model) {
+		this.model = model;
+	}
+
+	/**
+	 * Gets the started flag
+	 * 
+	 * @return true if started, false if not
+	 */
+	public boolean isProjectOpen() {
+		return projectOpen;
+	}
+
+	/**
+	 * Adds a plugin
+	 * 
+	 * @param plugin
+	 *            the plugin to be added
+	 */
+	public void add(TraceCompilerPlugin plugin) {
+		plugins.add(plugin);
+		if (plugin instanceof TraceAPIPlugin) {
+			TraceAPIPlugin api = (TraceAPIPlugin) plugin;
+			TraceAPIPluginManager manager = model
+					.getExtension(TraceAPIPluginManager.class);
+			manager.addFormatters(api.getFormatters());
+			manager.addParsers(api.getParsers());
+		}
+	}
+
+	/**
+	 * Removes a plugin
+	 * 
+	 * @param plugin
+	 *            the plugin to be removed
+	 */
+	public void remove(TraceCompilerPlugin plugin) {
+		// Formatters / parsers are not removed. Currently this is not a
+		// problem since plug-in's are removed only on shutdown
+		plugins.remove(plugin);
+	}
+
+	/**
+	 * Gets the property verifier interface
+	 * 
+	 * @return the verifier
+	 */
+	public TraceObjectPropertyVerifier getVerifier() {
+		return verifier;
+	}
+
+	/**
+	 * Checks if there are plug-ins
+	 * 
+	 * @return true if plug-ins exist
+	 */
+	public boolean hasPlugins() {
+		return !plugins.isEmpty();
+	}
+
+	/**
+	 * Gets the plug-ins
+	 * 
+	 * @return the plug-ins
+	 */
+	Iterator<TraceCompilerPlugin> getPlugins() {
+		return plugins.iterator();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngineBase#exportProject()
+	 */
+	@Override
+	public void exportProject() throws TraceCompilerException {
+		if (model.hasTraces()) {
+			for (TraceCompilerPlugin plugin : plugins) {
+				if (plugin instanceof TraceCompilerExport) {
+					try {
+						((TraceCompilerExport) plugin).exportTraceProject();
+					} catch (TraceCompilerException e) {
+						TraceCompilerEngineGlobals.getEvents().postError(e);
+							throw e;
+					}
+				}
+			}
+		} else {
+			TraceCompilerEngineGlobals.getEvents().postInfoMessage(
+					TraceCompilerEngineErrorMessages.getErrorMessage(
+							TraceCompilerErrorCode.NO_TRACES_TO_EXPORT, null),
+					null);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectOpened()
+	 */
+	@Override
+	public void projectOpened() {
+		if (!projectOpen) {
+			for (TraceCompilerPlugin plugin : plugins) {
+				plugin.traceProjectOpened(model);
+			}
+			projectOpen = true;
+		} else {
+			if (TraceCompilerEngineConfiguration.ASSERTIONS_ENABLED) {
+				TraceCompilerEngineGlobals.getEvents().postAssertionFailed(
+						"PluginEngine.traceProjectOpened", null); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectClosing()
+	 */
+	@Override
+	public void projectClosed() {
+		if (projectOpen) {
+			for (TraceCompilerPlugin plugin : plugins) {
+				plugin.traceProjectClosed();
+			}
+			projectOpen = false;
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/plugin/PluginTracePropertyVerifier.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,336 @@
+/*
+* Copyright (c) 2008-2010 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:
+*
+* Property verifier for trace objects
+*
+*/
+package com.nokia.tracecompiler.engine.plugin;
+
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.RangeErrorParameters;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceConstantTable;
+import com.nokia.tracecompiler.model.TraceConstantTableEntry;
+import com.nokia.tracecompiler.model.TraceGroup;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.model.TraceObjectPropertyVerifier;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.plugin.TraceCompilerPlugin;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SourceUtils;
+import com.nokia.tracecompiler.project.*;
+
+/**
+ * Property verifier for trace objects
+ * 
+ */
+public final class PluginTracePropertyVerifier implements TraceObjectPropertyVerifier {
+
+	/**
+	 * Valid data character range start
+	 */
+	private static final int DATA_CHAR_START = 0x20; // CodForChk_Dis_Magic
+
+	/**
+	 * Valid data character range end
+	 */
+	private static final int DATA_CHAR_END = 0x7E; // CodForChk_Dis_Magic
+	/**
+	 * TAB character
+	 */
+	private static final int TAB =  0x9;  // CodForChk_Dis_Magic
+
+	/**
+	 * Plugin engine
+	 */
+	private PluginEngine pluginEngine;
+
+	/**
+	 * Constructor. Empty public constructor is needed by test class.
+	 */
+	public PluginTracePropertyVerifier() {
+		
+	}
+	
+	/**
+	 * Constructor
+	 * 
+	 * @param engine
+	 *            plug-in engine
+	 */
+	PluginTracePropertyVerifier(PluginEngine engine) {
+		this.pluginEngine = engine;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectPropertyVerifier#
+	 *      checkConstantProperties(com.nokia.tracecompiler.model.TraceConstantTable,
+	 *      com.nokia.tracecompiler.model.TraceConstantTableEntry, int,
+	 *      java.lang.String)
+	 */
+	public void checkConstantProperties(TraceConstantTable table,
+			TraceConstantTableEntry entry, int id, String value)
+			throws TraceCompilerException {
+		if (!SourceUtils.isValidName(value)) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.INVALID_CONSTANT_VALUE);
+		}
+		if (table != null) {
+			// If table exists, the value and ID must be unique
+			TraceConstantTableEntry old = table.findEntryByID(id);
+			if (old != null && old != entry) {
+				throw new TraceCompilerException(
+						TraceCompilerErrorCode.DUPLICATE_CONSTANT_ID);
+			}
+			old = table.findEntryByName(value);
+			if (old != null && old != entry) {
+				throw new TraceCompilerException(
+						TraceCompilerErrorCode.DUPLICATE_CONSTANT_VALUE);
+			}
+		}
+		Iterator<TraceCompilerPlugin> itr = pluginEngine.getPlugins();
+		while (itr.hasNext()) {
+			TraceCompilerPlugin provider = itr.next();
+			if (provider instanceof TraceObjectPropertyVerifier) {
+				((TraceObjectPropertyVerifier) provider)
+						.checkConstantProperties(table, entry, id, value);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectPropertyVerifier#
+	 *      checkConstantTableProperties(com.nokia.tracecompiler.model.TraceModel,
+	 *      com.nokia.tracecompiler.model.TraceConstantTable, int,
+	 *      java.lang.String)
+	 */
+	public void checkConstantTableProperties(TraceModel model,
+			TraceConstantTable table, int id, String tableName)
+			throws TraceCompilerException {
+		if (!SourceUtils.isValidName(tableName)) {
+			 throw new TraceCompilerException(
+			 TraceCompilerErrorCode.INVALID_CONSTANT_TABLE_NAME, false);
+		}
+		TraceConstantTable old = model.findConstantTableByID(id);
+		if (old != null && old != table) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.DUPLICATE_CONSTANT_TABLE_ID);
+		}
+		old = model.findConstantTableByName(tableName);
+		if (old != null && old != table) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.DUPLICATE_CONSTANT_TABLE_NAME);
+		}
+		Iterator<TraceCompilerPlugin> itr = pluginEngine.getPlugins();
+		while (itr.hasNext()) {
+			TraceCompilerPlugin provider = itr.next();
+			if (provider instanceof TraceObjectPropertyVerifier) {
+				((TraceObjectPropertyVerifier) provider)
+						.checkConstantTableProperties(model, table, id,
+								tableName);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectPropertyVerifier#
+	 *      checkTraceGroupProperties(com.nokia.tracecompiler.model.TraceModel,
+	 *      com.nokia.tracecompiler.model.TraceGroup, int, java.lang.String)
+	 */
+	public void checkTraceGroupProperties(TraceModel model, TraceGroup group,
+			int id, String name) throws TraceCompilerException {
+		if (!SourceUtils.isValidName(name)) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.INVALID_GROUP_NAME);
+		} else if ((id < 0) || (id > TraceCompilerEngineGlobals.MAX_GROUP_ID)) {
+			RangeErrorParameters params = new RangeErrorParameters();
+			params.start = 0;
+			params.end = TraceCompilerEngineGlobals.MAX_GROUP_ID;
+			params.isHex = true;
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.INVALID_GROUP_ID, params);
+		} else {
+			TraceGroup old = model.findGroupByID(id);
+			// this condition is to check that user defined group ids are unique.
+			// system defined group ids at present are not required to be unique.
+			if ((old != null) && (old != group) && (id >= GroupNames.USER_GROUP_ID_FIRST  ) && (id <= GroupNames.USER_GROUP_ID_LAST )) {
+				throw new TraceCompilerException(
+						TraceCompilerErrorCode.DUPLICATE_GROUP_ID);
+			}
+			old = model.findGroupByName(name);
+			if (old != null && old != group) {
+				throw new TraceCompilerException(
+						TraceCompilerErrorCode.DUPLICATE_GROUP_NAME);
+			}
+		}
+		Iterator<TraceCompilerPlugin> itr = pluginEngine.getPlugins();
+		while (itr.hasNext()) {
+			TraceCompilerPlugin provider = itr.next();
+			if (provider instanceof TraceObjectPropertyVerifier) {
+				((TraceObjectPropertyVerifier) provider)
+						.checkTraceGroupProperties(model, group, id, name);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectPropertyVerifier#
+	 *      checkTraceModelProperties(com.nokia.tracecompiler.model.TraceModel,
+	 *      int, java.lang.String, java.lang.String)
+	 */
+	public void checkTraceModelProperties(TraceModel model, int id,
+			String name, String path) throws TraceCompilerException {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectPropertyVerifier#
+	 *      checkTraceParameterProperties(com.nokia.tracecompiler.model.Trace,
+	 *      com.nokia.tracecompiler.model.TraceParameter, int, java.lang.String,
+	 *      java.lang.String)
+	 */
+	public void checkTraceParameterProperties(Trace owner,
+			TraceParameter parameter, int id, String name, String type)
+			throws TraceCompilerException {
+		if (!SourceUtils.isValidParameterName(name)) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.INVALID_PARAMETER_NAME);
+		}
+		TraceParameter old = owner.findParameterByID(id);
+		if (old != null && old != parameter) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.DUPLICATE_PARAMETER_ID);
+		}
+		old = owner.findParameterByName(name);
+		if (old != null && old != parameter) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.DUPLICATE_PARAMETER_NAME);
+		}
+		Iterator<TraceCompilerPlugin> itr = pluginEngine.getPlugins();
+		while (itr.hasNext()) {
+			TraceCompilerPlugin provider = itr.next();
+			if (provider instanceof TraceObjectPropertyVerifier) {
+				((TraceObjectPropertyVerifier) provider)
+						.checkTraceParameterProperties(owner, parameter, id,
+								name, type);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectPropertyVerifier#
+	 *      checkTraceProperties(com.nokia.tracecompiler.model.TraceGroup,
+	 *      com.nokia.tracecompiler.model.Trace, int, java.lang.String,
+	 *      java.lang.String)
+	 */
+	public void checkTraceProperties(TraceGroup group, Trace trace, int id,
+			String name, String data) throws TraceCompilerException {
+		if (!isValidData(data)) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.INVALID_TRACE_DATA);
+		} else if (!SourceUtils.isValidName(name)) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.INVALID_TRACE_NAME);
+		} else if ((id < 0) || (id > TraceCompilerEngineGlobals.MAX_TRACE_ID)) {
+			RangeErrorParameters params = new RangeErrorParameters();
+			params.start = 0;
+			params.end = TraceCompilerEngineGlobals.MAX_TRACE_ID;
+			params.isHex = true;
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.INVALID_TRACE_ID, params);
+		} else {
+			// Verifies the trace name is globally unique
+			Trace old = TraceCompilerEngineGlobals.getTraceModel().findTraceByName(
+					name);
+			if (old != trace && old != null) {
+				throw new TraceCompilerException(
+						TraceCompilerErrorCode.DUPLICATE_TRACE_NAME);
+			}
+			if (group != null) {
+				// If group exists, the trace ID and text must be unique within
+				// the group
+				old = group.findTraceByID(id);
+				if (old != trace && old != null) {
+					// Trace ID's must be unique within group
+					throw new TraceCompilerException(
+							TraceCompilerErrorCode.DUPLICATE_TRACE_ID);
+				}
+			}
+		}
+		Iterator<TraceCompilerPlugin> itr = pluginEngine.getPlugins();
+		while (itr.hasNext()) {
+			TraceCompilerPlugin provider = itr.next();
+			if (provider instanceof TraceObjectPropertyVerifier) {
+				((TraceObjectPropertyVerifier) provider).checkTraceProperties(
+						group, trace, id, name, data);
+			}
+		}
+	}
+
+	/**
+	 * Checks the validity of data
+	 * 
+	 * @param data
+	 *            the data
+	 * @return true if valid
+	 */
+	private boolean isValidData(String data) {
+		boolean retval;
+		if (data != null) {
+			retval = true;
+			for (int i = 0; i < data.length() && retval; i++) {
+				char c = data.charAt(i);
+				// Unescaped quotes are not allowed
+				if (c == SourceConstants.QUOTE_CHAR
+						&& (i == 0 || data.charAt(i - 1) != SourceConstants.BACKSLASH_CHAR)) {
+					retval = false;
+				} else {
+					retval = isValidDataChar(c);
+				}
+			}
+		} else {
+			retval = false;
+		}
+		return retval;
+	}
+
+	/**
+	 * Checks data character validity
+	 * 
+	 * @param c
+	 *            character
+	 * @return true if valid
+	 */
+	private boolean isValidDataChar(char c) {
+		// Special and extended characters are not allowed, except TAB
+		return c >= DATA_CHAR_START && c <= DATA_CHAR_END || c == TAB;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/plugin/TraceAPIPluginManager.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Trace API plug-in manager interface
+*
+*/
+package com.nokia.tracecompiler.engine.plugin;
+
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.plugin.TraceAPIFormatter;
+import com.nokia.tracecompiler.plugin.TraceAPIParser;
+
+/**
+ * Trace API plug-in manager interface
+ * 
+ */
+public interface TraceAPIPluginManager extends TraceModelExtension {
+
+	/**
+	 * Adds the formatter API's from the plug-in
+	 * 
+	 * @param formatters
+	 *            the formatters
+	 */
+	public void addFormatters(TraceAPIFormatter[] formatters);
+
+	/**
+	 * Adds the parser API's from the plug-in
+	 * 
+	 * @param parsers
+	 *            the parsers
+	 */
+	public void addParsers(TraceAPIParser[] parsers);
+
+	/**
+	 * Sets the default API to the model.
+	 */
+	public void createDefaultAPI();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/plugin/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+Plug-in manager and related classes
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/Messages.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* 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:
+*
+* Localization for project package
+*
+*/
+package com.nokia.tracecompiler.engine.project;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Localization for project package
+ * 
+ */
+class Messages {
+
+	/**
+	 * Bundle name
+	 */
+	private static final String BUNDLE_NAME = "com.nokia.tracecompiler.engine.project.messages"; //$NON-NLS-1$
+
+	/**
+	 * Bundle
+	 */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Prevents construction
+	 */
+	private Messages() {
+	}
+
+	/**
+	 * Gets localized string based on key
+	 * 
+	 * @param key
+	 *            the resource key
+	 * @return the localized resource
+	 */
+	public static String getString(String key) {
+		String value;
+		try {
+			value = RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			value = '!' + key + '!';
+		}
+		return value;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/ProjectConstants.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,168 @@
+/*
+* 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:
+*
+* Constant values related to project files
+*
+*/
+package com.nokia.tracecompiler.engine.project;
+
+/**
+ * Constant values related to project files
+ * 
+ */
+public interface ProjectConstants {
+
+	/**
+	 * Title of the cache file
+	 */
+	String FIXED_ID_DEFINITION_FILE_TITLE = Messages
+			.getString("ProjectConstants.FixedIdDefinitionFileTitle"); //$NON-NLS-1$
+
+	/**
+	 * Cache file extension
+	 */
+	String CACHE_FILE_NAME = "tracecompiler.cache"; //$NON-NLS-1$
+
+	/**
+	 * Fixed ID file extension
+	 */
+	String FIXED_ID_DEFINITIONS_FILE_NAME = "fixed_id.definitions"; //$NON-NLS-1$
+
+	/**
+	 * Extension for the file within zip file
+	 */
+	String FILE_EXTENSION = ".xml"; //$NON-NLS-1$
+
+	/**
+	 * Less than escape sequence
+	 */
+	String LT = "&lt;"; //$NON-NLS-1$
+
+	/**
+	 * Greater than escape sequence
+	 */
+	String GT = "&gt;"; //$NON-NLS-1$
+
+	/**
+	 * Indent
+	 */
+	String INDENT = "  "; //$NON-NLS-1$
+
+	/**
+	 * End a tag
+	 */
+	String END_TAG = ">"; //$NON-NLS-1$
+
+	/**
+	 * Start of end tag
+	 */
+	String START_END_TAG = "</"; //$NON-NLS-1$
+
+	/**
+	 * End tag with line feed
+	 */
+	String END_TAG_LF = ">\r\n"; //$NON-NLS-1$
+
+	/**
+	 * Start a tag
+	 */
+	String START_TAG = "<"; //$NON-NLS-1$
+
+	/**
+	 * Extension tag
+	 */
+	String EXTENSION_TAG = "extension"; //$NON-NLS-1$
+
+	/**
+	 * Data tag
+	 */
+	String DATA_TAG = "data"; //$NON-NLS-1$
+
+	/**
+	 * Name tag
+	 */
+	String NAME_TAG = "name"; //$NON-NLS-1$
+
+	/**
+	 * Object ID tag
+	 */
+	String ID_TAG = "id"; //$NON-NLS-1$
+
+	/**
+	 * Constant table entry tag
+	 */
+	String CONSTANT_TABLE_ENTRY_TAG = "entry"; //$NON-NLS-1$
+
+	/**
+	 * Parameter tag
+	 */
+	String PARAMETER_TAG = "parameter"; //$NON-NLS-1$
+
+	/**
+	 * Trace text tag
+	 */
+	String TRACE_TEXT_TAG = "text"; //$NON-NLS-1$
+
+	/**
+	 * Trace tag
+	 */
+	String TRACE_TAG = "trace"; //$NON-NLS-1$
+
+	/**
+	 * Parameter type tag
+	 */
+	String PARAMETER_TYPE_TAG = "type"; //$NON-NLS-1$
+
+	/**
+	 * Constant table tag
+	 */
+	String CONSTANT_TABLE_TAG = "table"; //$NON-NLS-1$
+
+	/**
+	 * Group tag
+	 */
+	String GROUP_TAG = "group"; //$NON-NLS-1$
+
+	/**
+	 * Model tag
+	 */
+	String MODEL_TAG = "model"; //$NON-NLS-1$
+
+	/**
+	 * Location tag
+	 */
+	String LOCATION_TAG = "location"; //$NON-NLS-1$
+
+	/**
+	 * File tag
+	 */
+	String LOCATION_FILE_TAG = "file"; //$NON-NLS-1$
+
+	/**
+	 * Line tag
+	 */
+	String LOCATION_LINE_TAG = "line"; //$NON-NLS-1$
+
+	/**
+	 * Class name tag
+	 */
+	String LOCATION_CLASS_NAME_TAG = "class"; //$NON-NLS-1$
+
+	/**
+	 * Function name tag
+	 */
+	String LOCATION_FUNCTION_NAME_TAG = "function"; //$NON-NLS-1$
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/ProjectEngine.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,294 @@
+/*
+* 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:
+*
+* Trace project file manager
+*
+*/
+package com.nokia.tracecompiler.engine.project;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Enumeration;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineBase;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.plugin.TraceAPIPluginManager;
+import com.nokia.tracecompiler.file.FileUtils;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.project.GroupNames;
+import com.nokia.tracecompiler.project.ProjectUtils;
+
+/**
+ * Trace project engine
+ * 
+ */
+public final class ProjectEngine extends TraceCompilerEngineBase {
+
+	/**
+	 * Parameters for create project
+	 */
+	private class CreateProjectParameters {
+
+		/**
+		 * Trace project path
+		 */
+		String traceProjectPath;
+
+		/**
+		 * Trace project name
+		 */
+		String traceProjectName;
+
+		/**
+		 * Trace project ID
+		 */
+		int traceProjectID;
+
+	}
+
+	/**
+	 * Default project ID
+	 */
+	private static final int DEFAULT_PROJECT_ID = 0x0; // CodForChk_Dis_Magic
+
+	/**
+	 * Trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * Trace directory name
+	 */
+	public static String traceFolderName;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param model
+	 *            the trace model
+	 */
+	public ProjectEngine(TraceModel model) {
+		this.model = model;
+	}
+
+	/**
+	 * Opens trace project
+	 * 
+	 * @param projectPath
+	 *            the path to the project to be opened
+	 * @param modelName
+	 *            the name for the model or null to use directory name
+	 * @throws TraceCompilerException
+	 *             if opening fails
+	 */
+	public void openTraceProject(String projectPath, String modelName)
+			throws TraceCompilerException {
+		if (projectPath != null) {
+			CreateProjectParameters parameters = createParameters(projectPath,
+					modelName);
+
+			// Create empty project
+			if (model.getExtension(TraceCompilerProject.class) == null) {
+				createEmptyProjectFile(parameters);
+			}
+		} else {
+			
+			// If fileName is null, there's no open source files. In
+			// that the project cannot be created
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.SOURCE_NOT_OPEN);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectOpened()
+	 */
+	@Override
+	public void projectOpened() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectClosed()
+	 */
+	@Override
+	public void projectClosed() {
+		model.removeExtensions(TraceCompilerProject.class);
+		model.removeExtensions(TraceIDCache.class);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#exportProject()
+	 */
+	@Override
+	public void exportProject() {
+		try {
+
+			// The fixed id definitions file is updated even there are no traces
+			// in case that old fixed id definitions file exist
+			syncFixedIdDefinitionsFile();
+		} catch (TraceCompilerException e) {
+		}
+	}
+
+	/**
+	 * Updated fixed id definitions file
+	 * 
+	 * @throws TraceCompilerException
+	 *             if update fails
+	 */
+	private void syncFixedIdDefinitionsFile() throws TraceCompilerException {
+		TraceIDCache cache = model.getExtension(TraceIDCache.class);
+		// Create trace Id cache if it does not exist
+		if (cache == null) {
+			String path = ProjectUtils.getLocationForFile(model,
+					ProjectEngine.traceFolderName,
+					ProjectConstants.FIXED_ID_DEFINITIONS_FILE_NAME, false);
+			if (path != null) {
+				cache = new TraceIDCache(new File(path).getParent());
+				model.addExtension(cache);
+			}
+		}
+		if (cache != null) {
+			File cacheFile = new File(cache.getAbsolutePath());
+
+			// The fixed id definitions file is updated in case that there are
+			// traces in model
+			if (model.hasTraces()) {
+				// Try to save Ids to fixed Id definition file
+				try {
+					SortedProperties ids = new SortedProperties();
+					// Save Ids from model to fixed Id properties
+					model.saveIDs(ids);
+
+					// If there are some fixed Ids in that are not used anymore,
+					// keep also those Ids in defininiton file, but mark those
+					// ids as obsolete
+					ids = handleObsoleteIds(ids);
+
+					// Rewrites the trace Id cache file
+					OutputStream fos = FileUtils.createOutputStream(cacheFile);
+					ids.store(fos,
+							ProjectConstants.FIXED_ID_DEFINITION_FILE_TITLE);
+					fos.close();
+					cache.postFileWrittenEvent(cache.getAbsolutePath());
+				} catch (IOException e) {
+					cacheFile.delete();
+				}
+			}
+		}
+	}
+
+	/**
+	 * Handle obsolete Ids
+	 * 
+	 * @param ids
+	 *            Ids
+	 */
+	private SortedProperties handleObsoleteIds(SortedProperties ids) {
+		SortedProperties fixedIds = model.getFixedIds();
+		if (fixedIds != null) {
+			Enumeration<Object> fixedIdKeys = fixedIds.keys();
+			while (fixedIdKeys.hasMoreElements()) {
+				String fixedIdKey = (String) fixedIdKeys.nextElement();
+				if (!ids.containsKey(fixedIdKey)) {
+					String value = fixedIds.getProperty(fixedIdKey);
+					boolean markAsObsolete = true;
+					// In case of groups we only mark user defined
+					// groups as obsolete
+					if (fixedIdKey.startsWith(model.GROUP_PROPERTY_PREFIX)) {
+						int valueAsInt = 0;
+						try {
+							valueAsInt = Integer.decode(value).intValue();
+						} catch (NumberFormatException e) {
+							// Corrupted.
+							valueAsInt = 0;
+						}
+						if (valueAsInt < GroupNames.USER_GROUP_ID_FIRST) {
+							markAsObsolete = false;
+						}
+					}
+					if (markAsObsolete) {
+						// If OBSOLETE tag text already exit, do not
+						// add that again
+						if (fixedIdKey
+								.startsWith(model.OBSOLETE_PROPERTY_PREFIX)) {
+							ids.setProperty(fixedIdKey, value);
+						} else {
+							ids.setProperty(model.OBSOLETE_PROPERTY_PREFIX
+									+ fixedIdKey, value);
+						}
+					}
+				}
+			}
+		}
+		return ids;
+	}
+
+	/**
+	 * Creates the parameters for new project
+	 * 
+	 * @param projectPath
+	 *            the project path
+	 * @param projectName
+	 *            the name for the project
+	 * @return the parameters
+	 */
+	private CreateProjectParameters createParameters(String projectPath,
+			String projectName) {
+		CreateProjectParameters queryData = new CreateProjectParameters();
+		queryData.traceProjectPath = projectPath + File.separator
+				+ ProjectEngine.traceFolderName;
+		queryData.traceProjectName = projectName;
+		queryData.traceProjectID = DEFAULT_PROJECT_ID;
+		return queryData;
+	}
+
+	/**
+	 * Creates the project file from query results
+	 * 
+	 * @param queryData
+	 *            the query result
+	 * @throws TraceCompilerException 
+	 */
+	private void createEmptyProjectFile(CreateProjectParameters queryData) throws TraceCompilerException {
+		model.setName(queryData.traceProjectName);
+		model.setID(queryData.traceProjectID);
+		String componentName = model.getName();
+		TraceCompilerProject file = new TraceCompilerProject(
+				queryData.traceProjectPath, componentName);
+		createAPI(file);
+	}
+
+	/**
+	 * Creates the project API
+	 * 
+	 * @param file
+	 *            the project file
+	 */
+	private void createAPI(TraceCompilerProject file) {
+		model.addExtension(file);
+		TraceAPIPluginManager plugin = model
+				.getExtension(TraceAPIPluginManager.class);
+		plugin.createDefaultAPI();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/SortedProperties.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,198 @@
+/*
+* Copyright (c) 2008-2010 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:
+*
+* Sorted properties
+*
+*/
+package com.nokia.tracecompiler.engine.project;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.Vector;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+
+/**
+ * Sorted properties
+ * 
+ */
+public final class SortedProperties extends Properties {
+
+	/**
+	 * UID
+	 */
+	private static final long serialVersionUID = 746540919659257261L;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.util.Hashtable#keys()
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public synchronized Enumeration<Object> keys() {
+		Enumeration<Object> keysEnum = super.keys();
+		Vector keyList = new Vector();
+		while (keysEnum.hasMoreElements()) {
+			keyList.add(keysEnum.nextElement());
+		}
+		Collections.sort(keyList);
+		return keyList.elements();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.util.Properties#store(java.io.OutputStream, java.lang.String)
+	 */
+	@Override
+	public synchronized void store(OutputStream out, String comments)
+			throws IOException {
+		BufferedWriter awriter;
+		awriter = new BufferedWriter(new OutputStreamWriter(out, "8859_1")); //$NON-NLS-1$
+		String licence = TraceCompilerEngineGlobals.getDefaultLicence(false);
+		if (licence != null) {
+			out.write(licence.getBytes());
+		}
+		if (comments != null)
+			writeln(awriter, "#" + comments); //$NON-NLS-1$
+
+		for (Enumeration<Object> e = keys(); e.hasMoreElements();) {
+			String key = (String) e.nextElement();
+			String val = (String) get(key);
+			key = saveConvert(key, true);
+
+			/*
+			 * No need to escape embedded and trailing spaces for value, hence
+			 * pass false to flag.
+			 */
+			val = saveConvert(val, false);
+			writeln(awriter, key + "=" + val); //$NON-NLS-1$
+		}
+		awriter.flush();
+	}
+
+	/**
+	 * Converts unicodes to encoded &#92;uxxxx and escapes special characters
+	 * with a preceding slash
+	 * 
+	 * @param theString
+	 *            the string to be convert
+	 * @param escapeSpace
+	 *            the escape space flag
+	 * @return the coverted string
+	 */
+	private String saveConvert(String theString, boolean escapeSpace) { // CodForChk_Dis_ComplexFunc
+		int len = theString.length();
+		int bufLen = len * 2; // CodForChk_Dis_Magic
+		if (bufLen < 0) {
+			bufLen = Integer.MAX_VALUE;
+		}
+		StringBuffer outBuffer = new StringBuffer(bufLen);
+
+		for (int x = 0; x < len; x++) {
+			char aChar = theString.charAt(x);
+			// Handle common case first, selecting largest block that
+			// avoids the specials below
+			if ((aChar > 61) && (aChar < 127)) { // CodForChk_Dis_Magic
+				if (aChar == '\\') {
+					outBuffer.append('\\');
+					outBuffer.append('\\');
+					continue;
+				}
+				outBuffer.append(aChar);
+				continue;
+			}
+			switch (aChar) {
+			case ' ':
+				if (x == 0 || escapeSpace)
+					outBuffer.append('\\');
+				outBuffer.append(' ');
+				break;
+			case '\t':
+				outBuffer.append('\\');
+				outBuffer.append('t');
+				break;
+			case '\n':
+				outBuffer.append('\\');
+				outBuffer.append('n');
+				break;
+			case '\r':
+				outBuffer.append('\\');
+				outBuffer.append('r');
+				break;
+			case '\f':
+				outBuffer.append('\\');
+				outBuffer.append('f');
+				break;
+			case '=': // Fall through
+			case ':': // Fall through
+			case '#': // Fall through
+			case '!':
+				outBuffer.append('\\');
+				outBuffer.append(aChar);
+				break;
+			default:
+				if ((aChar < 0x0020) || (aChar > 0x007e)) { // CodForChk_Dis_Magic
+					outBuffer.append('\\');
+					outBuffer.append('u');
+					outBuffer.append(toHex((aChar >> 12) & 0xF)); // CodForChk_Dis_Magic
+					outBuffer.append(toHex((aChar >> 8) & 0xF)); // CodForChk_Dis_Magic
+					outBuffer.append(toHex((aChar >> 4) & 0xF)); // CodForChk_Dis_Magic
+					outBuffer.append(toHex(aChar & 0xF)); // CodForChk_Dis_Magic
+				} else {
+					outBuffer.append(aChar);
+				}
+			}
+		}
+		return outBuffer.toString();
+	}
+
+	/**
+	 * Convert a nibble to a hex character
+	 * 
+	 * @param nibble
+	 *            the nibble to convert
+	 * @return the hex character
+	 */
+	private static char toHex(int nibble) {
+		return hexDigit[(nibble & 0xF)]; // CodForChk_Dis_Magic
+	}
+
+	/**
+	 * A table of hex digits
+	 */
+	private static final char[] hexDigit = { '0', '1', '2', '3', '4', '5', '6',
+			'7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+	/**
+	 * Write line
+	 * 
+	 * @param bw
+	 *            the buffered writer that used to write
+	 * @param s
+	 *            the string what to write
+	 * @throws IOException
+	 */
+	private static void writeln(BufferedWriter bw, String s) throws IOException {
+		bw.write(s);
+		bw.newLine();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/TraceCompilerProject.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,77 @@
+/*
+* 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:
+*
+* TraceCompiler project file properties
+*
+*/
+package com.nokia.tracecompiler.engine.project;
+
+import com.nokia.tracecompiler.project.TraceProjectFile;
+
+/**
+ * TraceCompiler project file properties
+ * 
+ */
+final class TraceCompilerProject extends TraceProjectFile {
+
+	/**
+	 * Title shown in UI
+	 */
+	private static final String TITLE = Messages
+			.getString("TraceCompilerProject.Title"); //$NON-NLS-1$
+
+	/**
+	 * Constructor
+	 * 
+	 * @param absolutePath
+	 *            the path to the file, including file name
+	 */
+	TraceCompilerProject(String absolutePath) {
+		super(absolutePath, true);
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param path
+	 *            the path to the file
+	 * @param name
+	 *            the file name
+	 */
+	TraceCompilerProject(String path, String name) {
+		super(path, name);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectFile#getFileExtension()
+	 */
+	@Override
+	protected String getFileExtension() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectFile#getTitle()
+	 */
+	@Override
+	public String getTitle() {
+		return TITLE;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/TraceIDCache.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,65 @@
+/*
+* 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:
+*
+* Cache file for storing trace and group identifiers
+*
+*/
+package com.nokia.tracecompiler.engine.project;
+
+import com.nokia.tracecompiler.project.TraceProjectFile;
+
+/**
+ * Cache file for storing trace and group identifiers
+ * 
+ */
+public final class TraceIDCache extends TraceProjectFile {
+
+	/**
+	 * Title shown in UI
+	 */
+	private static final String TITLE = Messages
+			.getString("TraceIDCache.Title"); //$NON-NLS-1$
+
+	/**
+	 * Constructor
+	 * 
+	 * @param cachePath
+	 *            path to the cache file
+	 */
+	public TraceIDCache(String cachePath) {
+		super(cachePath, ""); //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectFile#getFileExtension()
+	 */
+	@Override
+	protected String getFileExtension() {
+		return ProjectConstants.FIXED_ID_DEFINITIONS_FILE_NAME;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectFile#getTitle()
+	 */
+	@Override
+	public String getTitle() {
+		return TITLE;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/messages.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,5 @@
+ProjectFileParser.SourceFileDoesNotExist=Source file referenced by traces does not exist
+ProjectFileParser.ErrorWhileProcessing=An error occurred while processing the project file
+TraceCompilerProject.Title=Project File
+TraceIDCache.Title=Trace ID Cache File
+ProjectConstants.FixedIdDefinitionFileTitle=Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+TraceCompiler project file management
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/DocumentElementWrapper.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,64 @@
+/*
+* 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:
+*
+* Extension wrapper for XML document element
+*
+*/
+package com.nokia.tracecompiler.engine.propertyfile;
+
+import org.w3c.dom.Element;
+
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceObject;
+
+/**
+ * Extension wrapper for XML document element
+ * 
+ */
+final class DocumentElementWrapper implements TraceModelExtension {
+
+	/**
+	 * Owner
+	 */
+	private TraceObject owner;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param element
+	 *            the document element
+	 */
+	DocumentElementWrapper(Element element) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtension#getOwner()
+	 */
+	public TraceObject getOwner() {
+		return owner;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtension#setOwner(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void setOwner(TraceObject owner) {
+		this.owner = owner;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/EnumElementParser.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,70 @@
+/*
+* 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:
+*
+* Parser for enum element
+*
+*/
+package com.nokia.tracecompiler.engine.propertyfile;
+
+import org.w3c.dom.Element;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceConstantTable;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.model.TraceModelExtension;
+
+/**
+ * Parser for enum element
+ * 
+ */
+final class EnumElementParser implements PropertyFileElementParser {
+
+	/**
+	 * Property file parser
+	 */
+	private final PropertyFileParser propertyFileParser;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param propertyFileParser
+	 *            the parser
+	 */
+	EnumElementParser(PropertyFileParser propertyFileParser) {
+		this.propertyFileParser = propertyFileParser;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.propertyfile.PropertyFileElementParser#
+	 *      parse(java.lang.Object, org.w3c.dom.Element)
+	 */
+	public void parse(Object owner, Element element)
+			throws TraceCompilerException {
+		TraceModel model = TraceCompilerEngineGlobals.getTraceModel();
+		String name = element
+				.getAttribute(PropertyFileConstants.NAME_ATTRIBUTE);
+		int id = model.getNextConstantTableID();
+		model.getVerifier().checkConstantTableProperties(model, null, id, name);
+		// Document element reference is stored to the model
+		TraceModelExtension[] exts = new TraceModelExtension[] { new DocumentElementWrapper(
+				element) };
+		TraceConstantTable table = model.getFactory().createConstantTable(id,
+				name, exts);
+		propertyFileParser.parseChildren(table, element);
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/FileElementParser.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,65 @@
+/*
+* 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:
+*
+* FIle element parser
+*
+*/
+package com.nokia.tracecompiler.engine.propertyfile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.w3c.dom.Element;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.project.ProjectEngine;
+import com.nokia.tracecompiler.engine.source.SourceEngine;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+
+/**
+ * File element parser
+ * 
+ */
+final class FileElementParser implements PropertyFileElementParser {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.propertyfile.PropertyFileElementParser#
+	 *      parse(java.lang.Object, org.w3c.dom.Element)
+	 */
+	public void parse(Object owner, Element element)
+			throws TraceCompilerException {
+		String filePath = element.getTextContent();
+		SourceEngine sourceEngine = TraceCompilerEngineGlobals.getSourceEngine();
+		ArrayList<String> list = sourceEngine.getNonSourceFiles();
+
+		String projectPath = TraceCompilerEngineGlobals.getProjectPath();
+
+		File file = new File(projectPath + File.separatorChar
+				+ ProjectEngine.traceFolderName + File.separatorChar + filePath);
+
+		try {
+			filePath = file.getCanonicalPath();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+		if (!list.contains(filePath)) {
+			sourceEngine.addNonSourceFile(filePath);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/Messages.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* 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:
+*
+* Localization for property file package
+*
+*/
+package com.nokia.tracecompiler.engine.propertyfile;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Localization for property file package
+ * 
+ */
+class Messages {
+
+	/**
+	 * Bundle name
+	 */
+	private static final String BUNDLE_NAME = "com.nokia.tracecompiler.engine.propertyfile.messages"; //$NON-NLS-1$
+
+	/**
+	 * Bundle
+	 */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Prevents construction
+	 */
+	private Messages() {
+	}
+
+	/**
+	 * Gets localized string based on key
+	 * 
+	 * @param key
+	 *            the resource key
+	 * @return the localized resource
+	 */
+	public static String getString(String key) {
+		String value;
+		try {
+			value = RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			value = '!' + key + '!';
+		}
+		return value;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/PropertyFileConstants.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,118 @@
+/*
+* 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:
+*
+* Constants for property file engine
+*
+*/
+package com.nokia.tracecompiler.engine.propertyfile;
+
+
+/**
+ * Constants for property file engine
+ * 
+ */
+public interface PropertyFileConstants {
+
+	/**
+	 * File name
+	 */
+	String PROPERTY_FILE_NAME = "trace.properties"; //$NON-NLS-1$
+
+	/**
+	 * Number of backup files to keep
+	 */
+	int BACKUP_COUNT = 10; // CodForChk_Dis_Magic
+
+	/**
+	 * Last of the backup headers
+	 */
+	String LAST_BACKUP = "9.properties.bak"; //$NON-NLS-1$
+
+	/**
+	 * Backup extension
+	 */
+	String BACKUP_EXTENSION = ".bak"; //$NON-NLS-1$
+
+	/**
+	 * Root element name
+	 */
+	String ROOT_ELEMENT = "trace_properties"; //$NON-NLS-1$
+
+	/**
+	 * Enum element name
+	 */
+	String ENUM_ELEMENT = "enum"; //$NON-NLS-1$
+
+	/**
+	 * Struct element name
+	 */
+	String STRUCT_ELEMENT = "struct"; //$NON-NLS-1$
+
+	/**
+	 * Component element name
+	 */
+	String COMPONENT_ELEMENT = "component"; //$NON-NLS-1$
+
+	/**
+	 * Component element name
+	 */
+	String GROUP_ELEMENT = "group"; //$NON-NLS-1$
+
+	/**
+	 * Trace element name
+	 */
+	String TRACE_ELEMENT = "trace"; //$NON-NLS-1$
+
+	/**
+	 * Value element name
+	 */
+	String VALUE_ELEMENT = "value"; //$NON-NLS-1$
+
+	/**
+	 * Property element name
+	 */
+	String PROPERTY_ELEMENT = "property"; //$NON-NLS-1$
+
+	/**
+	 * File element name
+	 */
+	String FILE_ELEMENT = "file"; //$NON-NLS-1$
+	
+	/**
+	 * Name attribute
+	 */
+	String NAME_ATTRIBUTE = "name"; //$NON-NLS-1$
+
+	/**
+	 * Format attribute
+	 */
+	String FORMAT_ATTRIBUTE = "format"; //$NON-NLS-1$
+
+	/**
+	 * ID attribute
+	 */
+	String ID_ATTRIBUTE = "id"; //$NON-NLS-1$
+
+	/**
+	 * Type attribute
+	 */
+	String TYPE_ATTRIBUTE = "type"; //$NON-NLS-1$
+
+	/**
+	 * Size attribute
+	 */
+	String SIZE_ATTRIBUTE = "size"; //$NON-NLS-1$
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/PropertyFileElementParser.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,42 @@
+/*
+* 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:
+*
+* Property file element parser interface
+*
+*/
+package com.nokia.tracecompiler.engine.propertyfile;
+
+import org.w3c.dom.Element;
+
+import com.nokia.tracecompiler.model.TraceCompilerException;
+
+/**
+ * Property file element parser interface
+ * 
+ */
+interface PropertyFileElementParser {
+
+	/**
+	 * Parses the given element
+	 * 
+	 * @param owner
+	 *            the owning object
+	 * @param element
+	 *            the element to be parsed
+	 * @throws TraceCompilerException
+	 *             if parser fails
+	 */
+	void parse(Object owner, Element element) throws TraceCompilerException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/PropertyFileEngine.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,192 @@
+/*
+* 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:
+*
+* Property file management engine
+*
+*/
+package com.nokia.tracecompiler.engine.propertyfile;
+
+import java.io.File;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineBase;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.project.ProjectEngine;
+import com.nokia.tracecompiler.file.FileUtils;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.project.ProjectUtils;
+import com.nokia.tracecompiler.source.SourceConstants;
+
+/**
+ * Property file management engine
+ * 
+ */
+public final class PropertyFileEngine extends TraceCompilerEngineBase {
+
+	/**
+	 * Trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param model
+	 *            the trace model
+	 */
+	public PropertyFileEngine(TraceModel model) {
+		this.model = model;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectOpened()
+	 */
+	@Override
+	public void projectOpened() throws TraceCompilerException {
+		TracePropertyFile propertyFile = model
+				.getExtension(TracePropertyFile.class);
+		if (propertyFile == null) {
+			String fileName = null;
+			try {
+				fileName = ProjectUtils.getLocationForFile(model,
+						ProjectEngine.traceFolderName,
+						PropertyFileConstants.PROPERTY_FILE_NAME, false);
+			} catch (TraceCompilerException e) {
+				// Model should always be open when traceProjectOpened is
+				// called
+			}
+			if (fileName != null) {
+				propertyFile = parsePropertyFile(fileName);
+			}
+		}
+		if (propertyFile == null) {
+			String msg = Messages
+					.getString("PropertyFileEngine.FailedToAttachFile"); //$NON-NLS-1$
+			TraceCompilerEngineGlobals.getEvents().postErrorMessage(msg, null, true);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectClosing()
+	 */
+	@Override
+	public void projectClosed() {
+		model.removeExtensions(TracePropertyFile.class);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#exportProject()
+	 */
+	@Override
+	public void exportProject() {
+	}
+
+	/**
+	 * Parses the property file
+	 * 
+	 * @param fileName
+	 *            the file path
+	 * @return the property file
+	 */
+	private TracePropertyFile parsePropertyFile(String fileName) {
+		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+		factory.setValidating(false);
+		DocumentBuilder builder;
+		TracePropertyFile propertyFile = null;
+		try {
+			builder = factory.newDocumentBuilder();
+			File file = new File(fileName);
+			if (file.exists()) {
+				try {
+					PropertyFileParser parser = new PropertyFileParser(model,
+							fileName, builder);
+					parser.parse();
+					propertyFile = new TracePropertyFile(file.getParent(),
+							parser.getDocument());
+				} catch (TraceCompilerException e) {
+					// Problem parsing document -> Backup and create new
+					TraceCompilerEngineGlobals.getEvents().postError(e);
+					createBackup(fileName);
+				}
+			}
+			if (propertyFile == null) {
+				propertyFile = new TracePropertyFile(file.getParent(), builder
+						.newDocument());
+			}
+			model.addExtension(propertyFile);
+		} catch (ParserConfigurationException e) {
+		}
+		return propertyFile;
+	}
+
+	/**
+	 * Creates a backup of the property file
+	 * 
+	 * @param path
+	 *            the file to be backed up
+	 */
+	private void createBackup(String path) {
+		boolean backup = false;
+		File file = new File(path);
+		if (file.exists()) {
+			boolean allexist = true;
+			// Checks the existing backup files and renames the old file to
+			// largest available number starting from 0
+			File f = null;
+			for (int i = 0; i < PropertyFileConstants.BACKUP_COUNT && allexist; i++) {
+				f = new File(path + i + PropertyFileConstants.BACKUP_EXTENSION);
+				if (!f.exists()) {
+					backup = FileUtils.copyFile(file, f);
+					allexist = false;
+				}
+			}
+			if (allexist) {
+				// If all backups from 0 to 9 exist, the old ones are moved
+				// back 1 step. The new file is renamed to *9.h
+				for (int i = 0; i < PropertyFileConstants.BACKUP_COUNT; i++) {
+					f = new File(path + i
+							+ PropertyFileConstants.BACKUP_EXTENSION);
+					if (i == 0) {
+						f.delete();
+					} else {
+						f.renameTo(new File(path + (i - 1)
+								+ PropertyFileConstants.BACKUP_EXTENSION));
+					}
+				}
+				f = new File(path + PropertyFileConstants.LAST_BACKUP);
+				backup = FileUtils.copyFile(file, f);
+			}
+			if (f != null && backup) {
+				String msg = Messages
+						.getString("PropertyFileEngine.PropertyFileBackUpPrefix") //$NON-NLS-1$
+						+ FileUtils.convertSeparators(
+								SourceConstants.FORWARD_SLASH_CHAR, f
+										.getAbsolutePath(), false);
+				TraceCompilerEngineGlobals.getEvents().postInfoMessage(msg, null);
+			}
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/PropertyFileParser.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,183 @@
+/*
+* 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:
+*
+* Parser for trace property files
+*
+*/
+package com.nokia.tracecompiler.engine.propertyfile;
+
+import java.util.HashMap;
+
+import javax.xml.parsers.DocumentBuilder;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorMessages;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.StringErrorParameters;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.project.ProjectFileParser;
+
+/**
+ * Parser for trace property files
+ * 
+ */
+final class PropertyFileParser extends ProjectFileParser {
+
+	/**
+	 * DOM document representing the property file
+	 */
+	private Document document;
+
+	/**
+	 * Parsers for document elements
+	 */
+	private HashMap<String, PropertyFileElementParser> elementParsers = new HashMap<String, PropertyFileElementParser>();
+
+	/**
+	 * Document builder
+	 */
+	private DocumentBuilder builder;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param model
+	 *            the trace model
+	 * @param fileName
+	 *            the property file name
+	 * @param builder
+	 *            document builder
+	 * @throws TraceCompilerException
+	 *             if parser cannot be created
+	 */
+	protected PropertyFileParser(TraceModel model, String fileName,
+			DocumentBuilder builder) throws TraceCompilerException {
+		super(model, fileName);
+		this.builder = builder;
+		elementParsers.put(PropertyFileConstants.ENUM_ELEMENT,
+				new EnumElementParser(this));
+		elementParsers.put(PropertyFileConstants.VALUE_ELEMENT,
+				new ValueElementParser());
+		elementParsers.put(PropertyFileConstants.FILE_ELEMENT,
+				new FileElementParser());
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.ProjectFileParser#createParser()
+	 */
+	@Override
+	protected void createParser() throws TraceCompilerException {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.ProjectFileParser#parse()
+	 */
+	@Override
+	public void parse() throws TraceCompilerException {
+		try {
+			document = builder.parse(projectFile);
+			Element rootElement = PropertyFileUtils.findRoot(document);
+			if (rootElement != null) {
+				parseChildren(model, rootElement);
+			} else {
+				throw new TraceCompilerException(
+						TraceCompilerErrorCode.INVALID_PROJECT_FILE);
+			}
+		} catch (TraceCompilerException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.INVALID_PROJECT_FILE, e);
+		}
+	}
+
+	/**
+	 * Parses child elements of given element
+	 * 
+	 * @param owner
+	 *            the owning object
+	 * @param element
+	 *            the element
+	 */
+	void parseChildren(Object owner, Element element) {
+		NodeList list;
+		list = element.getChildNodes();
+		for (int i = 0; i < list.getLength(); i++) {
+			Node node = list.item(i);
+			if (node.getNodeType() == Node.ELEMENT_NODE) {
+				parseElement(owner, (Element) node);
+			}
+		}
+	}
+
+	/**
+	 * Parses an element
+	 * 
+	 * @param owner
+	 *            the owning trace object
+	 * @param element
+	 *            the element to be parsed
+	 */
+	private void parseElement(Object owner, Element element) {
+		String name = element.getNodeName();
+		PropertyFileElementParser parser = elementParsers.get(name);
+		if (parser != null) {
+			try {
+				parser.parse(owner, element);
+			} catch (TraceCompilerException e) {
+				String msg = TraceCompilerEngineErrorMessages.getErrorMessage(e);
+				TraceCompilerEngineGlobals.getEvents().postWarningMessage(msg,
+						e.getErrorSource());
+			}
+		} else {
+			postElementNotSupportedWarning(name);
+		}
+	}
+
+	/**
+	 * Posts element not supported warning
+	 * 
+	 * @param name
+	 *            the element name
+	 */
+	private void postElementNotSupportedWarning(String name) {
+		StringErrorParameters parameter = new StringErrorParameters();
+		parameter.string = name;
+		String msg = TraceCompilerEngineErrorMessages.getErrorMessage(
+				TraceCompilerErrorCode.PROPERTY_FILE_ELEMENT_NOT_SUPPORTED,
+				parameter);
+		TraceCompilerEngineGlobals.getEvents().postWarningMessage(msg, null);
+	}
+
+	/**
+	 * Gets the document representing the property file
+	 * 
+	 * @return the document
+	 */
+	Document getDocument() {
+		return document;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/PropertyFileUtils.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,54 @@
+/*
+* 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:
+*
+* Utility functions for property file
+*
+*/
+package com.nokia.tracecompiler.engine.propertyfile;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Utility functions for property file
+ * 
+ */
+final class PropertyFileUtils {
+
+	/**
+	 * Finds the root element from property file document
+	 * 
+	 * @param document
+	 *            the document
+	 * @return the root element
+	 */
+	static Element findRoot(Document document) {
+		NodeList list = document.getChildNodes();
+		Element rootElement = null;
+		for (int i = 0; i < list.getLength(); i++) {
+			Node root = list.item(i);
+			if (root.getNodeType() == Node.ELEMENT_NODE) {
+				if (root.getNodeName().equalsIgnoreCase(
+						PropertyFileConstants.ROOT_ELEMENT)) {
+					rootElement = (Element) root;
+				}
+			}
+		}
+		return rootElement;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/TracePropertyFile.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,68 @@
+/*
+* 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:
+*
+* Trace property file properties
+*
+*/
+package com.nokia.tracecompiler.engine.propertyfile;
+
+import org.w3c.dom.Document;
+
+import com.nokia.tracecompiler.project.TraceProjectFile;
+
+/**
+ * Trace property file properties
+ * 
+ */
+final class TracePropertyFile extends TraceProjectFile {
+
+	/**
+	 * Title shown in UI
+	 */
+	private static final String PROPERTY_FILE = Messages
+			.getString("TracePropertyFile.Title"); //$NON-NLS-1$
+
+	/**
+	 * Creates a new property file
+	 * 
+	 * @param filePath
+	 *            path to the file
+	 * @param document
+	 *            the document representing the property file
+	 */
+	TracePropertyFile(String filePath, Document document) {
+		super(filePath, ""); //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectFile#getFileExtension()
+	 */
+	@Override
+	protected String getFileExtension() {
+		return PropertyFileConstants.PROPERTY_FILE_NAME;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectFile#getTitle()
+	 */
+	@Override
+	public String getTitle() {
+		return PROPERTY_FILE;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/ValueElementParser.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,89 @@
+/*
+* 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:
+*
+* Value element parser
+*
+*/
+package com.nokia.tracecompiler.engine.propertyfile;
+
+import org.w3c.dom.Element;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.StringErrorParameters;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceConstantTable;
+import com.nokia.tracecompiler.model.TraceModelExtension;
+
+/**
+ * Value element parser
+ * 
+ */
+final class ValueElementParser implements PropertyFileElementParser {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.propertyfile.PropertyFileElementParser#
+	 *      parse(java.lang.Object, org.w3c.dom.Element)
+	 */
+	public void parse(Object owner, Element element)
+			throws TraceCompilerException {
+		// Value element must be parsed within context of TraceConstantTable
+		// Struct has not yet been implemented
+		if (owner instanceof TraceConstantTable) {
+			parseConstantTableEntry((TraceConstantTable) owner, element);
+		} else {
+			StringErrorParameters parameter = new StringErrorParameters();
+			parameter.string = PropertyFileConstants.VALUE_ELEMENT;
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.PROPERTY_FILE_ELEMENT_MISPLACED,
+					parameter, null);
+		}
+	}
+
+	/**
+	 * Parses a constant table entry
+	 * 
+	 * @param table
+	 *            the constant table
+	 * @param element
+	 *            the table entry
+	 * @throws TraceCompilerException
+	 *             if entry is not valid
+	 */
+	private void parseConstantTableEntry(TraceConstantTable table,
+			Element element) throws TraceCompilerException {
+		String idstr = element.getAttribute(PropertyFileConstants.ID_ATTRIBUTE);
+		if (idstr != null) {
+			try {
+				int id = Integer.parseInt(idstr);
+				String value = element.getTextContent();
+				table.getModel().getVerifier().checkConstantProperties(table,
+						null, id, value);
+				// Document element reference is stored to the model
+				TraceModelExtension[] exts = new TraceModelExtension[] { new DocumentElementWrapper(
+						element) };
+				table.getModel().getFactory().createConstantTableEntry(table,
+						id, value, exts);
+			} catch (NumberFormatException e) {
+				StringErrorParameters parameter = new StringErrorParameters();
+				parameter.string = PropertyFileConstants.ID_ATTRIBUTE;
+				throw new TraceCompilerException(
+						TraceCompilerErrorCode.PROPERTY_FILE_ATTRIBUTE_INVALID,
+						parameter, null);
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/messages.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,5 @@
+TracePropertyFile.Title=Property File
+PropertyFileEngine.FailedToAttachFile=Failed to attach property file to project
+PropertyFileEngine.PropertyFileBackUpPrefix=Property file back-up created to 
+TraceObjectPropertyList.Title=Properties
+TraceObjectPropertyImpl.NameValueSeparator=: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ArrayParameterRuleImpl.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* 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:
+*
+* Rule which defines a parameter as array type
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.model.TraceModelPersistentExtension;
+import com.nokia.tracecompiler.rules.ArrayParameterRule;
+
+/**
+ * Rule which defines a parameter as array type
+ * 
+ */
+final class ArrayParameterRuleImpl extends RuleBase implements
+		ArrayParameterRule, TraceModelPersistentExtension {
+
+	/**
+	 * Storage name for array parameter
+	 */
+	static final String STORAGE_NAME = "Array"; //$NON-NLS-1$
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelPersistentExtension#getData()
+	 */
+	public String getData() {
+		return ""; //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelPersistentExtension#getStorageName()
+	 */
+	public String getStorageName() {
+		return STORAGE_NAME;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelPersistentExtension#
+	 *      setData(java.lang.String)
+	 */
+	public boolean setData(String data) {
+		return true;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/AutoAddFunctionParametersRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,298 @@
+/*
+* 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:
+*
+* Trace rule for automatically adding function parameters to a trace
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import java.util.ArrayList;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorMessages;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.StringErrorParameters;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.header.ComplexHeaderRule;
+import com.nokia.tracecompiler.engine.source.TraceParameterFormattingRule;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceConstantTable;
+import com.nokia.tracecompiler.model.TraceObjectRuleCreateObject;
+import com.nokia.tracecompiler.model.TraceObjectRuleRemoveOnCreate;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SourceContext;
+import com.nokia.tracecompiler.source.SourceParameter;
+import com.nokia.tracecompiler.source.SourceParserException;
+import com.nokia.tracecompiler.source.SourceUtils;
+import com.nokia.tracecompiler.source.TypeMapping;
+
+/**
+ * Trace rule for automatically adding function parameters to a trace
+ * 
+ */
+public final class AutoAddFunctionParametersRule extends RuleBase implements
+		TraceObjectRuleCreateObject, TraceObjectRuleRemoveOnCreate {
+
+	/**
+	 * Warning about value-to-pointer conversion
+	 */
+	private static final String VALUE_TO_POINTER_WARNING = Messages
+			.getString("AutoAddFunctionParametersRule.UnrecognizedTypeWarning"); //$NON-NLS-1$
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * com.nokia.tracecompiler.model.TraceObjectRuleCreateObject#createObject()
+	 */
+	public void createObject() throws TraceCompilerException {
+		SourceContext context = TraceCompilerEngineGlobals.getSourceContextManager()
+				.getContext();
+		Trace trace = (Trace) getOwner();
+		if (context != null) {
+			boolean valid = false;
+			ArrayList<SourceParameter> list = tokenizeParameters(context);
+
+			trace.getModel().startProcessing();
+			try {
+				createParameters(trace, list);
+			} finally {
+				trace.getModel().processingComplete();
+			}
+			// At least one parameter must be parsed from source except for function entry extension
+			valid = trace.getParameterCount() > 0 || trace.getExtension(EntryTraceRule.class) != null;
+
+			if (!valid) {
+				String msg = TraceCompilerEngineErrorMessages.getErrorMessage(
+						TraceCompilerErrorCode.CANNOT_PARSE_FUNCTION_PARAMETERS,
+						null);
+				TraceCompilerEngineGlobals.getEvents().postWarningMessage(msg, trace);
+				// Removes the complex rule -> Function is not generated and
+				// source does not compile
+				trace.removeExtensions(ComplexHeaderRule.class);
+			}
+		} else {
+			String msg = TraceCompilerEngineErrorMessages.getErrorMessage(
+					TraceCompilerErrorCode.NO_CONTEXT_FOR_LOCATION, null);
+			TraceCompilerEngineGlobals.getEvents().postErrorMessage(msg, null, true);
+			// Removes the complex rule -> Function is not generated and
+			// source does not compile
+			trace.removeExtensions(ComplexHeaderRule.class);
+		}
+	}
+
+	/**
+	 * Creates the parameters to the trace
+	 * 
+	 * @param owner
+	 *            the trace
+	 * @param list
+	 *            the parameter list parsed from source
+	 * @throws TraceCompilerException 
+	 */
+	private void createParameters(Trace owner, ArrayList<SourceParameter> list) throws TraceCompilerException {
+
+		// If any of the parameters is "...", clear the whole parameter list
+		for (SourceParameter param : list) {
+			String type = param.getType();
+			if (type != null
+					&& type.equals(SourceConstants.VARIABLE_ARG_LIST_INDICATOR)) {
+				list.clear();
+				
+				
+				String msg = TraceCompilerEngineErrorMessages.getErrorMessage(
+						TraceCompilerErrorCode.VAR_ARG_LIST_PARAMETER_FOUND,
+						null);
+				TraceCompilerEngineGlobals.getEvents().postWarningMessage(msg, owner);
+				break;
+			}
+		}
+
+		StringBuilder str = new StringBuilder();
+		for (SourceParameter param : list) {
+			TraceParameter parameter = createParameter(owner, param);
+			if (parameter != null) {
+				str.append(SourceConstants.PARAMETER_SEPARATOR);
+				TraceParameterFormattingRule rule = parameter
+						.getExtension(TraceParameterFormattingRule.class);
+				if (rule != null) {
+					str.append(rule.mapNameToSource(param.getName()));
+				} else {
+					str.append(param.getName());
+				}
+			}
+			// The location will be referenced by event handlers if
+			// they need it. Otherwise it will be removed from the
+			// source
+			param.getSourceLocation().dereference();
+		}
+		// The header extension is stored in case of complex function entry
+		// trace
+		EntryTraceRule entryRule = owner.getExtension(EntryTraceRule.class);
+		ComplexHeaderRuleImpl complex = owner
+				.getExtension(ComplexHeaderRuleImpl.class);
+		if (entryRule != null && complex != null) {
+			complex.setTraceIDDefineExtension(str.toString());
+		}
+	}
+
+	/**
+	 * Processes the parameters of given source context
+	 * 
+	 * @param context
+	 *            the context
+	 * @return list of parameters
+	 * @throws TraceCompilerException 
+	 */
+	private ArrayList<SourceParameter> tokenizeParameters(SourceContext context) throws TraceCompilerException {
+		ArrayList<SourceParameter> list = new ArrayList<SourceParameter>();
+		try {
+			context.parseParameters(list);
+		} catch (SourceParserException e) {
+			TraceCompilerException exception = new TraceCompilerException(
+					TraceCompilerErrorCode.UNEXPECTED_EXCEPTION, e);
+			TraceCompilerEngineGlobals.getEvents().postError(
+					exception);
+			list = null;
+		}
+		return list;
+	}
+
+	/**
+	 * Creates a TraceParameter based on parameter parsed from source
+	 * 
+	 * @param owner
+	 *            the owning trace object
+	 * @param param
+	 *            the parameter found from source
+	 * @return the parameter
+	 */
+	private TraceParameter createParameter(Trace owner, SourceParameter param) {
+		TraceConstantTable foundTable = RuleUtils.findConstantTableByType(owner
+				.getModel(), param);
+		TraceParameter parameter = null;
+		if (foundTable == null) {
+			TypeMapping type = SourceUtils.mapSymbianTypeToParameterType(param);
+			if (type != null) {
+				if (!type.isVoid()) {
+					parameter = createParameter(owner, param, type);
+				}
+			} else {
+				StringErrorParameters params = new StringErrorParameters();
+				params.string = param.getType();
+				TraceCompilerException exception = new TraceCompilerException(
+						TraceCompilerErrorCode.INVALID_PARAMETER_TYPE,
+						params, param.getSourceLocation());
+				TraceCompilerEngineGlobals.getEvents().postError(
+						exception);
+			}
+		} else {
+			parameter = createParameter(owner, param, foundTable);
+		}
+		return parameter;
+	}
+
+	/**
+	 * Processes a non-void parameter type that was not associated with a
+	 * constant table
+	 * 
+	 * @param owner
+	 *            the owner for the parameter
+	 * @param param
+	 *            the parameter found from source
+	 * @param type
+	 *            the parameter type as parsed by source package
+	 * @return the parameter
+	 */
+	private TraceParameter createParameter(Trace owner, SourceParameter param,
+			TypeMapping type) {
+		String name = param.getName();
+		TraceParameter retval = null;
+		if (name == null || name.length() == 0) {
+			String s = TraceCompilerEngineErrorMessages.getErrorMessage(
+					TraceCompilerErrorCode.EMPTY_PARAMETER_NAME, null);
+			TraceCompilerEngineGlobals.getEvents().postWarningMessage(s,
+					param.getSourceLocation());
+		} else {
+			try {
+				retval = RuleUtils.createParameterFromType(owner, name, type);
+				if (retval != null && type.valueToPointer) {
+					// Posts a warning about value-to-pointer conversion
+					TraceCompilerEngineGlobals.getEvents()
+							.postWarningMessage(VALUE_TO_POINTER_WARNING,
+									param.getSourceLocation());
+				}
+			} catch (TraceCompilerException e) {
+				// Changes the source of the error to the location that failed
+				TraceCompilerException exception = new TraceCompilerException(e.getErrorCode(), e
+						.getErrorParameters(), param
+						.getSourceLocation());
+				TraceCompilerEngineGlobals.getEvents().postError(
+						exception);
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Processes a non-void parameter type that was associated with a constant
+	 * table
+	 * 
+	 * @param owner
+	 *            the owner for the parameter
+	 * @param param
+	 *            the parameter found from source
+	 * @param table
+	 *            the constant table the parameter was associated to
+	 * @return the parameter
+	 */
+	private TraceParameter createParameter(Trace owner, SourceParameter param,
+			TraceConstantTable table) {
+		String name = param.getName();
+		TraceParameter retval = null;
+		if (name == null || name.length() == 0) {
+			String s = TraceCompilerEngineErrorMessages.getErrorMessage(
+					TraceCompilerErrorCode.EMPTY_PARAMETER_NAME, null);
+			TraceCompilerEngineGlobals.getEvents().postWarningMessage(s,
+					param.getSourceLocation());
+		} else {
+			try {
+				retval = RuleUtils.createParameterFromConstantTable(owner,
+						name, table);
+			} catch (TraceCompilerException e) {
+				// Changes the source of the error to the location that failed
+				TraceCompilerException exception = new TraceCompilerException(e.getErrorCode(), e
+						.getErrorParameters(), param
+						.getSourceLocation());
+				TraceCompilerEngineGlobals.getEvents().postError(
+						exception);
+			}
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * com.nokia.tracecompiler.model.TraceObjectRuleRemoveOnCreate#canBeRemoved()
+	 */
+	public boolean canBeRemoved() {
+		// This is not copied to exit trace -> Can be removed
+		return true;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/AutoAddParameterRuleBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,97 @@
+/*
+* 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:
+*
+* Base class for the auto-add parameter rules
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.utils.TraceMultiplierRule;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceObjectRule;
+import com.nokia.tracecompiler.model.TraceObjectRuleCreateObject;
+import com.nokia.tracecompiler.model.TraceObjectRuleRemoveOnCreate;
+import com.nokia.tracecompiler.model.TraceObjectUtils;
+
+/**
+ * Base class for the auto-add parameter rules
+ * 
+ */
+abstract class AutoAddParameterRuleBase extends RuleBase implements
+		TraceObjectRuleCreateObject, TraceObjectRuleRemoveOnCreate {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectRuleCreateObject#createObject()
+	 */
+	public void createObject() throws TraceCompilerException {
+		TraceObjectRule rule = getRule();
+		TraceModelExtension[] extensions = null;
+		if (rule != null) {
+			extensions = new TraceModelExtension[] { rule };
+		}
+		Trace owner = (Trace) getOwner();
+		int id = owner.getNextParameterID();
+		String name = TraceObjectUtils.modifyDuplicateParameterName(owner,
+				getName()).getData();
+		String type = getType();
+		try {
+			owner.getModel().getVerifier().checkTraceParameterProperties(owner,
+					null, id, name, type);
+			owner.getModel().getFactory().createTraceParameter(owner, id, name,
+					type, extensions);
+		} catch (TraceCompilerException e) {
+			TraceCompilerEngineGlobals.getEvents().postError(e);
+				throw e;
+		}
+	}
+
+	/**
+	 * Gets the name for the new parameter
+	 * 
+	 * @return the parameter name
+	 */
+	protected abstract String getName();
+
+	/**
+	 * Gets the new parameter type
+	 * 
+	 * @return the type
+	 */
+	protected abstract String getType();
+
+	/**
+	 * Gets the rule for the parameter
+	 * 
+	 * @return the rule
+	 */
+	protected abstract TraceObjectRule getRule();
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectRuleRemoveOnCreate#canBeRemoved()
+	 */
+	public boolean canBeRemoved() {
+		// If the owner has a multiplier, this needs to be moved to it using the
+		// CopyAndRemoveExtensionRule
+		return getOwner().getExtension(TraceMultiplierRule.class) == null;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/AutoAddReturnParameterRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,188 @@
+/*
+* 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:
+*
+* Trace rule for automatically adding function return value to exit trace
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import java.util.ArrayList;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorMessages;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.utils.TraceMultiplierRule;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceConstantTable;
+import com.nokia.tracecompiler.model.TraceObjectRuleCreateObject;
+import com.nokia.tracecompiler.model.TraceObjectRuleRemoveOnCreate;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.source.SourceContext;
+import com.nokia.tracecompiler.source.SourceParserException;
+import com.nokia.tracecompiler.source.SourceReturn;
+import com.nokia.tracecompiler.source.SourceUtils;
+import com.nokia.tracecompiler.source.TypeMapping;
+
+/**
+ * Trace rule for automatically adding function return value to exit trace
+ * 
+ */
+public final class AutoAddReturnParameterRule extends RuleBase implements
+		TraceObjectRuleCreateObject, TraceObjectRuleRemoveOnCreate {
+
+	/**
+	 * Parameter name
+	 */
+	static final String PARAMETER_NAME = "retval"; //$NON-NLS-1$
+
+	/**
+	 * The number of handled return statements
+	 */
+	private static int numberOfHandledReturnStatements = 0;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectRuleCreateObject#
+	 *      createObject(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void createObject() throws TraceCompilerException {
+		// If owner has a multiplier (entry trace), the trace is not added to it
+		Trace owner = (Trace) getOwner();
+		if (owner.getExtension(TraceMultiplierRule.class) == null) {
+			SourceContext context = TraceCompilerEngineGlobals
+					.getSourceContextManager().getContext();
+			if (!context.isVoid()) {
+				TraceConstantTable table = RuleUtils.findConstantTableByType(
+						owner.getModel(), context);
+				if (table != null) {
+					createParameter(owner, table);
+				} else {
+					createParameter(owner, context);
+				}
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectRuleRemoveOnCreate#canBeRemoved()
+	 */
+	public boolean canBeRemoved() {
+		// If the owner has a multiplier, this needs to be moved to it using the
+		// CopyAndRemoveExtensionRule
+		return getOwner().getExtension(TraceMultiplierRule.class) == null;
+	}
+
+	/**
+	 * Creates a return parameter that was not associated with a constant table
+	 * 
+	 * @param owner
+	 *            the owner for the parameter
+	 * @param context
+	 *            the context specifying the parameter type 
+	 */
+	private void createParameter(Trace owner, SourceContext context) {
+		TypeMapping type = SourceUtils.mapSymbianTypeToParameterType(context);
+		String return_value_name = PARAMETER_NAME;
+		ArrayList<SourceReturn> returnList = new ArrayList<SourceReturn>();
+
+		// Find out return value name
+		try {
+			context.parseReturnValues(returnList);
+			if (numberOfHandledReturnStatements <= (returnList.size() - 1)) {
+				return_value_name = returnList.get(
+						numberOfHandledReturnStatements).getReturnStatement();
+			}
+
+			numberOfHandledReturnStatements++;
+		} catch (SourceParserException e) {
+			String msg = Messages
+					.getString("RuleUtils.FailedToParseReturnValues"); //$NON-NLS-1$
+			String cname = context.getClassName();
+			String source;
+			if (cname != null) {
+				source = cname + "::" + context.getFunctionName(); //$NON-NLS-1$;
+			} else {
+				source = context.getFunctionName();
+			}
+			TraceCompilerEngineGlobals.getEvents().postErrorMessage(msg, source, true);
+		}
+
+		try {
+			if (!type.needsCasting) {
+				// If an extension header is generated, the parameter needs to
+				// be cast, since the return statement may contain anything.
+				type.needsCasting = type.type != TraceParameter.HEX32
+						&& type.type != TraceParameter.SDEC32
+						&& type.type != TraceParameter.UDEC32;
+			}
+			RuleUtils.createParameterFromType(owner, return_value_name, type);
+
+		} catch (TraceCompilerException e) {
+
+			if (e.getErrorCode() == TraceCompilerErrorCode.INVALID_PARAMETER_NAME) {
+				String msg = TraceCompilerEngineErrorMessages
+						.getErrorMessage(
+								TraceCompilerErrorCode.INVALID_PARAMETER_NAME_IN_RETURN_VALUE,
+								null);
+
+				TraceCompilerEngineGlobals.getEvents().postWarningMessage(msg, owner);
+			} else {
+				TraceCompilerException exception = new TraceCompilerException(e.getErrorCode(), e
+						.getErrorParameters(), null);
+				TraceCompilerEngineGlobals.getEvents().postError(
+						exception);
+			}
+		}
+	}
+
+	/**
+	 * Creates a return parameter that was associated with a constant table
+	 * 
+	 * @param owner
+	 *            the owner for the parameter
+	 * @param table
+	 *            the constant table the parameter was associated to
+	 */
+	private void createParameter(Trace owner, TraceConstantTable table) {
+		try {
+			RuleUtils.createParameterFromConstantTable(owner, PARAMETER_NAME,
+					table);
+		} catch (TraceCompilerException e) {
+			TraceCompilerException exception = new TraceCompilerException(e.getErrorCode(), e
+					.getErrorParameters(), null);
+			TraceCompilerEngineGlobals.getEvents().postError(
+					exception);
+		}
+	}
+
+	/**
+	 * Reset static variables
+	 */
+	static void resetNumberOfHandledReturnStatements() {
+		numberOfHandledReturnStatements = 0;
+	}
+
+	/**
+	 * Increase number of handled return statements
+	 */
+	static void increaseNumberOfHandledReturnStatements() {
+		numberOfHandledReturnStatements++;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/AutoAddThisPtrRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Creation rule for this parameter
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceObjectRule;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.source.SourceContext;
+
+/**
+ * Creation rule for "this pointer" parameter
+ * 
+ */
+public final class AutoAddThisPtrRule extends AutoAddParameterRuleBase {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.AutoAddParameterRuleBase#createObject()
+	 */
+	@Override
+	public void createObject() throws TraceCompilerException {
+		SourceContext context = TraceCompilerEngineGlobals.getSourceContextManager()
+				.getContext();
+		if (context != null && !RuleUtils.isStaticFunction(context)) {
+			super.createObject();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.AutoAddParameterRuleBase#getName()
+	 */
+	@Override
+	protected String getName() {
+		return ThisPointerParameterTemplate.PARAMETER_NAME;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.AutoAddParameterRuleBase#getRule()
+	 */
+	@Override
+	protected TraceObjectRule getRule() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.AutoAddParameterRuleBase#getType()
+	 */
+	@Override
+	protected String getType() {
+		return TraceParameter.HEX32;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/AutoAddValueRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Creation rule for value parameter
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceObjectRule;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.source.SourceContext;
+
+/**
+ * Creation rule for "value" parameter
+ * 
+ */
+public final class AutoAddValueRule extends AutoAddParameterRuleBase {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.AutoAddParameterRuleBase#createObject()
+	 */
+	@Override
+	public void createObject() throws TraceCompilerException {
+		SourceContext context = TraceCompilerEngineGlobals.getSourceContextManager()
+				.getContext();
+		if (context != null) {
+			super.createObject();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.AutoAddParameterRuleBase#getName()
+	 */
+	@Override
+	protected String getName() {
+		return ValueParameterTemplate.PARAMETER_NAME;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.AutoAddParameterRuleBase#getRule()
+	 */
+	@Override
+	protected TraceObjectRule getRule() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.AutoAddParameterRuleBase#getType()
+	 */
+	@Override
+	protected String getType() {
+		return TraceParameter.SDEC32;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/AutomaticTraceTextRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,38 @@
+/*
+* 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:
+*
+* Rule which specifies that trace does not have user-defined text
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.source.SourceContext;
+
+/**
+ * Rule which specifies that trace does not have user-defined text
+ * 
+ */
+public abstract class AutomaticTraceTextRule extends RuleBase {
+
+	/**
+	 * Formats a trace according to given source context
+	 * 
+	 * @param context
+	 *            the context
+	 * @return the trace
+	 */
+	public abstract String formatTrace(SourceContext context);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ClassNameWrapper.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Wrapper for Class and name
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.model.TraceModelPersistentExtension;
+
+/**
+ * Wrapper for persistent extension class and name
+ * 
+ */
+class ClassNameWrapper {
+
+	/**
+	 * Constructor
+	 * 
+	 * @param name
+	 *            the name
+	 * @param clasz
+	 *            the class
+	 */
+	ClassNameWrapper(String name,
+			Class<? extends TraceModelPersistentExtension> clasz) {
+		this.name = name;
+		this.clasz = clasz;
+	}
+
+	/**
+	 * Name for the class
+	 */
+	String name;
+
+	/**
+	 * The class
+	 */
+	Class<? extends TraceModelPersistentExtension> clasz;
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ComplexHeaderRuleImpl.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,62 @@
+/*
+* 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 ComplexHeaderRule
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.header.ComplexHeaderRule;
+
+/**
+ * Implementation of ComplexHeaderRule
+ * 
+ */
+public final class ComplexHeaderRuleImpl extends RuleBase implements
+		ComplexHeaderRule {
+
+	/**
+	 * Trace ID define extension
+	 */
+	private String traceIDDefineExtension;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.header.ComplexHeaderRule#needsFunction()
+	 */
+	public boolean needsFunction() {
+		return true;
+	}
+
+	/**
+	 * Sets the data to be added to the trace ID define statement after the ID
+	 * 
+	 * @param traceIDDefineExtension
+	 *            the extension
+	 */
+	void setTraceIDDefineExtension(String traceIDDefineExtension) {
+		this.traceIDDefineExtension = traceIDDefineExtension;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.header.ComplexHeaderRule#getTraceIDDefineExtension()
+	 */
+	public String getTraceIDDefineExtension() {
+		return traceIDDefineExtension;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/EndOfFunctionLocationRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,62 @@
+/*
+* 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:
+*
+* Location rule for end of function
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.source.SourceLocationRule;
+
+/**
+ * Location rule for end of function
+ * 
+ */
+public final class EndOfFunctionLocationRule extends RuleBase implements
+		SourceLocationRule {
+
+	/**
+	 * Location rule offset. Should be large enough to cover a function
+	 */
+	private static final int OFFSET = 100000; // CodForChk_Dis_Magic
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceLocationRule#getType()
+	 */
+	public int getLocationType() {
+		return SourceLocationRule.CONTEXT_RELATIVE;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceLocationRule#getOffset()
+	 */
+	public int getLocationOffset() {
+		return OFFSET;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceLocationRule#isRemovedAfterInsert()
+	 */
+	public boolean isRemovedAfterInsert() {
+		return true;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/EntryTraceRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,41 @@
+/*
+* 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:
+*
+* Rule for entry traces
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.utils.TraceUtils;
+import com.nokia.tracecompiler.source.SourceContext;
+
+/**
+ * Rule for entry traces
+ * 
+ */
+public class EntryTraceRule extends AutomaticTraceTextRule {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.AutomaticTraceTextRule#
+	 *      formatTrace(com.nokia.tracecompiler.source.SourceContext)
+	 */
+	@Override
+	public String formatTrace(SourceContext context) {
+		return TraceUtils.formatTrace(RuleUtils.TEXT_FORMAT_BASE, context
+				.getClassName(), context.getFunctionName());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ExitTracePropertyBuilder.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,45 @@
+/*
+* 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:
+*
+* Creates exit traces from entry traces
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+/**
+ * Creates exit traces from entry traces
+ * 
+ */
+interface ExitTracePropertyBuilder {
+
+	/**
+	 * Gets the name for exit trace
+	 * 
+	 * @param entryName
+	 *            name of the entry trace
+	 * @return the name for exit trace
+	 */
+	String createExitName(String entryName);
+
+	/**
+	 * Gets the exit trace text based on entry trace
+	 * 
+	 * @param entryText
+	 *            entry trace text
+	 * @return the text for exit trace
+	 */
+	String createExitText(String entryText);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ExitTraceRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,42 @@
+/*
+* 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:
+*
+* Rule for exit traces
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.utils.TraceUtils;
+import com.nokia.tracecompiler.source.SourceContext;
+
+/**
+ * Rule for exit traces
+ * 
+ */
+public class ExitTraceRule extends AutomaticTraceTextRule {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.AutomaticTraceTextRule#
+	 *      formatTrace(com.nokia.tracecompiler.source.SourceContext)
+	 */
+	@Override
+	public String formatTrace(SourceContext context) {
+		return TraceUtils.formatTrace(RuleUtils.TEXT_FORMAT_BASE, context
+				.getClassName(), context.getFunctionName());
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ExtensionBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,54 @@
+/*
+* 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:
+*
+* Base class for model extensions
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceObject;
+
+/**
+ * Base class for model extensions
+ * 
+ */
+public class ExtensionBase implements TraceModelExtension {
+
+	/**
+	 * The owning trace object
+	 */
+	private TraceObject owner;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtension#
+	 *      setOwner(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void setOwner(TraceObject owner) {
+		this.owner = owner;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtension#getOwner()
+	 */
+	public TraceObject getOwner() {
+		return owner;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/FillerParameterRuleImpl.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Filler parameter rule implementation
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.rules.FillerParameterRule;
+
+/**
+ * Filler parameter rule implementation. This returns false from isShownInSource
+ * 
+ */
+final class FillerParameterRuleImpl extends TraceParameterFormattingRuleBase
+		implements FillerParameterRule {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.TraceParameterFormattingRule#isShownInSource()
+	 */
+	@Override
+	public boolean isShownInSource() {
+		return false;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/Messages.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,64 @@
+/*
+* 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:
+*
+* Localized strings for rules package
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Localized strings for rules package
+ * 
+ */
+class Messages {
+
+	/**
+	 * Bundle name
+	 */
+	private static final String BUNDLE_NAME = "com.nokia.tracecompiler.engine.rules.messages"; //$NON-NLS-1$
+
+	/**
+	 * Bundle
+	 */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Prevents construction
+	 */
+	private Messages() {
+
+	}
+
+	/**
+	 * Gets localized string based on key
+	 * 
+	 * @param key
+	 *            the resource key
+	 * @return the localized resource
+	 */
+	public static String getString(String key) {
+		String value;
+		try {
+			value = RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			value = '!' + key + '!';
+		}
+		return value;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ParameterTypeMappingRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,145 @@
+/*
+* 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:
+*
+* Trace parameter rule for adding casting and pointer operations to source code
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.model.TraceModelPersistentExtension;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SourceUtils;
+import com.nokia.tracecompiler.source.TypeMapping;
+
+/**
+ * Trace parameter rule for adding casting and pointer operations to source code
+ * 
+ */
+final class ParameterTypeMappingRule extends TraceParameterFormattingRuleBase
+		implements TraceModelPersistentExtension {
+
+	/**
+	 * TTime.Int64() function
+	 */	
+	private static final String INT64_FUNCTION = ".Int64()"; //$NON-NLS-1$
+
+	/**
+	 * The type mapping
+	 */
+	private TypeMapping typeMapping;
+
+	/**
+	 * Storage name for this parameter
+	 */
+	static String STORAGE_NAME = "TypeMapping"; //$NON-NLS-1$
+
+	/**
+	 * Constructor for reflection
+	 */
+	ParameterTypeMappingRule() {
+		typeMapping = new TypeMapping(null);
+	}
+
+	/**
+	 * Creates a new type mapping rule
+	 * 
+	 * @param mapping
+	 *            the type mapping to be used
+	 */
+	ParameterTypeMappingRule(TypeMapping mapping) {
+		this.typeMapping = mapping;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.TraceParameterFormattingRuleBase#
+	 *      mapNameToSource(java.lang.String)
+	 */
+	@Override
+	public String mapNameToSource(String originalName) {
+		StringBuffer source = new StringBuffer();
+		if (typeMapping.type.equals(TraceParameter.TIME)) {
+			source.append(originalName);
+			source.append(INT64_FUNCTION);
+		} else {
+			if (typeMapping.needsCasting) {
+				source.append(SourceConstants.START_PARAMETERS);
+				TraceParameter param = (TraceParameter) getOwner();
+				source.append(SourceUtils.mapParameterTypeToSymbianType(param));
+				source.append(SourceConstants.END_PARAMETERS);
+			}
+			if (typeMapping.valueToPointer) {
+				source.append('&');
+			}
+			source.append(SourceConstants.START_PARAMETERS);
+			source.append(originalName);
+			source.append(SourceConstants.END_PARAMETERS);
+		}
+		return source.toString();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelPersistentExtension#getData()
+	 */
+	public String getData() {
+		StringBuffer sb = new StringBuffer();
+		if (typeMapping.needsCasting) {
+			sb.append('C');
+		}
+		if (typeMapping.valueToPointer) {
+			sb.append('V');
+		}
+		return sb.toString();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelPersistentExtension#getStorageName()
+	 */
+	public String getStorageName() {
+		return STORAGE_NAME;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelPersistentExtension#setData(java.lang.String)
+	 */
+	public boolean setData(String data) {
+		boolean retval = false;
+		if (data != null) {
+			for (int i = 0; i < data.length(); i++) {
+				char c = data.charAt(i);
+				switch (c) {
+				case 'C':
+					typeMapping.needsCasting = true;
+					retval = true;
+					break;
+				case 'V':
+					typeMapping.valueToPointer = true;
+					retval = true;
+					break;
+				}
+			}
+		}
+		return retval;
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/PerformanceEventRuleBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Base class for performance event rules
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+
+/**
+ * Base class for performance event rules
+ * 
+ */
+public class PerformanceEventRuleBase extends RuleBase {
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/PerformanceEventStartRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Rule for performance timer entry trace
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+
+/**
+ * Rule for performance timer entry trace
+ * 
+ */
+public class PerformanceEventStartRule extends PerformanceEventRuleBase {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/PerformanceEventStopRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,26 @@
+/*
+* 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:
+*
+* Performance timer exit trace rule
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+/**
+ * Performance timer exit trace rule
+ * 
+ */
+public final class PerformanceEventStopRule extends PerformanceEventRuleBase {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ReadOnlyObjectRuleImpl.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,30 @@
+/*
+* 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:
+*
+* Read-only rule implementation
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.rules.ReadOnlyObjectRule;
+
+/**
+ * Read-only rule implementation
+ * 
+ */
+public final class ReadOnlyObjectRuleImpl extends RuleBase implements
+		ReadOnlyObjectRule {
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RuleBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Base class for rules
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.model.TraceObjectRule;
+
+/**
+ * Base class for rules
+ * 
+ */
+public class RuleBase extends ExtensionBase implements TraceObjectRule {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RuleUtils.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,320 @@
+/*
+ * 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:
+ *
+ * Utility functions for rules package
+ *
+ */
+package com.nokia.tracecompiler.engine.rules;
+
+import java.util.Iterator;
+import java.util.List;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineConfiguration;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceConstantTable;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceObjectUtils;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.source.ParsedType;
+import com.nokia.tracecompiler.source.SourceContext;
+import com.nokia.tracecompiler.source.SourceParserException;
+import com.nokia.tracecompiler.source.SourceReturn;
+import com.nokia.tracecompiler.source.TypeMapping;
+
+/**
+ * Utility functions for rules package
+ * 
+ */
+public final class RuleUtils {
+
+	/**
+	 * Entry-exit template
+	 */
+	public static final int TYPE_ENTRY_EXIT = 0; // CodForChk_Dis_Magic
+
+	/**
+	 * Start-stop event template
+	 */
+	public static final int TYPE_PERF_EVENT = 1; // CodForChk_Dis_Magic
+
+	/**
+	 * State trace template
+	 */
+	public static final int TYPE_STATE_TRACE = 2; // CodForChk_Dis_Magic
+
+	/**
+	 * Trace name format base
+	 */
+	static final String NAME_FORMAT_BASE = "{$CN}_{$FN}"; //$NON-NLS-1$
+
+	/**
+	 * Trace text format base
+	 */
+	static final String TEXT_FORMAT_BASE = "{$cn}::{$fn}"; //$NON-NLS-1$
+
+	/**
+	 * Template titles
+	 */
+	private static final String[] ENTRY_TEMPLATE_TITLES = {
+			Messages.getString("RuleUtils.FunctionEntryTitle"), //$NON-NLS-1$
+			Messages.getString("RuleUtils.PerformanceEventTitle"), //$NON-NLS-1$
+			Messages.getString("RuleUtils.StateTraceTitle"), //$NON-NLS-1$
+	};
+
+	/**
+	 * Entry name prefixes
+	 */
+	public static final String[] ENTRY_NAME_PREFIXES = { "", //$NON-NLS-1$
+			"EVENT_", //$NON-NLS-1$
+			"STATE_" //$NON-NLS-1$
+	};
+
+	/**
+	 * Entry name suffixes
+	 */
+	public static final String[] ENTRY_NAME_SUFFIXES = { "_ENTRY", //$NON-NLS-1$
+			"_START", //$NON-NLS-1$
+			"" //$NON-NLS-1$
+	};
+
+	/**
+	 * Exit name prefixes
+	 */
+	private static final String[] EXIT_NAME_PREFIXES = { "", //$NON-NLS-1$
+			"EVENT_", //$NON-NLS-1$
+			"" //$NON-NLS-1$
+	};
+
+	/**
+	 * Exit name suffixes
+	 */
+	public static final String[] EXIT_NAME_SUFFIXES = { "_EXIT", //$NON-NLS-1$
+			"_STOP", //$NON-NLS-1$
+			"" //$NON-NLS-1$
+	};
+
+	/**
+	 * Gets an entry template title
+	 * 
+	 * @param type
+	 *            the template type
+	 * @return the template title
+	 */
+	static String getEntryTemplateTitle(int type) {
+		return ENTRY_TEMPLATE_TITLES[type];
+	}
+
+	/**
+	 * Creates exit name from entry name
+	 * 
+	 * @param entryName
+	 *            the entry name
+	 * @param type
+	 *            the type of entry
+	 * @return the exit name
+	 */
+	static String createExitName(String entryName, int type) {
+		// Strips the duplicate modifier from the name
+		entryName = TraceObjectUtils.removeDuplicateModifier(entryName);
+		StringBuffer sb = new StringBuffer();
+		if (entryName.startsWith(ENTRY_NAME_PREFIXES[type])) {
+			entryName = entryName.substring(ENTRY_NAME_PREFIXES[type].length());
+		}
+		if (entryName.endsWith(ENTRY_NAME_SUFFIXES[type])) {
+			entryName = entryName.substring(0, entryName.length()
+					- ENTRY_NAME_SUFFIXES[type].length());
+		}
+		sb.append(EXIT_NAME_PREFIXES[type]);
+		sb.append(entryName);
+		sb.append(EXIT_NAME_SUFFIXES[type]);
+		return sb.toString();
+	}
+
+	/**
+	 * Creates an entry trace name format from type
+	 * 
+	 * @param type
+	 *            the trace format type
+	 * @return the trace name format
+	 */
+	public static String createEntryTraceNameFormat(int type) {
+		StringBuffer sb = new StringBuffer();
+		if (type == TYPE_PERF_EVENT || type == TYPE_STATE_TRACE) {
+			sb.append(NAME_FORMAT_BASE);
+		} else {
+			sb.append(ENTRY_NAME_PREFIXES[type]);
+			sb.append(NAME_FORMAT_BASE);
+			sb.append(ENTRY_NAME_SUFFIXES[type]);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Creates an exit trace name format based on type
+	 * 
+	 * @param type
+	 *            the format type
+	 * @return the trace name format
+	 */
+	public static String createExitTraceNameFormat(int type) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(EXIT_NAME_PREFIXES[type]);
+		sb.append(NAME_FORMAT_BASE);
+		sb.append(EXIT_NAME_SUFFIXES[type]);
+		return sb.toString();
+	}
+
+	/**
+	 * Gets the return statements from current context from the context manager.
+	 * 
+	 * @param returnStatements
+	 *            the list where the return statements are stored
+	 */
+	static void getCurrentContextReturns(List<SourceReturn> returnStatements) {
+		SourceContext context = TraceCompilerEngineGlobals.getSourceContextManager()
+				.getContext();
+		if (context != null) {
+			try {
+				context.parseReturnValues(returnStatements);
+			} catch (SourceParserException e) {
+				String msg = Messages
+						.getString("RuleUtils.FailedToParseReturnValues"); //$NON-NLS-1$
+				String cname = context.getClassName();
+				String source;
+				if (cname != null) {
+					source = cname + "::" + context.getFunctionName(); //$NON-NLS-1$;
+				} else {
+					source = context.getFunctionName();
+				}
+				TraceCompilerEngineGlobals.getEvents().postErrorMessage(msg, source,
+						true);
+			}
+		} else {
+			if (TraceCompilerEngineConfiguration.ASSERTIONS_ENABLED) {
+				TraceCompilerEngineGlobals.getEvents().postAssertionFailed(
+						"Function return not in function", null); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * Checks if the function is static. Currently this is just dummy, checking
+	 * that the class name exists and the function name is not New / NewL /
+	 * NewLC
+	 * 
+	 * @param context
+	 *            the context to be checked
+	 * @return true if static, false if not
+	 */
+	static boolean isStaticFunction(SourceContext context) {
+		boolean retval;
+		if (context.getClassName() == null) {
+			retval = true;
+		} else {
+			String fname = context.getFunctionName();
+			if (fname.equals("New") //$NON-NLS-1$
+					|| fname.equals("NewL") //$NON-NLS-1$
+					|| fname.equals("NewLC") //$NON-NLS-1$
+			) {
+				retval = true;
+			} else {
+				retval = false;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Locates a constant table based on type definition parsed from source
+	 * 
+	 * @param model
+	 *            the trace model
+	 * @param type
+	 *            the parameter type
+	 * @return the constant table or null if not found
+	 */
+	static TraceConstantTable findConstantTableByType(TraceModel model,
+			ParsedType type) {
+		Iterator<TraceConstantTable> tables = model.getConstantTables();
+		TraceConstantTable foundTable = null;
+		while (tables.hasNext() && foundTable == null) {
+			TraceConstantTable table = tables.next();
+			if (type.typeEquals(table.getName())) {
+				foundTable = table;
+			}
+		}
+		return foundTable;
+	}
+
+	/**
+	 * Creates a parameter based on TypeMapping definition
+	 * 
+	 * @param owner
+	 *            the parameter owner
+	 * @param name
+	 *            the parameter name
+	 * @param type
+	 *            the type mapping
+	 * @return the parameter
+	 * @throws TraceCompilerException
+	 *             if parameter cannot be created
+	 */
+	static TraceParameter createParameterFromType(Trace owner, String name,
+			TypeMapping type) throws TraceCompilerException {
+		int id = owner.getNextParameterID();
+		owner.getModel().getVerifier().checkTraceParameterProperties(owner,
+				null, id, name, type.type);
+		TraceModelExtension[] extensions = null;
+		if (type.needsCasting || type.valueToPointer
+				|| type.type.equals(TraceParameter.TIME)) {
+			extensions = new TraceModelExtension[1];
+			extensions[0] = new ParameterTypeMappingRule(type);
+		}
+		TraceParameter parameter = owner.getModel().getFactory()
+				.createTraceParameter(owner, id, name, type.type, extensions);
+		return parameter;
+	}
+
+	/**
+	 * Creates a parameter object from constant table
+	 * 
+	 * @param owner
+	 *            the parameter owner
+	 * @param name
+	 *            the name for the parameter
+	 * @param table
+	 *            the constant table
+	 * @return the parameter
+	 * @throws TraceCompilerException
+	 *             if parameter cannot be created
+	 */
+	static TraceParameter createParameterFromConstantTable(Trace owner,
+			String name, TraceConstantTable table) throws TraceCompilerException {
+		int id = owner.getNextParameterID();
+		owner.getModel().getVerifier().checkTraceParameterProperties(owner,
+				null, id, name, table.getType());
+		// Constant tables need a cast to constant table type
+		TypeMapping type = new TypeMapping(table.getType());
+		type.needsCasting = true;
+		TraceModelExtension[] extensions = new TraceModelExtension[1];
+		extensions[0] = new ParameterTypeMappingRule(type);
+		return owner.getModel().getFactory().createTraceParameter(owner, id,
+				name, table.getName(), extensions);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEngine.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,383 @@
+/*
+* 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 TraceObjectRuleFactory interface
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineConfiguration;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineConfigurationListener;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.header.ComplexHeaderRule;
+import com.nokia.tracecompiler.engine.rules.osttrace.OstTraceFormatRule;
+import com.nokia.tracecompiler.engine.source.SourceParserRule;
+import com.nokia.tracecompiler.engine.source.TraceParameterFormattingRule;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceModelListener;
+import com.nokia.tracecompiler.model.TraceModelPersistentExtension;
+import com.nokia.tracecompiler.model.TraceModelResetListener;
+import com.nokia.tracecompiler.model.TraceObject;
+import com.nokia.tracecompiler.model.TraceObjectRuleFactory;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.project.TraceProjectAPI;
+import com.nokia.tracecompiler.rules.FillerParameterRule;
+import com.nokia.tracecompiler.source.SourceUtils;
+
+/**
+ * Provides rules for trace objects.
+ * 
+ */
+public class RulesEngine implements TraceObjectRuleFactory {
+
+	/**
+	 * Number of parameters in a simple trace
+	 */
+	private static final int SIMPLE_TRACE_MAX_PARAMETER_COUNT = 1;
+
+	/**
+	 * Trace model listener updates the fillers and complex type flagging when
+	 * traces and parameters are modified
+	 */
+	private TraceModelListener modelListener;
+
+	/**
+	 * Trace model reset listener uses modelValid to update the complex header
+	 * rules
+	 */
+	private TraceModelResetListener resetListener;
+
+	/**
+	 * Manager for plug-in API's
+	 */
+	private RulesEnginePluginManager pluginManager;
+
+	/**
+	 * Configuration listener for source format changes
+	 */
+	private TraceCompilerEngineConfigurationListener configurationListener = new RulesEngineConfigurationListener(
+			this);
+
+	/**
+	 * Trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * Constructor
+	 */
+	public RulesEngine() {
+		TraceCompilerEngineGlobals.getConfiguration().addConfigurationListener(
+				configurationListener);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectRuleFactory#
+	 *      createExtension(com.nokia.tracecompiler.model.TraceObject,
+	 *      java.lang.String)
+	 */
+	public TraceModelPersistentExtension createExtension(TraceObject target,
+			String name) {
+		TraceModelPersistentExtension retval = null;
+		ClassNameWrapper[] table = RulesEngineConstants.PERSISTENT_EXTENSIONS;
+		for (int i = 0; i < table.length && retval == null; i++) {
+			if (name.equals(table[i].name)) {
+				retval = createPersistentExtensionAt(target, i);
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Creates a persistent extension
+	 * 
+	 * @param target
+	 *            the target object
+	 * @param i
+	 *            index to the persistent extensions array
+	 * @return the extension
+	 */
+	private TraceModelPersistentExtension createPersistentExtensionAt(
+			TraceObject target, int i) {
+		ClassNameWrapper wrapper = RulesEngineConstants.PERSISTENT_EXTENSIONS[i];
+		TraceModelPersistentExtension retval = null;
+		TraceModelPersistentExtension o = target.getExtension(wrapper.clasz);
+		if (o == null) {
+			try {
+				retval = wrapper.clasz.newInstance();
+			} catch (Exception e) {
+				if (TraceCompilerEngineConfiguration.ASSERTIONS_ENABLED) {
+					TraceCompilerEngineGlobals.getEvents().postAssertionFailed(
+							"Invalid extension - " + wrapper.name, null); //$NON-NLS-1$
+				}
+			}
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectRuleFactory#
+	 *      preProcessNewRules(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void preProcessNewRules(TraceObject object) {
+		if (object instanceof TraceModel) {
+			// NOTE: This is only called once when builder is started
+			// There is no cleanup code
+			this.model = (TraceModel) object;
+			modelListener = new RulesEngineModelListener(this);
+			resetListener = new RulesEngineResetListener(this, model);
+			model.addModelListener(modelListener);
+			model.addResetListener(resetListener);
+			// Adds the plug-in trace parser / formatter manager to the model as
+			// extension. The plug-in manager delegates the formatters and
+			// parsers to this object when plug-in components register to
+			// TraceCompiler.
+			pluginManager = new RulesEnginePluginManager(this);
+			model.addExtension(pluginManager);
+			createTraceParsers();
+			createTraceAPIs();
+		}
+	}
+
+	/**
+	 * Creates the trace parsers and stores them to the model
+	 */
+	private void createTraceParsers() {
+		for (SourceParserRule element : RulesEngineConstants.TRACE_PARSERS) {
+			// Creates all source parsers specified in the constants
+			model.addExtension(element);
+		}
+	}
+
+	/**
+	 * Creates the default trace API's and adds them to the plug-in manager
+	 */
+	private void createTraceAPIs() {
+		for (TraceProjectAPI api : RulesEngineConstants.TRACE_APIS) {
+			pluginManager.addAPI(api);
+		}
+	}
+
+	/**
+	 * Creates the trace formatter and stores it to the model
+	 */
+	void setDefaultTraceAPI() {
+		// If the formatter did not exist in the project file, it is added based
+		// on the configuration default
+		if (model.getExtension(TraceProjectAPI.class) == null) {
+			String api = TraceCompilerEngineGlobals.getConfiguration().getText(
+					TraceCompilerEngineConfiguration.FORMATTER_NAME);
+			traceAPIChanged(api);
+		}
+	}
+
+	/**
+	 * API change notification
+	 * 
+	 * @param apiName
+	 *            the name of new api
+	 */
+	void traceAPIChanged(String apiName) {
+		TraceProjectAPI api = model.getExtension(TraceProjectAPI.class);
+		boolean found = false;
+		if (api != null) {
+			if (api.getName().equals(apiName)) {
+				found = true;
+			} else {
+				model.removeExtension(api);
+			}
+		}
+		if (!found) {
+			changeTraceAPI(apiName);
+		}
+	}
+
+	/**
+	 * Creates a trace API
+	 * 
+	 * @param apiName
+	 *            the name of the API to be created
+	 */
+	void changeTraceAPI(String apiName) {
+		if (apiName == null || apiName.length() == 0) {
+			apiName = OstTraceFormatRule.STORAGE_NAME;
+		}
+		Iterator<TraceProjectAPI> apis = pluginManager.getAPIs();
+		boolean apifound = false;
+		while (apis.hasNext()) {
+			TraceProjectAPI api = apis.next();
+			if (api.getName().equals(apiName)) {
+				model.addExtension(api);
+				apifound = true;
+			}
+		}
+		if (!apifound) {
+			// If API from configuration was not found, the first one is used
+			apis = pluginManager.getAPIs();
+			if (apis.hasNext()) {
+				model.addExtension(apis.next());
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectRuleFactory#
+	 *      postProcessNewRules(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void postProcessNewRules(TraceObject object) {
+	}
+
+	/**
+	 * Checks the count and types of parameters of given trace and flags it with
+	 * ComplexParameterRule if necessary
+	 * 
+	 * @param trace
+	 *            the trace
+	 */
+	void checkParameterTypes(Trace trace) {
+		// When converting traces from source, the converter takes care of
+		// flagging the traces as complex. The complex flag needs to be checked
+		// when trace are modified via UI
+		if (!TraceCompilerEngineGlobals.getSourceContextManager().isConverting()) {
+			boolean complex = false;
+			int count = trace.getParameterCount();
+			Iterator<TraceParameter> itr = trace.getParameters();
+			while (itr.hasNext() && !complex) {
+				TraceParameter parameter = itr.next();
+				TraceParameterFormattingRule rule = parameter
+						.getExtension(TraceParameterFormattingRule.class);
+				boolean isShown = true;
+				if (rule != null && !rule.isShownInSource()) {
+					isShown = false;
+				}
+				if (isShown) {
+					complex = !SourceUtils.isSimpleType(parameter);
+				} else {
+					count--;
+				}
+			}
+			// Any trace with more than one parameter is a complex trace
+			if (!complex && count > SIMPLE_TRACE_MAX_PARAMETER_COUNT) {
+				complex = true;
+			}
+			ComplexHeaderRule rule = trace
+					.getExtension(ComplexHeaderRule.class);
+			if (complex && rule == null) {
+				trace.addExtension(new ComplexHeaderRuleImpl());
+			} else if (!complex && rule != null) {
+				trace.removeExtension(rule);
+			}
+		}
+	}
+
+	/**
+	 * Adds fillers to align trace parameters to 32-bit boundaries.
+	 * 
+	 * @param trace
+	 *            the trace to be updated
+	 * @throws TraceCompilerException 
+	 */
+	void checkFillerParameters(Trace trace) throws TraceCompilerException {
+		// Flags the model so listeners don't perform intermediate updates
+		trace.getModel().startProcessing();
+		try {
+			// Removes all existing fillers
+			for (int i = 0; i < trace.getParameterCount(); i++) {
+				TraceParameter parameter = trace.getParameter(i);
+				if (parameter.getExtension(FillerParameterRule.class) != null) {
+					trace.removeParameterAt(i);
+					i--;
+				}
+			}
+			int bytesInBlock = 0;
+			int parameterIndex = 0;
+			for (; parameterIndex < trace.getParameterCount(); parameterIndex++) {
+				TraceParameter parameter = trace.getParameter(parameterIndex);
+				int paramSize = SourceUtils.mapParameterTypeToSize(parameter);
+				// Parameters are aligned to 32 bits. Parameter after
+				// end-of-string is aligned dynamically and thus no filler is
+				// created for it
+				if (paramSize == 0 || paramSize == 4 || paramSize == 8) { // CodForChk_Dis_Magic
+					if (bytesInBlock > 0) {
+						int fillerCount = 4 - bytesInBlock; // CodForChk_Dis_Magic
+						for (int i = 0; i < fillerCount; i++) {
+							createFillerParameter(trace, parameterIndex++);
+						}
+						bytesInBlock = 0;
+					}
+				} else if (paramSize == 2) { // CodForChk_Dis_Magic
+					if (bytesInBlock == 1 || bytesInBlock == 3) { // CodForChk_Dis_Magic
+						createFillerParameter(trace, parameterIndex++);
+						// If there was 1 existing byte and filler was added,
+						// the number of bytes in the block is now 4 including
+						// the 2-byte parameter. If there was 3 bytes, the
+						// filler brings it to 4 and the 16-bit parameter
+						// changes it to 2
+						bytesInBlock += 3; // CodForChk_Dis_Magic
+					} else {
+						bytesInBlock += 2; // CodForChk_Dis_Magic
+					}
+					if (bytesInBlock >= 4) { // CodForChk_Dis_Magic
+						bytesInBlock -= 4; // CodForChk_Dis_Magic
+					}
+				} else {
+					bytesInBlock++;
+					if (bytesInBlock == 4) { // CodForChk_Dis_Magic
+						bytesInBlock = 0;
+					}
+				}
+			}
+			// Adds fillers also the the end of the parameter list
+			if (bytesInBlock > 0) {
+				int fillerCount = 4 - bytesInBlock; // CodForChk_Dis_Magic
+				for (int i = 0; i < fillerCount; i++) {
+					createFillerParameter(trace, parameterIndex++);
+				}
+				bytesInBlock = 0;
+			}
+		} finally {
+			trace.getModel().processingComplete();
+		}
+	}
+
+	/**
+	 * Creates a filler parameter
+	 * 
+	 * @param trace
+	 *            the trace for the parameter
+	 * @param parameterIndex
+	 *            the index where the filler is inserted
+	 * @throws TraceCompilerException 
+	 */
+	private void createFillerParameter(Trace trace, int parameterIndex) throws TraceCompilerException {
+		trace.getModel().getFactory().createTraceParameter(parameterIndex,
+				trace, trace.getParameterCount(),
+				"Filler", //$NON-NLS-1$
+				TraceParameter.HEX8,
+				new TraceModelExtension[] { new FillerParameterRuleImpl() });
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEngineConfigurationListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,58 @@
+/*
+* 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:
+*
+* Configuration listener
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineConfiguration;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineConfigurationListener;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+
+/**
+ * Configuration listener for rule engine monitors the trace formatting
+ * 
+ */
+final class RulesEngineConfigurationListener implements
+		TraceCompilerEngineConfigurationListener {
+
+	/**
+	 * Rules engine
+	 */
+	private RulesEngine engine;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param engine
+	 *            the rules engine
+	 */
+	RulesEngineConfigurationListener(RulesEngine engine) {
+		this.engine = engine;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerConfigurationListener#configurationCreated()
+	 */
+	public void configurationCreated() {
+		if (TraceCompilerEngineConfiguration.ALLOW_FORMAT_CHANGE) {
+			engine.traceAPIChanged(TraceCompilerEngineGlobals.getConfiguration()
+					.getText(TraceCompilerEngineConfiguration.FORMATTER_NAME));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEngineConstants.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,58 @@
+/*
+* 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:
+*
+* Properties associated with formatting rules
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.rules.osttrace.OstTraceFormatRule;
+import com.nokia.tracecompiler.engine.rules.osttrace.OstTraceParserRule;
+import com.nokia.tracecompiler.engine.source.SourceParserRule;
+import com.nokia.tracecompiler.project.TraceProjectAPI;
+
+/**
+ * Constants for rules engine
+ * 
+ */
+interface RulesEngineConstants {
+
+	/**
+	 * Trace parsers
+	 */
+	SourceParserRule[] TRACE_PARSERS = { new OstTraceParserRule() };
+
+	/**
+	 * Printf parsers
+	 */
+	String[] PRINTF_PARSERS = { "RDebug::Print", //$NON-NLS-1$
+			"Kern::Printf" //$NON-NLS-1$
+	};
+
+	/**
+	 * List of supported API's
+	 */
+	TraceProjectAPI[] TRACE_APIS = { new OstTraceFormatRule() };
+
+	/**
+	 * Persistent extensions
+	 */
+	ClassNameWrapper[] PERSISTENT_EXTENSIONS = {
+			new ClassNameWrapper(ParameterTypeMappingRule.STORAGE_NAME,
+					ParameterTypeMappingRule.class),
+			new ClassNameWrapper(ArrayParameterRuleImpl.STORAGE_NAME,
+					ArrayParameterRuleImpl.class) };
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEngineModelListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,119 @@
+/*
+* 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:
+*
+* Trace model listener
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModelListener;
+import com.nokia.tracecompiler.model.TraceObject;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.rules.FillerParameterRule;
+
+/**
+ * Trace model listener
+ * 
+ */
+final class RulesEngineModelListener implements TraceModelListener {
+
+	/**
+	 * Rules engine
+	 */
+	private final RulesEngine engine;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param engine
+	 *            rules engine
+	 */
+	RulesEngineModelListener(RulesEngine engine) {
+		this.engine = engine;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      objectAdded(com.nokia.tracecompiler.model.TraceObject,
+	 *      com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectAdded(TraceObject owner, TraceObject object) {
+		// Updated in objectCreationComplete
+	}
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#objectRemoved(com.nokia.tracecompiler.model.TraceObject, com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectRemoved(TraceObject owner, TraceObject object) throws TraceCompilerException {
+		if (owner instanceof Trace && object instanceof TraceParameter) {
+			engine.checkParameterTypes((Trace) owner);
+			if (object.getExtension(FillerParameterRule.class) == null) {
+				engine.checkFillerParameters((Trace) owner);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      propertyUpdated(com.nokia.tracecompiler.model.TraceObject, int)
+	 */
+	public void propertyUpdated(TraceObject object, int property) throws TraceCompilerException {
+		if (object.getModel().isValid() && object.isComplete()
+				&& object instanceof TraceParameter
+				&& property == TraceModelListener.TYPE) {
+			Trace owner = ((TraceParameter) object).getTrace();
+			if (owner.isComplete()) {
+				engine.checkParameterTypes(owner);
+				engine.checkFillerParameters(owner);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      objectCreationComplete(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectCreationComplete(TraceObject object) throws TraceCompilerException {
+		if (object.getModel().isValid()) {
+			if (object instanceof TraceParameter) {
+				Trace owner = ((TraceParameter) object).getTrace();
+				if (owner.isComplete()) {
+					engine.checkParameterTypes(owner);
+					// When adding fillers, the check is not done
+					if (object.getExtension(FillerParameterRule.class) == null) {
+						engine.checkFillerParameters(owner);
+					}
+				}
+			} else if (object instanceof Trace) {
+				// When a trace with multiple parameters is created, the
+				// above branch does not get entered since the trace is not
+				// yet complete. Check is made after trace is complete
+				if (((Trace) object).getParameterCount() > 0) {
+					engine.checkParameterTypes((Trace) object);
+					engine.checkFillerParameters((Trace) object);
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEnginePluginManager.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,129 @@
+/*
+* 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:
+*
+* Plug-in formatter / parser management
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.engine.plugin.TraceAPIPluginManager;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.model.TraceObject;
+import com.nokia.tracecompiler.plugin.TraceAPIFormatter;
+import com.nokia.tracecompiler.plugin.TraceAPIParser;
+import com.nokia.tracecompiler.project.TraceProjectAPI;
+import com.nokia.tracecompiler.project.TraceProjectAPIList;
+
+/**
+ * Plug-in formatter / parser management
+ * 
+ */
+final class RulesEnginePluginManager implements TraceAPIPluginManager,
+		TraceProjectAPIList {
+
+	/**
+	 * Rules engine
+	 */
+	private RulesEngine engine;
+
+	/**
+	 * Trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * List of API's
+	 */
+	private ArrayList<TraceProjectAPI> apis = new ArrayList<TraceProjectAPI>();
+
+	/**
+	 * Constructor
+	 * 
+	 * @param engine
+	 *            the plug-in engine
+	 */
+	RulesEnginePluginManager(RulesEngine engine) {
+		this.engine = engine;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.plugin.TraceAPIPluginManager#
+	 *      addFormatters(com.nokia.tracecompiler.plugin.TraceAPIFormatter[])
+	 */
+	public void addFormatters(TraceAPIFormatter[] formatters) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.plugin.TraceAPIPluginManager#
+	 *      addParsers(com.nokia.tracecompiler.plugin.TraceAPIParser[])
+	 */
+	public void addParsers(TraceAPIParser[] parsers) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.plugin.TraceAPIPluginManager#createDefaultAPI()
+	 */
+	public void createDefaultAPI() {
+		engine.setDefaultTraceAPI();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtension#getOwner()
+	 */
+	public TraceObject getOwner() {
+		return model;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtension#
+	 *      setOwner(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void setOwner(TraceObject owner) {
+		model = (TraceModel) owner;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectAPIList#getAPIs()
+	 */
+	public Iterator<TraceProjectAPI> getAPIs() {
+		return apis.iterator();
+	}
+
+	/**
+	 * Adds an API to the list
+	 * 
+	 * @param api
+	 *            the API
+	 */
+	void addAPI(TraceProjectAPI api) {
+		apis.add(api);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEngineResetListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,96 @@
+/*
+* 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:
+*
+* Model reset listener
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceGroup;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.model.TraceModelResetListener;
+import com.nokia.tracecompiler.project.TraceProjectAPI;
+
+/**
+ * Model reset listener
+ * 
+ */
+final class RulesEngineResetListener implements TraceModelResetListener {
+
+	/**
+	 * Rule engine
+	 */
+	private final RulesEngine engine;
+
+	/**
+	 * Trace model
+	 */
+	private final TraceModel model;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param engine
+	 *            rule engine
+	 * @param model
+	 *            the trace model
+	 */
+	RulesEngineResetListener(RulesEngine engine, TraceModel model) {
+		this.engine = engine;
+		this.model = model;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelResetListener#modelResetting()
+	 */
+	public void modelResetting() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelResetListener#modelReset()
+	 */
+	public void modelReset() {
+		model.removeExtensions(TraceProjectAPI.class);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelResetListener#modelValid(boolean)
+	 */
+	public void modelValid(boolean valid) throws TraceCompilerException {
+		if (valid) {
+			model.startProcessing();
+			try {
+				// Creates the trace API if it does not exist yet
+				engine.setDefaultTraceAPI();
+				// Adds filler parameters to correct places
+				for (TraceGroup group : model) {
+					for (Trace trace : group) {
+						engine.checkFillerParameters(trace);
+					}
+				}
+			} finally {
+				model.processingComplete();
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/SourceParserRuleBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,565 @@
+/*
+* 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 parser rule
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.nokia.tracecompiler.engine.TraceLocation;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.StringErrorParameters;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.source.SourceParserResult;
+import com.nokia.tracecompiler.engine.source.SourceParserRule;
+import com.nokia.tracecompiler.engine.utils.TraceUtils;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.project.TraceLocationParser;
+import com.nokia.tracecompiler.project.TraceProjectAPI;
+import com.nokia.tracecompiler.source.FormatMapping;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SourceExcludedArea;
+import com.nokia.tracecompiler.source.SourceIterator;
+import com.nokia.tracecompiler.source.SourceParser;
+import com.nokia.tracecompiler.source.SourceParserException;
+import com.nokia.tracecompiler.source.SourceUtils;
+
+/**
+ * Base class for parser rules. Instances of this class are added to the trace
+ * model. The source engine uses the parses it finds from the model to find
+ * trace locations from source files
+ * 
+ */
+public abstract class SourceParserRuleBase extends RuleBase implements
+		SourceParserRule, TraceLocationParser {
+
+	/**
+	 * Tag to be searched from source
+	 */
+	private String tag;
+
+	/**
+	 * Allowed tag suffixes
+	 */
+	private ArrayList<String> tagSuffixes = new ArrayList<String>();
+
+	/**
+	 * Default name for a parameter
+	 */
+	public static final String DEFAULT_PARAMETER_NAME = "arg"; //$NON-NLS-1$
+
+	/**
+	 * Pattern for trimming c++ cast operator away from trace parameters
+	 */
+	private Pattern cppCastTrimPattern = Pattern.compile("\\s*(.+<.+>)\\s*"); //$NON-NLS-1$
+
+	/**
+	 * Pattern for trimming c cast operator away from trace parameters
+	 */
+	private Pattern cCastTrimPattern = Pattern.compile("(\\([^(]+?\\))"); //$NON-NLS-1$
+
+	/**
+	 * Pattern for getting a valid token from parameter data
+	 */
+	private Pattern parameterNamePattern = Pattern
+			.compile("[a-zA-Z][a-zA-Z\\d]*"); //$NON-NLS-1$
+
+	/**
+	 * Symbian literal tags
+	 */
+	private String[] TRACE_TEXT_TAGS = { "_L8", //$NON-NLS-1$
+			"_T8", //$NON-NLS-1$
+			"_L", //$NON-NLS-1$
+			"_T" //$NON-NLS-1$
+	};	
+	
+	
+	/**
+	 * Constructor
+	 * 
+	 * @param tag
+	 *            the tag to be searched from source
+	 * @param tagSuffixes
+	 *            the list of allowed suffixes to the tag
+	 */
+	protected SourceParserRuleBase(String tag, String[] tagSuffixes) {
+		this.tag = tag;
+		// Adds the sub-formats to the parsers
+		if (tagSuffixes != null) {
+			int len = tagSuffixes.length;
+			for (int i = 0; i < len; i++) {
+				this.tagSuffixes.add(tagSuffixes[i]);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#getSearchTag()
+	 */
+	public String getSearchTag() {
+		return tag;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#
+	 *      isAllowedTagSuffix(java.lang.String)
+	 */
+	public boolean isAllowedTagSuffix(String tag) {
+		boolean retval = false;
+		if (tag != null) {
+			if (tag.length() == 0 && tagSuffixes.isEmpty()) {
+				retval = true;
+			} else {
+				for (int i = 0; i < tagSuffixes.size() && !retval; i++) {
+					String s = tagSuffixes.get(i);
+					if (s.length() == tag.length()) {
+						retval = true;
+						for (int j = 0; j < s.length() && retval; j++) {
+							char c1 = s.charAt(j);
+							// '?' can be any character
+							if (c1 != '?') {
+								retval = tag.charAt(j) == c1;
+							}
+						}
+					}
+				}
+			}
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#getName()
+	 */
+	public String getName() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#
+	 *      parseParameters(java.util.List)
+	 */
+	public SourceParserResult parseParameters(String tag, List<String> list)
+			throws TraceCompilerException {
+		SourceParserResult result = new SourceParserResult();
+		result.traceText = trimTraceText(list.get(0));
+		result.originalName = result.traceText;
+		result.convertedName = TraceUtils.convertName(
+				SourceUtils.removePrintfFormatting(result.traceText))
+				.toUpperCase();
+		result.parameters = list.subList(1, list.size());
+		return result;
+	}
+
+	/**
+	 * Converts a location to trace
+	 * 
+	 * @param location
+	 *            the location to be converted
+	 * @return the conversion result
+	 * @throws TraceCompilerException
+	 *             if conversion fails
+	 */
+	public TraceConversionResult convertLocation(TraceLocation location)
+			throws TraceCompilerException {
+		// All parameter types are supported by default -> false is passed to
+		// buildParameterTypeList.
+		List<FormatMapping> types = buildParameterTypeList(location
+				.getTraceText(), false);
+		// Parameter count must match the number of format elements in trace
+		// text -> true is passed to convertLocation by default
+		return convertLocation(location, true, types);
+	}
+	
+	/**
+	 * Converts a location to trace
+	 * 
+	 * @param location
+	 *            the location to be converted
+	 * @param useParametersFromLocation
+	 *            true if location parameters need to be checked
+	 * @param types
+	 *            the parameter types list
+	 * @return the conversion result
+	 * @throws TraceCompilerException
+	 *             if conversion fails
+	 */
+	protected TraceConversionResult convertLocation(TraceLocation location,
+			boolean useParametersFromLocation, List<FormatMapping> types)
+			throws TraceCompilerException {
+		TraceConversionResult result = new TraceConversionResult();
+		result.text = location.getTraceText();
+
+		// If trace text is in multiple lines, remove extra characters
+		int removableAreaBeging = -1;
+		for (int i = 0; i < result.text.length(); i++) {
+			char c = result.text.charAt(i);
+			if (c == SourceConstants.QUOTE_CHAR
+					&& (i == 0 || result.text.charAt(i - 1) != SourceConstants.BACKSLASH_CHAR)) {
+				if (removableAreaBeging != -1) {
+					String startString = result.text.substring(0,
+							removableAreaBeging);
+					String endString = result.text.substring(i + 1, result.text
+							.length());
+					result.text = startString + endString;
+					i = removableAreaBeging;
+					removableAreaBeging = -1;
+				} else {
+					removableAreaBeging = i;
+				}
+			}
+		}
+
+		result.name = location.getConvertedName();
+
+		// If location parameters are used, the count must match the number of
+		// formats parsed from the trace string.
+		if (!useParametersFromLocation
+				|| (types.size() == location.getParameterCount() && numberOfParametersInTagMatchSize(
+						location.getTag(), types.size()))) {
+			result.parameters = new ArrayList<ParameterConversionResult>(types
+					.size());
+			Iterator<String> itr = location.getParameters();
+			// The FormatMapping objects are converted to
+			// ParameterConversionResult objects:
+			// - Name is associated to the parameter
+			// - Extensions are created
+			for (int i = 0; i < types.size(); i++) {
+				FormatMapping mapping = types.get(i);
+				String name;
+				if (useParametersFromLocation) {
+					name = TraceUtils.convertName(trimParameter(itr.next(), i));
+				} else {
+					name = DEFAULT_PARAMETER_NAME + (i + 1);
+				}
+				ParameterConversionResult param = mapFormatToConversionResult(mapping);
+				param.name = modifyDuplicateName(result.parameters, name);
+				result.parameters.add(param);
+			}
+		} else {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.PARAMETER_FORMAT_MISMATCH, null,
+					location);
+		}
+		return result;
+	}
+
+	
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#
+	 *      processNewLocation(com.nokia.tracecompiler.engine.TraceLocation)
+	 */
+	public void processNewLocation(TraceLocation location) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceLocationParser#getLocationGroup()
+	 */
+	public String getLocationGroup() {
+		return null;
+	}
+
+	/**
+	 * Maps a format to conversion result
+	 * 
+	 * @param mapping
+	 *            the mapping
+	 * @return the conversion result
+	 */
+	protected ParameterConversionResult mapFormatToConversionResult(
+			FormatMapping mapping) {
+		ParameterConversionResult param = new ParameterConversionResult();
+		param.type = mapping.type;
+		if (mapping.isArray) {
+			param.extensions = new ArrayList<TraceModelExtension>();
+			param.extensions.add(new ArrayParameterRuleImpl());
+		}
+		return param;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#
+	 *      findLocationComment(com.nokia.tracecompiler.engine.TraceLocation)
+	 */
+	public SourceExcludedArea findLocationComment(TraceLocation location) {
+		SourceParser parser = location.getParser();
+		SourceExcludedArea excludedArea = null;
+		if (parser != null) {
+			try {
+				int offset = location.getOffset() + location.getLength();
+				SourceIterator itr = parser.createIterator(offset,
+						SourceParser.SKIP_WHITE_SPACES);
+				char c = itr.next();
+				if (c == ';') {
+					offset = itr.currentIndex();
+					c = itr.next();
+				}
+				boolean skippedReturn = false;
+				int commentStart = itr.currentIndex();
+				for (int i = offset; i < commentStart; i++) {
+					c = parser.getData(i);
+					if (c == '\n') {
+						skippedReturn = true;
+					}
+				}
+				// Comment must be on same line
+				if (!skippedReturn) {
+					excludedArea = parser.getExcludedArea(commentStart);
+				}
+				if (excludedArea == null) {
+					// If comment is not on same line, the previous line is
+					// checked
+					offset = parser.findStartOfLine(location.getOffset(), true,
+							true);
+					excludedArea = parser.getExcludedArea(offset - 1);
+				}
+			} catch (SourceParserException e) {
+			}
+		}
+		return excludedArea;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#getLocationParser()
+	 */
+	public TraceLocationParser getLocationParser() {
+		return this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceLocationParser#
+	 *      isLocationConverted(com.nokia.tracecompiler.engine.TraceLocation)
+	 */
+	public boolean isLocationConverted(TraceLocation location) {
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceLocationParser#
+	 *      checkLocationValidity(com.nokia.tracecompiler.engine.TraceLocation)
+	 */
+	public TraceCompilerErrorCode checkLocationValidity(TraceLocation location) {
+		Trace trace = location.getTrace();
+		TraceCompilerErrorCode retval = TraceCompilerErrorCode.TRACE_DOES_NOT_EXIST;
+		if (trace != null) {
+			retval = TraceCompilerErrorCode.OK;
+		} else {
+			// If the API does not match the parser, the needs conversion flag
+			// is set
+			TraceProjectAPI api = getOwner().getModel().getExtension(
+					TraceProjectAPI.class);
+			if (!api.getName().equals(location.getParserRule().getName())) {
+				retval = TraceCompilerErrorCode.TRACE_NEEDS_CONVERSION;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Checks if the number of the parameters in the trace tag matches the size
+	 * of parameter list
+	 * 
+	 * @param tag
+	 *            the trace tag
+	 * @param size
+	 *            size of the parameter list
+	 * @return true is parameter count matches, false otherwise
+	 */
+	private boolean numberOfParametersInTagMatchSize(String tag, int size) {
+		boolean matches = true;
+		// Parse the last character of the tag to a integer
+		if (tag != null) {
+			try {
+
+				// Check the tag parameter count and compare it to the size of
+				// the parameter list
+				String tagParamStr = tag.substring(tag.length() - 1);
+				int tagParamCount = Integer.parseInt(tagParamStr);
+
+				if (tagParamCount != size) {
+					matches = false;
+				}
+			} catch (NumberFormatException e) {
+			}
+		}
+		return matches;
+	}
+
+	/**
+	 * Builds the parameter type array which is passed to convertLocation
+	 * 
+	 * @param text
+	 *            the trace text
+	 * @param simpleParameters
+	 *            true if only simple types are supported
+	 * @return the list of types
+	 * @throws TraceCompilerException
+	 *             if parser fails
+	 */
+	protected List<FormatMapping> buildParameterTypeList(String text,
+			boolean simpleParameters) throws TraceCompilerException {
+		Matcher matcher = SourceUtils.traceTextPattern.matcher(text);
+		ArrayList<FormatMapping> types = new ArrayList<FormatMapping>();
+		boolean found = true;
+		do {
+			found = matcher.find();
+			if (found) {
+				String tag = matcher.group();
+				FormatMapping mapping = SourceUtils
+						.mapFormatToParameterType(tag);
+				if (simpleParameters && !mapping.isSimple) {
+					StringErrorParameters param = new StringErrorParameters();
+					param.string = tag;
+					throw new TraceCompilerException(
+							TraceCompilerErrorCode.PARAMETER_FORMAT_NEEDS_EXT_MACRO,
+							param, null);
+				}
+				types.add(mapping);
+			}
+		} while (found);
+		return types;
+	}
+
+	/**
+	 * Changes a duplicate parameter name to unique
+	 * 
+	 * @param parameters
+	 *            the list of existing parameters
+	 * @param name
+	 *            the name
+	 * @return the modified name
+	 */
+	private String modifyDuplicateName(
+			List<ParameterConversionResult> parameters, String name) {
+		String retval = name;
+		for (ParameterConversionResult result : parameters) {
+			if (result.name.equals(name)) {
+				retval = name + (parameters.size() + 1);
+				break;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Trims extra stuff away from trace text
+	 * 
+	 * @param data
+	 *            the data to be trimmed
+	 * @return trimmed text
+	 */
+	protected String trimTraceText(String data) {
+		// Removes literal macros
+		for (String element : TRACE_TEXT_TAGS) {
+			if (data.startsWith(element)) {
+				data = data.substring(element.length());
+			}
+		}
+		data = data.trim();
+		// Removes the opening bracket and quotes
+		data = removeBrackets(data);
+		if (data.startsWith("\"") //$NON-NLS-1$
+				&& data.length() >= 2) { // CodForChk_Dis_Magic
+			data = data.substring(1, data.length() - 1);
+		}
+		return data;
+	}
+
+	/**
+	 * Removes the brackets around the given data
+	 * 
+	 * @param data
+	 *            the data
+	 * @return the modified data
+	 */
+	protected String removeBrackets(String data) {
+		boolean canRemove = true;
+		while (data.startsWith("(") //$NON-NLS-1$
+				&& data.endsWith(")") //$NON-NLS-1$
+				&& canRemove) {
+			// If closing bracket is found first, the first bracket cannot be
+			// removed.
+			// TODO: Does not work with for example ((Cast)abc).Func()
+			// -> (Cast)abc).Func(
+			for (int i = 1; i < data.length() - 1 && canRemove; i++) {
+				if (data.charAt(i) == '(') {
+					i = data.length();
+				} else if (data.charAt(i) == ')') {
+					canRemove = false;
+				}
+			}
+			if (canRemove) {
+				data = data.substring(1, data.length() - 1).trim();
+			}
+		}
+		return data;
+	}
+
+	/**
+	 * Trims extra stuff away from a parameter to create a parameter label
+	 * 
+	 * @param data
+	 *            the parameter data
+	 * @param index
+	 *            the parameter index. The index will be used as label if the
+	 *            label cannot be parsed
+	 * @return the parameter label
+	 */
+	protected String trimParameter(String data, int index) {
+		// Removes possible literal macros
+		data = trimTraceText(data);
+		// Removes casting operations.
+		Matcher matcher = cppCastTrimPattern.matcher(data);
+		data = removeBrackets(matcher.replaceFirst("")); //$NON-NLS-1$
+		matcher = cCastTrimPattern.matcher(data);
+		data = matcher.replaceFirst(""); //$NON-NLS-1$
+		// Finds the next valid token from the data
+		matcher = parameterNamePattern.matcher(data);
+		if (matcher.find()) {
+			data = matcher.group();
+		} else {
+			data = DEFAULT_PARAMETER_NAME + (index + 1);
+		}
+		return data;
+	}	
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/StartOfFunctionLocationRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,62 @@
+/*
+* 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:
+*
+* Location rule for start of function
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.source.SourceLocationRule;
+
+/**
+ * Location rule for start of function
+ * 
+ */
+final class StartOfFunctionLocationRule extends RuleBase implements
+		SourceLocationRule {
+
+	/**
+	 * Location rule offset. Should be large enough to cover a function
+	 */
+	private static final int OFFSET = -100000; // CodForChk_Dis_Magic
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceLocationRule#getType()
+	 */
+	public int getLocationType() {
+		return SourceLocationRule.CONTEXT_RELATIVE;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceLocationRule#getOffset()
+	 */
+	public int getLocationOffset() {
+		return OFFSET;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceLocationRule#isRemovedAfterInsert()
+	 */
+	public boolean isRemovedAfterInsert() {
+		return true;
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/StateTraceRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Rule for state traces
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.utils.TraceUtils;
+import com.nokia.tracecompiler.source.SourceContext;
+
+/**
+ * Rule for state traces
+ * 
+ */
+public class StateTraceRule extends AutomaticTraceTextRule {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.AutomaticTraceTextRule#
+	 *      formatTrace(com.nokia.tracecompiler.source.SourceContext)
+	 */
+	@Override
+	public String formatTrace(SourceContext context) {
+		return TraceUtils.formatTrace(RuleUtils.TEXT_FORMAT_BASE, context
+				.getClassName(), context.getFunctionName());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ThisPointerParameterTemplate.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,33 @@
+/*
+* 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:
+*
+* Template for "this" pointer parameter.
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+
+/**
+ * Template for "this" pointer parameter.
+ * 
+ */
+final class ThisPointerParameterTemplate  {
+
+	/**
+	 * Parameter name
+	 */
+	static final String PARAMETER_NAME = "this"; //$NON-NLS-1$
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/TraceFormatRuleBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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 formatting rule
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.source.TraceFormattingRule;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.project.TraceProjectAPI;
+
+/**
+ * Base class for project API's. Instance of this is added to the model and
+ * affect all traces which do not have their own formatter.
+ * 
+ */
+public abstract class TraceFormatRuleBase extends RuleBase implements
+		TraceFormattingRule, TraceProjectAPI {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.TraceFormattingRule#
+	 *      mapNameToSource(com.nokia.tracecompiler.model.Trace)
+	 */
+	public String mapNameToSource(Trace trace) {
+		return trace.getName();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.TraceFormattingRule#
+	 *      mapParameterCountToSource(com.nokia.tracecompiler.model.Trace, int)
+	 */
+	public String mapParameterCountToSource(Trace trace, int count) {
+		return String.valueOf(count);
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/TraceParameterFormattingRuleBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Base class for parameter formatting rules
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+import com.nokia.tracecompiler.engine.source.TraceParameterFormattingRule;
+
+/**
+ * Base class for parameter formatting rules
+ * 
+ */
+class TraceParameterFormattingRuleBase extends RuleBase implements
+		TraceParameterFormattingRule {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.TraceParameterFormattingRule#
+	 *      isShownInSource()
+	 */
+	public boolean isShownInSource() {
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.TraceParameterFormattingRule#
+	 *      mapNameToSource(java.lang.String)
+	 */
+	public String mapNameToSource(String originalName) {
+		return originalName;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/ValueParameterTemplate.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,33 @@
+/*
+* 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:
+*
+* Template for "value" parameter.
+*
+*/
+package com.nokia.tracecompiler.engine.rules;
+
+
+/**
+ * Template for "value" parameter.
+ * 
+ */
+final class ValueParameterTemplate {
+
+	/**
+	 * Parameter name
+	 */
+	static final String PARAMETER_NAME = "value"; //$NON-NLS-1$
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/messages.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,11 @@
+AddFunctionParametersFlag.Title=Add function parameters
+AddThisPtrFlag.Title=Add "this" pointer parameter
+AddReturnParameterFlag.Title=Add return value to exit traces
+ArrayParameterFlag.Title=Array Parameter
+RuleUtils.FunctionEntryTitle=Function Entry-Exit
+RuleUtils.PerformanceEventTitle=Performance Event Entry-Exit
+RuleUtils.StateTraceTitle=State Trace
+FunctionReturnLocationMultiplierRule.InvalidReturnStatement=Exit trace was not added to source, since it might produce unwanted side effects
+RuleUtils.FailedToParseReturnValues=Failed to parse return values
+AutoAddFunctionParametersRule.UnrecognizedTypeWarning=Unrecognized type -> Traced as pointer
+AddMatchingTraceFlag.Title=Add exit traces
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/osttrace/OstConstants.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,67 @@
+/*
+* 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:
+*
+* Constants for OST parser and formatter
+*
+*/
+package com.nokia.tracecompiler.engine.rules.osttrace;
+
+/**
+ * Constants for OST parser and formatter
+ * 
+ */
+interface OstConstants {
+
+	/**
+	 * API tag for macros which have the preprocessor level parameter
+	 */
+	String PREPROCESSOR_LEVEL_TAG = "Def"; //$NON-NLS-1$
+
+	/**
+	 * API tag for function entry traces
+	 */
+	String FUNCTION_ENTRY_TAG = "FunctionEntry"; //$NON-NLS-1$
+
+	/**
+	 * API tag for function exit traces
+	 */
+	String FUNCTION_EXIT_TAG = "FunctionExit"; //$NON-NLS-1$
+
+	/**
+	 * API tag for performance event start
+	 */
+	String PERFORMANCE_EVENT_START_TAG = "EventStart"; //$NON-NLS-1$
+
+	/**
+	 * API tag for performance event stop
+	 */
+	String PERFORMANCE_EVENT_STOP_TAG = "EventStop"; //$NON-NLS-1$
+
+	/**
+	 * API tag for traces with user-defined data format
+	 */
+	String DATA_TRACE_TAG = "Data"; //$NON-NLS-1$
+	
+	/**
+	 * API tag for state traces
+	 */
+	String STATE_TRACE_TAG = "State"; //$NON-NLS-1$
+
+	/**
+	 * API tag for traces with extension parameters
+	 */
+	String EXTENSION_TRACE_TAG = "Ext"; //$NON-NLS-1$
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/osttrace/OstTraceFormatRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,348 @@
+/*
+ * Copyright (c) 2010 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:
+ *
+ * Formatting rule for OST traces
+ *
+ */
+package com.nokia.tracecompiler.engine.rules.osttrace;
+
+import com.nokia.tracecompiler.engine.header.ComplexHeaderRule;
+import com.nokia.tracecompiler.engine.rules.AutomaticTraceTextRule;
+import com.nokia.tracecompiler.engine.rules.EntryTraceRule;
+import com.nokia.tracecompiler.engine.rules.ExitTraceRule;
+import com.nokia.tracecompiler.engine.rules.PerformanceEventRuleBase;
+import com.nokia.tracecompiler.engine.rules.PerformanceEventStartRule;
+import com.nokia.tracecompiler.engine.rules.PerformanceEventStopRule;
+import com.nokia.tracecompiler.engine.rules.StateTraceRule;
+import com.nokia.tracecompiler.engine.rules.TraceFormatRuleBase;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceModelListener;
+import com.nokia.tracecompiler.model.TraceObject;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.plugin.TraceFormatConstants;
+import com.nokia.tracecompiler.plugin.TraceHeaderContribution;
+import com.nokia.tracecompiler.plugin.TraceAPIFormatter.TraceFormatType;
+import com.nokia.tracecompiler.source.SourceUtils;
+
+/**
+ * Formatting rule for OST traces.
+ * 
+ */
+public final class OstTraceFormatRule extends TraceFormatRuleBase implements
+		TraceHeaderContribution, TraceModelListener {
+
+	/**
+	 * Separator for parameters within trace text
+	 */
+	private static final String PARAMETER_VALUE_SEPARATOR = "="; //$NON-NLS-1$
+
+	/**
+	 * Separator for parameter name value
+	 */
+	private static final String PARAMETER_SEPARATOR = ";"; //$NON-NLS-1$
+
+	/**
+	 * String parameter tag
+	 */
+	private static final String STRING_PARAMETER_TAG = "%s"; //$NON-NLS-1$
+
+	/**
+	 * Hex parameter tag
+	 */
+	private static final String HEX_PARAMETER_TAG = "0x%x"; //$NON-NLS-1$
+
+	/**
+	 * SDEC parameter tag
+	 */
+	private static final String SDEC_PARAMETER_TAG = "%d"; //$NON-NLS-1$
+
+	/**
+	 * UDEC parameter tag
+	 */
+	private static final String UDEC_PARAMETER_TAG = "%u"; //$NON-NLS-1$	
+
+	/**
+	 * Category for traces
+	 */
+	private static final String TRACE_CATEGORY = "EXTRACT_GROUP_ID(aTraceID)"; //$NON-NLS-1$
+
+	/**
+	 * Name for storage
+	 */
+	public static final String STORAGE_NAME = "OstTraceFormat"; //$NON-NLS-1$
+
+	/**
+	 * OstTraceEventStart tag
+	 */
+	public static final String OST_TRACE_EVENT_START_TAG = "OstTraceEventStart"; //$NON-NLS-1$
+
+	/**
+	 * OstTraceEventStop tag
+	 */
+	public static final String OST_TRACE_EVENT_STOP_TAG = "OstTraceEventStop"; //$NON-NLS-1$
+
+	/**
+	 * Ext-function declaration format
+	 */
+	private static final String HEADER_FORMAT = "OstTraceGen" //$NON-NLS-1$
+			+ TraceFormatConstants.PARAM_COUNT_FORMAT // Number of parameters
+			+ "( TUint32 aTraceID" //$NON-NLS-1$
+			+ TraceFormatConstants.PARAMETERS_FORMAT // Trace parameters
+			+ " )"; //$NON-NLS-1$
+
+	/**
+	 * Activation query formatting
+	 */
+	private static final String ACTIVATION_FORMAT = "BTraceFiltered8( " //$NON-NLS-1$
+			+ TRACE_CATEGORY + ", " //$NON-NLS-1$
+			+ "EOstTraceActivationQuery, KOstTraceComponentID, aTraceID )"; //$NON-NLS-1$
+
+	/**
+	 * Buffered trace format
+	 */
+	private static final String TRACE_BUFFER_FORMAT = "OstSendNBytes( " //$NON-NLS-1$
+			+ TRACE_CATEGORY + ", " //$NON-NLS-1$
+			+ "EOstTrace, KOstTraceComponentID, aTraceID, " //$NON-NLS-1$
+			+ TraceFormatConstants.DATA_BUFFER_FORMAT // Trace data
+			+ ", " //$NON-NLS-1$
+			+ TraceFormatConstants.DATA_LENGTH_FORMAT // Trace data length
+			+ " );"; //$NON-NLS-1$
+
+	/**
+	 * Packed trace format
+	 */
+	private static final String TRACE_PACKED_FORMAT = "BTraceFilteredContext12( " //$NON-NLS-1$
+			+ TRACE_CATEGORY + ", " //$NON-NLS-1$
+			+ "EOstTrace, KOstTraceComponentID, aTraceID, " //$NON-NLS-1$
+			+ TraceFormatConstants.DATA_BUFFER_FORMAT // Trace data
+			+ " );"; //$NON-NLS-1$
+
+	/**
+	 * Template for the OstTraceDefinitions.h header file
+	 */
+	private static final String[] MAIN_HEADER_TEMPLATE = { "\r\n" //$NON-NLS-1$
+			+ "// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler\r\n" //$NON-NLS-1$
+			+ "// REMOVE BEFORE CHECK-IN TO VERSION CONTROL\r\n" //$NON-NLS-1$
+			+ "#define OST_TRACE_COMPILER_IN_USE\r\n" //$NON-NLS-1$
+			+ "#include <opensystemtrace.h>\r\n#endif\r\n" }; //$NON-NLS-1$
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectAPI#getName()
+	 */
+	public String getName() {
+		return STORAGE_NAME;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.TraceFormattingRule#
+	 * getFormat(com.nokia.tracecompiler.model.Trace,
+	 * com.nokia.tracecompiler.plugin.TraceAPIFormatter.TraceFormatType)
+	 */
+	public String getFormat(Trace trace, TraceFormatType formatType) { // CodForChk_Dis_ComplexFunc
+		String retval;
+		if (formatType == TraceFormatType.HEADER) {
+			retval = HEADER_FORMAT;
+		} else if (formatType == TraceFormatType.TRACE_BUFFER) {
+			retval = TRACE_BUFFER_FORMAT;
+		} else if (formatType == TraceFormatType.TRACE_PACKED) {
+			retval = TRACE_PACKED_FORMAT;
+		} else if (formatType == TraceFormatType.TRACE_ACTIVATION) {
+			retval = ACTIVATION_FORMAT;
+		} else {
+			retval = null;
+		}
+
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceFormatRule#
+	 * mapParameterCountToSource(com.nokia.tracecompiler.model.Trace, int)
+	 */
+	@Override
+	public String mapParameterCountToSource(Trace trace, int count) {
+		String retval;
+		ComplexHeaderRule rule = trace.getExtension(ComplexHeaderRule.class);
+		if (rule != null && rule.getTraceIDDefineExtension() != null || trace.getExtension(EntryTraceRule.class)!= null) {
+			// Uses the extension tag with extension headers
+			retval = OstConstants.EXTENSION_TRACE_TAG;
+		} else {
+			retval = String.valueOf(count);
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceHeaderContribution#
+	 * getContribution(com.nokia.tracecompiler.project.TraceHeaderContribution.
+	 * TraceHeaderContributionType)
+	 */
+	public String[] getContribution(TraceHeaderContributionType type) {
+		String[] retval = null;
+		if (type == TraceHeaderContributionType.GLOBAL_DEFINES) {
+			retval = new String[] { "KOstTraceComponentID 0x" //$NON-NLS-1$
+					+ Integer.toHexString(getOwner().getModel().getID()) };
+		} else if (type == TraceHeaderContributionType.MAIN_HEADER_CONTENT) {
+			retval = MAIN_HEADER_TEMPLATE;
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * com.nokia.tracecompiler.engine.rules.ExtensionBase#setOwner(com.nokia
+	 * .tracecompiler.model.TraceObject)
+	 */
+	@Override
+	public void setOwner(TraceObject owner) {
+		if (getOwner() != null) {
+			getOwner().getModel().removeModelListener(this);
+		}
+		super.setOwner(owner);
+		if (owner != null) {
+			owner.getModel().addModelListener(this);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 * objectAdded(com.nokia.tracecompiler.model.TraceObject,
+	 * com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectAdded(TraceObject owner, TraceObject object) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 * objectCreationComplete(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectCreationComplete(TraceObject object) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 * objectRemoved(com.nokia.tracecompiler.model.TraceObject,
+	 * com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectRemoved(TraceObject owner, TraceObject object) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 * propertyUpdated(com.nokia.tracecompiler.model.TraceObject, int)
+	 */
+	public void propertyUpdated(TraceObject object, int property) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.project.TraceProjectAPI#
+	 * formatTraceForExport(com.nokia.tracecompiler.model.Trace,
+	 * com.nokia.tracecompiler.project.TraceProjectAPI.TraceFormatFlags)
+	 */
+	public String formatTraceForExport(Trace trace, TraceFormatFlags flags) {
+		// TODO: This uses default formats
+		// -> Should be configurable
+		// > for entry traces
+		// < for exit traces
+		// Logic analyzer format for performance traces
+		String retval = trace.getTrace();
+		AutomaticTraceTextRule rule = trace
+				.getExtension(AutomaticTraceTextRule.class);
+		int parameterCount = trace.getParameterCount();
+		if (rule != null) {
+			if (rule instanceof EntryTraceRule) {
+				retval = "> " //$NON-NLS-1$
+						+ retval;
+			} else if (rule instanceof ExitTraceRule) {
+				retval = "< " //$NON-NLS-1$
+						+ retval;
+			} else if (rule instanceof StateTraceRule) {
+				if (parameterCount == 2) { // CodForChk_Dis_Magic
+					retval = retval + "Machine" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$
+							+ STRING_PARAMETER_TAG + PARAMETER_SEPARATOR
+							+ "State" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$
+							+ STRING_PARAMETER_TAG;
+				} else {
+					retval = retval
+							+ "Machine" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$
+							+ STRING_PARAMETER_TAG + PARAMETER_SEPARATOR
+							+ "State" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$
+							+ STRING_PARAMETER_TAG + PARAMETER_SEPARATOR
+							+ "Instance" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$
+							+ HEX_PARAMETER_TAG;
+				}
+			}
+
+			if (parameterCount >= 1 && !(rule instanceof StateTraceRule)) {
+				TraceParameter param;
+				for (int i = 0; i < parameterCount; i++) {
+					param = trace.getParameter(i);
+					retval += PARAMETER_SEPARATOR + param.getName()
+							+ PARAMETER_VALUE_SEPARATOR
+							+ SourceUtils.mapParameterTypeToFormat(param);
+				}
+			}
+		} else {
+			PerformanceEventRuleBase perf = trace
+					.getExtension(PerformanceEventRuleBase.class);
+			if (perf != null) {
+				if (perf instanceof PerformanceEventStartRule) {
+					retval = retval + ">" + PARAMETER_SEPARATOR //$NON-NLS-1$
+							+ "Value" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$
+							+ SDEC_PARAMETER_TAG;
+				} else if (perf instanceof PerformanceEventStopRule) {
+					retval = retval
+							+ "<" //$NON-NLS-1$
+							+ PARAMETER_SEPARATOR
+							+ "Value" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$
+							+ SDEC_PARAMETER_TAG
+							+ PARAMETER_SEPARATOR
+							+ "Start Event Trace ID" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$
+							+ UDEC_PARAMETER_TAG;
+				}
+			}
+		}
+		// If formatting is not supported the format characters and parameters
+		// are removed.
+		if (!flags.isFormattingSupported) {
+			int index = retval.indexOf(PARAMETER_SEPARATOR);
+			if (index > 0) {
+				retval = retval.substring(0, index);
+			}
+			retval = SourceUtils.removePrintfFormatting(retval).trim();
+		}
+		return retval;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/osttrace/OstTraceParserRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,645 @@
+/*
+ * Copyright (c) 2010 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:
+ *
+ * OST trace parser rule
+ *
+ */
+package com.nokia.tracecompiler.engine.rules.osttrace;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.nokia.tracecompiler.engine.TraceLocation;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.rules.AutoAddFunctionParametersRule;
+import com.nokia.tracecompiler.engine.rules.AutoAddReturnParameterRule;
+import com.nokia.tracecompiler.engine.rules.AutoAddThisPtrRule;
+import com.nokia.tracecompiler.engine.rules.AutoAddValueRule;
+import com.nokia.tracecompiler.engine.rules.AutomaticTraceTextRule;
+import com.nokia.tracecompiler.engine.rules.ComplexHeaderRuleImpl;
+import com.nokia.tracecompiler.engine.rules.EntryTraceRule;
+import com.nokia.tracecompiler.engine.rules.ExitTraceRule;
+import com.nokia.tracecompiler.engine.rules.PerformanceEventStartRule;
+import com.nokia.tracecompiler.engine.rules.PerformanceEventStopRule;
+import com.nokia.tracecompiler.engine.rules.ReadOnlyObjectRuleImpl;
+import com.nokia.tracecompiler.engine.rules.SourceParserRuleBase;
+import com.nokia.tracecompiler.engine.rules.StateTraceRule;
+import com.nokia.tracecompiler.engine.source.SourceParserResult;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.source.FormatMapping;
+import com.nokia.tracecompiler.source.SourceContext;
+import com.nokia.tracecompiler.source.SourceParser;
+
+/**
+ * OST trace parser rule
+ * 
+ */
+public final class OstTraceParserRule extends SourceParserRuleBase {
+
+	/**
+	 * PERFORMANCE group name
+	 */
+	private static final String PERFORMANCE_GROUP_NAME = "TRACE_PERFORMANCE"; //$NON-NLS-1$
+
+	/**
+	 * STATE group name
+	 */
+	private static final String STATE_GROUP_NAME = "TRACE_STATE"; //$NON-NLS-1$
+
+	/**
+	 * FLOW group name
+	 */
+	private static final String FLOW_GROUP_NAME = "TRACE_FLOW"; //$NON-NLS-1$
+
+	/**
+	 * Data trace parameter count
+	 */
+	private static final int DATA_PARAMETER_COUNT = 2; // CodForChk_Dis_Magic
+
+	/**
+	 * Entry Ext trace parameter count
+	 */
+	private static final int ENTRY_EXT_PARAMETER_COUNT = 1; // CodForChk_Dis_Magic
+
+	/**
+	 * Exit Ext trace parameter count
+	 */
+	private static final int EXIT_EXT_PARAMETER_COUNT = 2; // CodForChk_Dis_Magic
+
+	/**
+	 * Trace parameter index list
+	 */
+	class TraceParameterIndexList {
+
+		/**
+		 * Minimum number of parameters needed to decode traces
+		 */
+		int minParamCount;
+
+		/**
+		 * Preprocessor level index
+		 */
+		int levelIndex;
+
+		/**
+		 * Trace name index
+		 */
+		int nameIndex;
+
+		/**
+		 * Trace text index
+		 */
+		int textIndex;
+
+		/**
+		 * Trace group index in case group name is free-form
+		 */
+		int groupIndex;
+
+		/**
+		 * Trace group name in case group name is pre-determined by rules
+		 */
+		String groupName;
+	}
+
+	/**
+	 * List of flags related to OST API macro
+	 */
+	class TraceParameterFlagList {
+
+		/**
+		 * Data tag
+		 */
+		boolean hasDataTag;
+
+		/**
+		 * State tag
+		 */
+		boolean hasStateTag;
+
+		/**
+		 * Ext tag
+		 */
+		boolean hasExtTag;
+
+		/**
+		 * Event start tag
+		 */
+		boolean hasEventStartTag;
+
+		/**
+		 * Event stop
+		 */
+		boolean hasEventStopTag;
+
+		/**
+		 * Function entry
+		 */
+		boolean hasFunctionEntryTag;
+
+		/**
+		 * Function exit
+		 */
+		boolean hasFunctionExitTag;
+
+		/**
+		 * Constructor
+		 * 
+		 * @param tag
+		 *            the trace tag
+		 */
+		TraceParameterFlagList(String tag) {
+			hasDataTag = tag.indexOf(OstConstants.DATA_TRACE_TAG) > 0;
+			hasStateTag = tag.indexOf(OstConstants.STATE_TRACE_TAG) > 0;
+			hasExtTag = tag.indexOf(OstConstants.EXTENSION_TRACE_TAG) > 0;
+			hasEventStartTag = tag
+					.indexOf(OstConstants.PERFORMANCE_EVENT_START_TAG) > 0;
+			hasEventStopTag = tag
+					.indexOf(OstConstants.PERFORMANCE_EVENT_STOP_TAG) > 0;
+			hasFunctionEntryTag = tag.indexOf(OstConstants.FUNCTION_ENTRY_TAG) > 0;
+			hasFunctionExitTag = tag.indexOf(OstConstants.FUNCTION_EXIT_TAG) > 0;
+		}
+
+		/**
+		 * Checks if any of the flags is set
+		 * 
+		 * @return true if flag is set
+		 */
+		boolean hasFlags() {
+			return hasDataTag || hasStateTag || hasExtTag || hasEventStartTag
+					|| hasEventStopTag || hasFunctionEntryTag
+					|| hasFunctionExitTag;
+		}
+
+	}
+
+	/**
+	 * Offset to preprocessor level
+	 */
+	private static final int PREPROCESSOR_LEVEL_OFFSET = 0; // CodForChk_Dis_Magic
+
+	/**
+	 * Offset to group name if preprocessor level is not in use
+	 */
+	private static final int GROUP_NAME_OFFSET = 0; // CodForChk_Dis_Magic
+
+	/**
+	 * Offset to trace name if preprocessor level is not in use
+	 */
+	private static final int TRACE_NAME_OFFSET = 1; // CodForChk_Dis_Magic
+
+	/**
+	 * Offset to trace text if preprocessor level is not in use
+	 */
+	private static final int TRACE_TEXT_OFFSET = 2; // CodForChk_Dis_Magic
+
+	/**
+	 * Minimum number of parameters if preprocessor level is not in use
+	 */
+	private static final int MIN_PARAMETER_COUNT = 3; // CodForChk_Dis_Magic
+
+	/**
+	 * Parser tag
+	 */
+	private static final String OST_TRACE_PARSER_TAG = "OstTrace"; //$NON-NLS-1$
+
+	/**
+	 * OstTrace parser formats
+	 */
+	private final static String[] OST_TRACE_PARSER_FORMATS = { "0", //$NON-NLS-1$
+			"1", //$NON-NLS-1$
+			"Data", //$NON-NLS-1$
+			"Ext?", //$NON-NLS-1$
+			"FunctionEntry0", //$NON-NLS-1$
+			"FunctionEntry1", //$NON-NLS-1$
+			"FunctionEntryExt", //$NON-NLS-1$
+			"FunctionExit0", //$NON-NLS-1$
+			"FunctionExit1", //$NON-NLS-1$
+			"FunctionExitExt", //$NON-NLS-1$
+			"EventStart0", //$NON-NLS-1$
+			"EventStart1", //$NON-NLS-1$
+			"EventStop", //$NON-NLS-1$
+			"Def0", //$NON-NLS-1$
+			"Def1", //$NON-NLS-1$
+			"DefData", //$NON-NLS-1$
+			"DefExt?", //$NON-NLS-1$
+			"State0", //$NON-NLS-1$
+			"State1" //$NON-NLS-1$
+	};
+
+	/**
+	 * Creates a new OstTrace parser rule
+	 */
+	public OstTraceParserRule() {
+		super(OST_TRACE_PARSER_TAG, OST_TRACE_PARSER_FORMATS);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#getName()
+	 */
+	@Override
+	public String getName() {
+		return OstTraceFormatRule.STORAGE_NAME;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.tracecompiler.engine.rules.SourceParserRuleBase#parseParameters(java.lang.String, java.util.List)
+	 */
+	@Override
+	public SourceParserResult parseParameters(String tag, List<String> list)
+			throws TraceCompilerException {
+		SourceParserResult result = new SourceParserResult();
+		TraceParameterIndexList indexList = getIndexList(tag);
+		if (list.size() >= indexList.minParamCount) {
+			// Name must exist
+			result.originalName = list.get(indexList.nameIndex);
+			result.convertedName = result.originalName;
+			// Text is optional
+			if (indexList.textIndex >= 0) {
+				result.traceText = trimTraceText(list.get(indexList.textIndex));
+			} else {
+				result.traceText = ""; //$NON-NLS-1$
+			}
+			// Group ID and preprocessor level are stored into the
+			// parser-specific data
+			result.parserData = new ArrayList<String>();
+			if (indexList.levelIndex >= 0) {
+				result.parserData.add(list.get(indexList.levelIndex));
+			}
+			if (indexList.groupIndex >= 0) {
+				result.parserData.add(list.get(indexList.groupIndex));
+			} else if (indexList.groupName != null) {
+				result.parserData.add(indexList.groupName);
+			}
+
+			// Extra parameters are converted to trace parameters
+			result.parameters = new ArrayList<String>();
+			for (int i = indexList.minParamCount; i < list.size(); i++) {
+				result.parameters.add(list.get(i));
+			}
+		} else {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.NOT_ENOUGH_PARAMETERS);
+		}
+		return result;
+	}
+
+	/**
+	 * Gets the parameter index list based on trace tag
+	 * 
+	 * @param tag
+	 *            the trace tag
+	 * @return the index list
+	 */
+	private TraceParameterIndexList getIndexList(String tag) {
+		TraceParameterIndexList indexes = new TraceParameterIndexList();
+		indexes.levelIndex = -1;
+		if (tag.indexOf(OstConstants.FUNCTION_ENTRY_TAG) > 0
+				|| tag.indexOf(OstConstants.FUNCTION_EXIT_TAG) > 0) {
+			indexes.minParamCount = 1; // Name is mandatory
+			indexes.textIndex = -1; // No trace text
+			indexes.nameIndex = 0; // Trace name at index 0
+			indexes.groupIndex = -1; // Group is fixed to TRACE_FLOW
+			indexes.groupName = FLOW_GROUP_NAME;
+		} else if (tag.indexOf(OstConstants.STATE_TRACE_TAG) > 0) {
+			indexes.minParamCount = 1; // Name is mandatory
+			indexes.textIndex = -1; // No trace text
+			indexes.nameIndex = 0; // Trace name at index 0
+			indexes.groupIndex = -1; // Group is fixed to TRACE_STATE
+			indexes.groupName = STATE_GROUP_NAME;
+		} else if (tag.indexOf(OstConstants.PERFORMANCE_EVENT_START_TAG) > 0) {
+			// Name and event name are mandatory
+			indexes.minParamCount = 2; // CodForChk_Dis_Magic
+			indexes.textIndex = 1; // Trace text at index 1
+			indexes.nameIndex = 0; // Trace name at index 0
+			indexes.groupIndex = -1; // Group is fixed to TRACE_PERFORMANCE
+			indexes.groupName = PERFORMANCE_GROUP_NAME;
+		} else if (tag.indexOf(OstConstants.PERFORMANCE_EVENT_STOP_TAG) > 0) {
+			// Name and event name are mandatory
+			indexes.minParamCount = 2; // CodForChk_Dis_Magic
+			indexes.textIndex = 1; // Trace text at index 1
+			indexes.nameIndex = 0; // Trace name at index 0
+			indexes.groupIndex = -1; // Group is fixed to TRACE_PERFORMANCE
+			indexes.groupName = PERFORMANCE_GROUP_NAME;
+		} else {
+			indexes.minParamCount = MIN_PARAMETER_COUNT;
+			indexes.textIndex = TRACE_TEXT_OFFSET;
+			indexes.nameIndex = TRACE_NAME_OFFSET;
+			indexes.groupIndex = GROUP_NAME_OFFSET;
+		}
+		// If the trace macro contains preprocessor level, the offsets are
+		// incremented by one
+		if (tag.indexOf(OstConstants.PREPROCESSOR_LEVEL_TAG) > 0) {
+			indexes.minParamCount++;
+			if (indexes.textIndex >= 0) {
+				indexes.textIndex++;
+			}
+			if (indexes.nameIndex >= 0) {
+				indexes.nameIndex++;
+			}
+			if (indexes.groupIndex >= 0) {
+				indexes.groupIndex++;
+			}
+			indexes.levelIndex = PREPROCESSOR_LEVEL_OFFSET;
+		}
+		return indexes;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#
+	 *      convertLocation(com.nokia.tracecompiler.engine.TraceLocation)
+	 */
+	@Override
+	public TraceConversionResult convertLocation(TraceLocation location)
+			throws TraceCompilerException { // CodForChk_Dis_ComplexFunc
+		TraceParameterFlagList flags = checkParameterCount(location);
+
+		// Data tag does not have parameters
+		boolean checkParameters = !flags.hasDataTag;
+
+		List<FormatMapping> typeList;
+		if (flags.hasExtTag
+				&& (flags.hasFunctionEntryTag || flags.hasFunctionExitTag)) {
+			// Parameters are generated by AutoAdd rules
+			typeList = new ArrayList<FormatMapping>();
+			checkParameters = false;
+		} else if (!flags.hasFlags() || flags.hasDataTag || flags.hasExtTag) {
+			// If the Ext, Data or EventStart tag is present, all formats
+			// are supported. If no flags is set, only 32-bit formats are
+			// supported.
+			typeList = buildParameterTypeList(location.getTraceText(),
+					!flags.hasDataTag && !flags.hasExtTag);
+		} else if (flags.hasEventStartTag) {
+			// In case of Start1 tag value parameter is supported
+			typeList = new ArrayList<FormatMapping>();
+			// Check that does optional value exist
+			if (location.getParameterCount() == 1) {
+				FormatMapping mapping = new FormatMapping(TraceParameter.SDEC32);
+				mapping.isSimple = true;
+				typeList.add(mapping);
+			}
+			checkParameters = false;
+		} else if (flags.hasEventStopTag) {
+			// If the Event stop tag is presented, start event trace
+			// id parameter is supported
+			typeList = new ArrayList<FormatMapping>();
+			FormatMapping mapping = new FormatMapping(TraceParameter.UDEC32);
+			mapping.isSimple = true;
+			typeList.add(mapping);
+			checkParameters = false;
+
+		} else if (flags.hasStateTag) {
+			// If the State tag is presented, two ascii parameters are supported
+			// in case of State0 tag (parameter count = 2). In case of State1
+			// tag (parameter count = 3) two ascii and one 32-bit hex parameters
+			// are supported
+			typeList = new ArrayList<FormatMapping>();
+			FormatMapping mapping = new FormatMapping(TraceParameter.ASCII);
+			mapping.isSimple = true;
+			typeList.add(mapping);
+			mapping = new FormatMapping(TraceParameter.ASCII);
+			mapping.isSimple = true;
+			typeList.add(mapping);
+
+			// Check that does optional instance identifier exist
+			if (location.getParameterCount() == 3) { // CodForChk_Dis_Magic
+				mapping = new FormatMapping(TraceParameter.HEX32);
+				mapping.isSimple = true;
+				typeList.add(mapping);
+			}
+			checkParameters = false;
+		} else {
+			// If some other flag than Data, State, Ext or EventStart is set,
+			// only one 32-bit hex parameter is supported
+			typeList = new ArrayList<FormatMapping>();
+			if (location.getParameterCount() == 1) {
+				FormatMapping mapping = new FormatMapping(TraceParameter.HEX32);
+				mapping.isSimple = true;
+				typeList.add(mapping);
+			}
+		}
+		// If no flags or Ext flag is present, the parameter count needs to be
+		// verified
+		TraceConversionResult result = super.convertLocation(location,
+				checkParameters, typeList);
+		// If the extension or state tag is present, zero parameters or a single
+		// 32-bit parameter is not accepted because they do not need to generate
+		// a function into the header
+		if (((flags.hasExtTag && !flags.hasFunctionExitTag && !flags.hasFunctionEntryTag) || (flags.hasStateTag))
+				&& (typeList.size() == 0 || (typeList.size() == 1 && typeList
+						.get(0).isSimple))) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.PARAMETER_FORMAT_UNNECESSARY_EXT_MACRO);
+		}
+		// Ext-macros are tagged with the complex header rule, so the header
+		// gets written when traces are exported. Data-macros are tagged with
+		// read-only rule, so they are not updated via UI. Other special cases
+		// are flagged with corresponding rule.
+		// If trace text does not exist, it is created based on context
+		AutomaticTraceTextRule rule = null;
+		if (flags.hasDataTag) {
+			addRule(result, new ReadOnlyObjectRuleImpl());
+		} else if (flags.hasStateTag) {
+			addRule(result, new StateTraceRule());
+			addRule(result, new ComplexHeaderRuleImpl());
+		} else if (flags.hasEventStartTag) {
+			addRule(result, new PerformanceEventStartRule());
+			// If event value is not defined then event value 1 is automatically
+			// added to event start macros
+			if (location.getParameterCount() == 0) {
+				addRule(result, new AutoAddValueRule());
+			}
+		} else if (flags.hasEventStopTag) {
+			addRule(result, new PerformanceEventStopRule());
+			addRule(result, new ComplexHeaderRuleImpl());
+			// Event value 0 is automatically added to event stop macros
+			addRule(result, new AutoAddValueRule());
+		} else if (flags.hasFunctionEntryTag) {
+			if (flags.hasExtTag) {
+				// Entry trace may contain Ext tag. In that case the trace
+				// parameters are an instance variable and function parameters
+				// parsed from source. It is also flagged as complex, so the
+				// function gets generated to the trace header
+				addRule(result, new ComplexHeaderRuleImpl());
+				addRule(result, new AutoAddFunctionParametersRule());
+				addRule(result, new AutoAddThisPtrRule());
+			}
+			rule = new EntryTraceRule();
+			addRule(result, rule);
+		} else if (flags.hasFunctionExitTag) {
+			if (flags.hasExtTag) {
+				// Exit trace may contain Ext tag. In that case the trace has
+				// two parameters: instance variable and return statement
+				// It is also flagged as complex, so the function gets generated
+				// to the trace header
+				addRule(result, new ComplexHeaderRuleImpl());
+				addRule(result, new AutoAddThisPtrRule());
+				addRule(result, new AutoAddReturnParameterRule());
+			}
+			rule = new ExitTraceRule();
+			addRule(result, rule);
+		} else if (flags.hasExtTag) {
+			addRule(result, new ComplexHeaderRuleImpl());
+		}
+		if (rule != null) {
+			setAutoTextToTrace(location, result, rule);
+		}
+		List<String> parserData = location.getParserData();
+		result.group = parserData.get(parserData.size() - 1);
+		// The convert flag is reset to prevent further conversions
+		location.locationConverted();
+		return result;
+	}
+
+	/**
+	 * Uses the auto-text rule to create trace text
+	 * 
+	 * @param location
+	 *            the location
+	 * @param result
+	 *            the conversion result
+	 * @param rule
+	 *            the auto-text rule
+	 * @throws TraceCompilerException
+	 *             if update fails
+	 */
+	private void setAutoTextToTrace(TraceLocation location,
+			TraceConversionResult result, AutomaticTraceTextRule rule)
+			throws TraceCompilerException {
+		// The trace text comes from the auto-text rule
+		SourceParser parser = location.getParser();
+		SourceContext context = parser.getContext(location.getOffset());
+		if (context != null) {
+			result.text = rule.formatTrace(context);
+		} else {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.NO_CONTEXT_FOR_LOCATION);
+		}
+	}
+
+	/**
+	 * Checks parameter count
+	 * 
+	 * @param location
+	 *            the location
+	 * @return the location tag flags
+	 * @throws TraceCompilerException
+	 *             if parameter count is not valid
+	 */
+	private TraceParameterFlagList checkParameterCount(TraceLocation location)
+			throws TraceCompilerException {
+		TraceParameterFlagList flags = new TraceParameterFlagList(location
+				.getTag());
+
+		// If the trace has some tag, the parameter count is fixed
+		// Data has 2 parameters
+		// State has 2 or 3 parameters
+		// Function entry-exit has 0 or 1 parameters
+		// Event start has 0 or 1 parameters
+		// Event stop has 1 parameters
+		int parameterCount = location.getParameterCount();
+
+		// Entry trace may have zero or one parameter
+		// In case of Ext, it must have one parameter
+		if (flags.hasFunctionEntryTag
+				&& ((parameterCount > 1) || (flags.hasExtTag && (parameterCount != ENTRY_EXT_PARAMETER_COUNT)))) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.PARAMETER_COUNT_DOES_NOT_MATCH_API);
+		}
+
+		// Exit trace may have zero or one parameter
+		// In case of Ext, it must have two parameters
+		if (flags.hasFunctionExitTag
+				&& ((!flags.hasExtTag && (parameterCount > 1)) || (flags.hasExtTag && parameterCount != EXIT_EXT_PARAMETER_COUNT))) { // CodForChk_Dis_LengthyLine
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.PARAMETER_COUNT_DOES_NOT_MATCH_API);
+		}
+
+		// Event start may have zero or one parameter
+		if (flags.hasEventStartTag && (parameterCount > 1)) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.PARAMETER_COUNT_DOES_NOT_MATCH_API);
+		}
+
+		// Event stop have one parameters
+		if (flags.hasEventStopTag && (parameterCount != 1)) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.PARAMETER_COUNT_DOES_NOT_MATCH_API);
+		}
+
+		// Data trace has two parameters
+		if ((flags.hasDataTag && (parameterCount != DATA_PARAMETER_COUNT))) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.PARAMETER_COUNT_DOES_NOT_MATCH_API);
+		}
+
+		// State trace may have two or three parameter
+		if (flags.hasStateTag && (parameterCount < 2 || parameterCount > 3)) { // CodForChk_Dis_Magic
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.PARAMETER_COUNT_DOES_NOT_MATCH_API);
+		}
+
+		return flags;
+	}
+
+	/**
+	 * Adds a rule to result
+	 * 
+	 * @param result
+	 *            the result
+	 * @param rule
+	 *            the rule
+	 */
+	private void addRule(TraceConversionResult result, TraceModelExtension rule) {
+		if (result.extensions == null) {
+			result.extensions = new ArrayList<TraceModelExtension>();
+		}
+		result.extensions.add(rule);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.rules.SourceParserRuleBase#
+	 * isLocationConverted(com.nokia.tracecompiler.engine.TraceLocation)
+	 */
+	@Override
+	public boolean isLocationConverted(TraceLocation location) {
+		boolean retval = location.hasChangedAfterConvert();
+		if (!retval) {
+			// Duplicate-location conversions need to be retried in case the
+			// location is no longer a duplicate
+			retval = (location.getValidityCode() == TraceCompilerErrorCode.TRACE_HAS_MULTIPLE_LOCATIONS);
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @seecom.nokia.tracecompiler.engine.rules.printf.PrintfTraceParserRule#
+	 * getLocationGroup()
+	 */
+	@Override
+	public String getLocationGroup() {
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/osttrace/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+Implementation for OST format specific rules
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,9 @@
+<html><body>
+Provides compile-time configuration of TraceCompiler behavior. 
+The features that can be adjusted via this package are:
+<ul>
+<li>Dialog templates</li>
+<li>Trace object rules</li>
+<li>Dialog flags</li>
+</ul>
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/Messages.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 2010 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:
+*
+* Localized strings for engine package
+*
+*/
+package com.nokia.tracecompiler.engine.source;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+
+	/**
+	 * Bundle name
+	 */	
+	private static final String BUNDLE_NAME = "com.nokia.tracecompiler.engine.source.messages"; //$NON-NLS-1$
+
+	/**
+	 * Bundle
+	 */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Prevents construction
+	 */
+	private Messages() {
+	}
+
+	/**
+	 * Gets localized string based on key
+	 * 
+	 * @param key
+	 *            the resource key
+	 * @return the localized resource
+	 */
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceEngine.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Source engine manages source documents that are opened to Eclipse UI
+*
+*/
+package com.nokia.tracecompiler.engine.source;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.source.SourceDocumentInterface;
+import com.nokia.tracecompiler.source.SourceDocumentMonitor;
+import com.nokia.tracecompiler.source.SourceDocumentProcessor;
+import com.nokia.tracecompiler.utils.DocumentFactory;
+
+/**
+ * Source engine manages source documents that are opened to Eclipse UI.
+ * 
+ */
+public class SourceEngine implements SourceDocumentProcessor,
+		Iterable<SourceProperties> {
+
+	/**
+	 * Document monitor
+	 */
+	private SourceDocumentMonitor documentMonitor;
+
+	/**
+	 * Trace model listener implementation
+	 */
+	private SourceEngineModelListener modelListener = new SourceEngineModelListener(
+			this);
+
+	/**
+	 * Trace model extension listener
+	 */
+	private SourceEngineModelExtensionListener extensionListener = new SourceEngineModelExtensionListener(
+			this);
+
+	/**
+	 * The callback interfaces are notified about source file changes
+	 */
+	private ArrayList<SourceListener> listeners = new ArrayList<SourceListener>();
+
+	/**
+	 * Running flag
+	 */
+	private boolean running;
+
+	/**
+	 * Trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * Source list
+	 */
+	private ArrayList<SourceProperties> tempList = new ArrayList<SourceProperties>();
+
+	/**
+	 * Read-only files
+	 */
+	private String[] READ_ONLY = { ".h" //$NON-NLS-1$
+	};
+
+	/**
+	 * Non-source file list
+	 */
+	private ArrayList<String> nonSourceFiles = new ArrayList<String>();
+
+	/**
+	 * Constructor
+	 * 
+	 * @param model
+	 *            the trace model
+	 */
+	public SourceEngine(TraceModel model) {
+		this.model = model;
+	}
+
+	/**
+	 * Starts this engine. Does nothing if already running
+	 * @throws Exception 
+	 */
+	public void start() throws Exception {
+		if (!running) {
+			documentMonitor = DocumentFactory.getDocumentMonitor();
+			documentMonitor.startMonitor(this);
+			running = true;
+			model.addModelListener(modelListener);
+			model.addExtensionListener(extensionListener);
+		}
+	}
+
+	/**
+	 * Shuts down the source engine. Does nothing if already stopped
+	 */
+	public void shutdown() {
+		if (running) {
+			documentMonitor.stopMonitor();
+			documentMonitor = null;
+			running = false;
+			model.removeModelListener(modelListener);
+			model.removeExtensionListener(extensionListener);
+		}
+	}
+
+	/**
+	 * Adds source listener callback interface
+	 * 
+	 * @param listener
+	 *            the new listener
+	 */
+	public void addSourceListener(SourceListener listener) {
+		listeners.add(listener);
+	}
+
+	/**
+	 * Removes a source listener
+	 * 
+	 * @param listener
+	 *            the listener to be removed
+	 */
+	public void removeSourceListener(SourceListener listener) {
+		listeners.remove(listener);
+	}
+
+	/**
+	 * Gets the sources
+	 * 
+	 * @return the sources
+	 */
+	public Iterator<SourceProperties> getSources() {
+		tempList.clear();
+		for (SourceDocumentInterface doc : documentMonitor) {
+			tempList.add((SourceProperties) doc.getOwner());
+		}
+		return tempList.iterator();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Iterable#iterator()
+	 */
+	public Iterator<SourceProperties> iterator() {
+		return getSources();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentProcessor#
+	 *      sourceOpened(com.nokia.tracecompiler.source.SourceDocumentInterface)
+	 */
+	public void sourceOpened(SourceDocumentInterface source) throws TraceCompilerException {
+		SourceProperties properties = new SourceProperties(model,
+				documentMonitor.getFactory(), source);
+		// Headers are marked read-only
+		for (String s : READ_ONLY) {
+			String fileName = properties.getFileName();
+			if (fileName != null && fileName.endsWith(s)) {
+				properties.setReadOnly(true);
+				break;
+			}
+		}
+		properties.sourceOpened();
+		source.setOwner(properties);
+		for (SourceListener l : listeners) {
+			l.sourceOpened(properties);
+		}
+	}
+
+	/**
+	 * Adds a non-source file to this list.
+	 * 
+	 * @param filePath
+	 *            the non-source file path to added
+	 */
+	public void addNonSourceFile(String filePath) {
+		nonSourceFiles.add(filePath);
+	}
+
+	/**
+	 * Removes a non-source file from this list
+	 * 
+	 * @param filePath
+	 *            the non-source file path to be removed
+	 * @return true if removed
+	 */
+	public boolean removeNonSourceFile(String filePath) {
+		boolean retVal = nonSourceFiles.remove(filePath);
+		return retVal;
+	}
+
+	/**
+	 * Gets list of non-source files
+	 * 
+	 * @return the list of non-source file paths
+	 */
+	public ArrayList<String> getNonSourceFiles() {
+		return nonSourceFiles;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceEngineModelExtensionListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,62 @@
+/*
+* 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:
+*
+* Trace model extension listener implementation for SourceEngine
+*
+*/
+package com.nokia.tracecompiler.engine.source;
+
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceModelExtensionListener;
+import com.nokia.tracecompiler.model.TraceObject;
+
+/**
+ * Trace model extension listener implementation for SourceEngine
+ * 
+ */
+final class SourceEngineModelExtensionListener implements
+		TraceModelExtensionListener {
+
+	/**
+	 * Constructor
+	 * 
+	 * @param engine
+	 *            the source engine
+	 */
+	SourceEngineModelExtensionListener(SourceEngine engine) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      extensionAdded(com.nokia.tracecompiler.model.TraceObject,
+	 *      com.nokia.tracecompiler.model.TraceModelExtension)
+	 */
+	public void extensionAdded(TraceObject object, TraceModelExtension extension) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      extensionRemoved(com.nokia.tracecompiler.model.TraceObject,
+	 *      com.nokia.tracecompiler.model.TraceModelExtension)
+	 */
+	public void extensionRemoved(TraceObject object,
+			TraceModelExtension extension) {
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceEngineModelListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Trace model listener implementation for SourceEngine
+*
+*/
+package com.nokia.tracecompiler.engine.source;
+
+import com.nokia.tracecompiler.model.TraceModelListener;
+import com.nokia.tracecompiler.model.TraceObject;
+
+/**
+ * Trace model listener implementation for SourceEngine
+ * 
+ */
+final class SourceEngineModelListener implements TraceModelListener {
+
+	/**
+	 * Constructor
+	 * 
+	 * @param engine
+	 *            the source engine
+	 */
+	SourceEngineModelListener(SourceEngine engine) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      objectAdded(com.nokia.tracecompiler.model.TraceObject,
+	 *      com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectAdded(TraceObject owner, TraceObject object) {
+		// Update is called from TraceCompiler engine
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      objectRemoved(com.nokia.tracecompiler.model.TraceObject,
+	 *      com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectRemoved(TraceObject owner, TraceObject object) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      objectCreationComplete(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectCreationComplete(TraceObject object) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      propertyUpdated(com.nokia.tracecompiler.model.TraceObject, int)
+	 */
+	public void propertyUpdated(TraceObject object, int property) {
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceFormatter.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,305 @@
+/*
+ * Copyright (c) 2010 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:
+ *
+ * Formatting rules are provided by Trace objects
+ *
+ */
+package com.nokia.tracecompiler.engine.source;
+
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.rules.StateTraceRule;
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.plugin.TraceFormatConstants;
+import com.nokia.tracecompiler.plugin.TraceAPIFormatter.TraceFormatType;
+import com.nokia.tracecompiler.source.SourceConstants;
+import com.nokia.tracecompiler.source.SourceUtils;
+import com.nokia.tracecompiler.source.SymbianConstants;
+
+/**
+ * Static functions for source formatting
+ * 
+ */
+public class SourceFormatter {
+
+	/**
+	 * Value parameter name
+	 */
+	public static final String VALUE_PARAMETER_NAME = "value"; //$NON-NLS-1$	
+
+	/**
+	 * Event start trace id parameter name
+	 */
+	public static final String EVENT_START_TRACE_ID_PARAMETER_NAME = "linkToStart"; //$NON-NLS-1$		
+
+	/**
+	 * Constructor is hidden
+	 */
+	private SourceFormatter() {
+	}
+
+	/**
+	 * Formats a trace to string format using the formatting rule from the trace
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @param formatType
+	 *            the type of format
+	 * @return the trace string
+	 */
+	public static String formatTrace(Trace trace, TraceFormatType formatType) {
+		return formatTrace(trace, null, formatType, null, false);
+	}
+
+	/**
+	 * Formats a trace to string format
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @param traceRule
+	 *            the formatting rule to be used
+	 * @param formatType
+	 *            the type of format
+	 * @param tags
+	 *            the tags for parameters or null if parameter names are used
+	 * @param fixedTags
+	 *            true if the <i>tags</i> iterator is fixed, false if the
+	 *            contents of <i>tags</i> should go through
+	 *            <code>SourceRule.mapNameToSource</code>
+	 * @return the trace string
+	 */
+	static String formatTrace(Trace trace, TraceFormattingRule traceRule,
+			TraceFormatType formatType, Iterator<String> tags, boolean fixedTags) {
+		StringBuffer data = new StringBuffer();
+		String format = null;
+		if (traceRule == null) {
+
+			// If rule is not explicitly provided, it is fetched from the trace
+			traceRule = trace.getExtension(TraceFormattingRule.class);
+			if (traceRule == null) {
+
+				// If trace does not have a formatting rule, the project API's
+				// should implement default rule
+				traceRule = trace.getModel().getExtension(
+						TraceFormattingRule.class);
+			}
+		}
+		if (traceRule != null) {
+			format = traceRule.getFormat(trace, formatType);
+		}
+		if (format != null && traceRule != null) {
+			data.append(format);
+			data.append(SourceConstants.LINE_FEED);
+			buildParameterList(trace, traceRule, data, formatType, tags,
+					fixedTags);
+
+			String traceName = traceRule.mapNameToSource(trace);
+			String traceGroupName = trace.getGroup().getName();
+
+			// %NAME% is replaced with rule-mapped trace name
+			replaceData(data, traceName, TraceFormatConstants.NAME_FORMAT);
+
+			// %GROUP% is replaced with group name
+			replaceData(data, traceGroupName, TraceFormatConstants.GROUP_FORMAT);
+
+			// %TEXT% is replaced with trace text
+			replaceData(data, "\"" + trace.getTrace() //$NON-NLS-1$
+					+ "\"", TraceFormatConstants.TEXT_FORMAT); //$NON-NLS-1$
+
+			// %FORMATTED_TRACE% is replaced with trace data
+			replaceData(data, trace.getTrace(),
+					TraceFormatConstants.FORMATTED_TRACE);
+
+			// Comment is inserted before the trace
+			int index = data.indexOf(TraceFormatConstants.COMMENT_FORMAT);
+			if (index >= 0) {
+				String comment = data.substring(index + 1);
+				data.delete(index, data.length());
+				data.insert(0, comment);
+				data.append(SourceConstants.LINE_FEED);
+			}
+		}
+
+		// If trace does not have formatting, it is not shown in source
+		return data.toString();
+	}
+
+	/**
+	 * Adds the parameters to the data buffer
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @param format
+	 *            the formatter from trace
+	 * @param data
+	 *            the data buffer where the formatted data is stored
+	 * @param formatType
+	 *            the format type to be applied
+	 * @param tags
+	 *            the tags for parameters or null if parameter names are used
+	 * @param fixedTags
+	 *            true if the <i>tags</i> iterator is fixed, false if the
+	 *            contents of <i>tags</i> should go through
+	 *            <code>SourceRule.mapNameToSource</code>
+	 */
+	private static void buildParameterList(Trace trace,
+			TraceFormattingRule format, StringBuffer data,
+			TraceFormatType formatType, Iterator<String> tags, boolean fixedTags) {
+
+		int count = trace.getParameterCount();
+
+		Iterator<TraceParameter> itr = trace.getParameters();
+		StringBuffer paramList = new StringBuffer();
+		// Index is incremented by one for each parameter that has been added to
+		// source
+		int parameterIndex = 0;
+		while (itr.hasNext()) {
+			TraceParameter param = itr.next();
+			TraceParameterFormattingRule rule = param
+					.getExtension(TraceParameterFormattingRule.class);
+			String name;
+			// Count and name may be adjusted by rules provided by parameters
+			if (rule != null) {
+				boolean isInSource = rule.isShownInSource();
+				// If the parameter iterator is explicitly provided, the
+				// parameter name is fetched from it. If the parameter list does
+				// not have enough tags (for example when a new parameter is
+				// added to trace) the name of the parameter is used. The source
+				// rule is used to map the parameter name to correct format
+				if (isInSource) {
+					name = getTagWithoutMapping(tags, param);
+					addParameter(paramList, param, name, ++parameterIndex,
+							formatType);
+				} else {
+					// If the parameter is not shown in source, it is skipped
+					count--;
+				}
+			} else {
+				// If the parameter is not associated with a source rule, it is
+				// added without mapping
+				name = getTagWithoutMapping(tags, param);
+				addParameter(paramList, param, name, ++parameterIndex,
+						formatType);
+			}
+		}
+		// %PC% is replaced with adjusted parameter count
+		// In case of packed trace, the header engine does the count mapping
+		if (formatType != TraceFormatType.TRACE_PACKED) {
+			String val = format.mapParameterCountToSource(trace, count);
+
+			if (trace.getExtension(StateTraceRule.class) != null
+					&& data.toString().startsWith("OstTraceState")) { //$NON-NLS-1$
+
+				// In case of State Trace macro value in trace macro is
+				// parameter count - 2
+				if (count > 1) {
+					val = String.valueOf(count - 2); // CodForChk_Dis_Magic
+				} else {
+					val = String.valueOf(count);
+				}
+			}
+			replaceData(data, val, TraceFormatConstants.PARAM_COUNT_FORMAT);
+		}
+		// %PARAMETERS% is replaced with parameter names
+		replaceData(data, paramList.toString(),
+				TraceFormatConstants.PARAMETERS_FORMAT);
+	}
+
+	/**
+	 * Gets the name for a parameter without source rule mapping. If the tags
+	 * iterator contains a valid entry, the name is fetched from it. If not, the
+	 * parameter name is used instead.
+	 * 
+	 * @param tags
+	 *            the list of tags
+	 * @param param
+	 *            the parameter
+	 * @return the parameter name
+	 */
+	private static String getTagWithoutMapping(Iterator<String> tags,
+			TraceParameter param) {
+		String name;
+		// If the parameter iterator is explicitly provided, the
+		// parameter name is fetched from it
+		if (tags != null && tags.hasNext()) {
+			name = tags.next();
+			// The list may contain 0-length items to represent
+			// that that parameter name should be used instead
+			if (name == null || name.length() == 0) {
+				name = param.getName();
+			}
+		} else {
+			name = param.getName();
+		}
+		return name;
+	}
+
+	/**
+	 * Adds a parameter to the parameter list
+	 * 
+	 * @param paramList
+	 *            the parameter list
+	 * @param param
+	 *            the parameter to be added
+	 * @param name
+	 *            a name replacement for the parameter
+	 * @param parameterIndex
+	 *            the index of the parameter
+	 * @param formatType
+	 *            the type of the format
+	 */
+	private static void addParameter(StringBuffer paramList,
+			TraceParameter param, String name, int parameterIndex,
+			TraceFormatType formatType) {
+		paramList.append(SourceConstants.PARAMETER_SEPARATOR);
+		if (formatType == TraceFormatType.HEADER) {
+			paramList.append(SourceUtils.mapParameterTypeToSymbianType(param));
+			paramList.append(SourceConstants.SPACE_CHAR);
+			paramList.append(SymbianConstants.PARAMETER_DECLARATION_PREFIX);
+			paramList.append(parameterIndex);
+		} else if (formatType == TraceFormatType.EMPTY_MACRO) {
+			paramList.append(SymbianConstants.PARAMETER_DECLARATION_PREFIX);
+			paramList.append(parameterIndex);
+		}
+	}
+
+	/**
+	 * Replaces data from the stringbuffer
+	 * 
+	 * @param data
+	 *            the data
+	 * @param replaceData
+	 *            the data to be used
+	 * @param replaceFormat
+	 *            the format to be replaced
+	 */
+	private static void replaceData(StringBuffer data, String replaceData,
+			String replaceFormat) {
+		TraceCompilerEngineGlobals.getEvents().postInfoMessage(Messages.getString("SourceFormatter.replaceAllBeginText") + replaceFormat + Messages.getString("SourceFormatter.replaceAllMiddleText") + replaceData , null); //$NON-NLS-1$ //$NON-NLS-2$
+
+		int replaceOffset = 0;
+		do {
+			replaceOffset = data.indexOf(replaceFormat, replaceOffset);
+			if (replaceOffset >= 0) {
+				data.replace(replaceOffset, replaceOffset
+						+ replaceFormat.length(), replaceData);
+				replaceOffset += replaceData.length();
+			}
+		} while (replaceOffset != -1);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* 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:
+*
+* Interface that is notified about changes in source documents
+*
+*/
+package com.nokia.tracecompiler.engine.source;
+
+import com.nokia.tracecompiler.model.TraceCompilerException;
+
+
+/**
+ * Interface that is notified about changes in source documents managed by
+ * {@link SourceEngine}
+ * 
+ */
+public interface SourceListener {
+
+	/**
+	 * Event that is fired when a source is opened
+	 * 
+	 * @param properties
+	 *            the source properties
+	 * @throws TraceCompilerException 
+	 */
+	public void sourceOpened(SourceProperties properties) throws TraceCompilerException;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceLocationRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,65 @@
+/*
+* 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:
+*
+* Rules for mapping trace model entries into source code
+*
+*/
+package com.nokia.tracecompiler.engine.source;
+
+import com.nokia.tracecompiler.model.TraceObjectRule;
+
+/**
+ * Rules for relocating traces in source code
+ * 
+ */
+public interface SourceLocationRule extends TraceObjectRule {
+
+	/**
+	 * Rule type for context-relative location
+	 */
+	int CONTEXT_RELATIVE = 1;
+
+	/**
+	 * Rule type for absolute location
+	 */
+	int ABSOLUTE = 2;
+
+	/**
+	 * Gets the rule type
+	 * 
+	 * @return rule type
+	 */
+	public int getLocationType();
+
+	/**
+	 * Gets the offset where the trace is inserted
+	 * 
+	 * @return the offset
+	 */
+	public int getLocationOffset();
+
+	/**
+	 * Flag which determines whether this locator should be removed from the
+	 * trace after the trace has been inserted to source. If this is left to the
+	 * trace, the trace is relocated every time it is inserted.
+	 * <p>
+	 * Note that if this returns false, the extension should also be persistent
+	 * so that the relocations work over TraceCompiler restarts.
+	 * 
+	 * @return true if this should be removed after insertion
+	 */
+	public boolean isRemovedAfterInsert();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceParserResult.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,54 @@
+/*
+* 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:
+*
+* Result from parameter parsing
+*
+*/
+package com.nokia.tracecompiler.engine.source;
+
+import java.util.List;
+
+/**
+ * Result from parameter parsing
+ * 
+ */
+public class SourceParserResult {
+
+	/**
+	 * Trace name as parsed from source
+	 */
+	public String originalName;
+
+	/**
+	 * Parsed name after conversion to valid name
+	 */
+	public String convertedName;
+
+	/**
+	 * Trace text as parsed from source
+	 */
+	public String traceText;
+
+	/**
+	 * Parameters parsed from source
+	 */
+	public List<String> parameters;
+
+	/**
+	 * List of parser-specific data
+	 */
+	public List<String> parserData;
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceParserRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,131 @@
+/*
+* 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:
+*
+* Rule interface for tags to be searched from source files
+*
+*/
+package com.nokia.tracecompiler.engine.source;
+
+import java.util.List;
+
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceObjectRule;
+import com.nokia.tracecompiler.project.TraceLocationParser;
+
+/**
+ * Rule interface for tags to be searched from source files
+ * 
+ */
+public interface SourceParserRule extends TraceObjectRule {
+
+	/**
+	 * Parameter conversion result
+	 */
+	public class ParameterConversionResult {
+
+		/**
+		 * Parameter name
+		 */
+		public String name;
+
+		/**
+		 * Parameter type
+		 */
+		public String type;
+
+		/**
+		 * Parameter extensions
+		 */
+		public List<TraceModelExtension> extensions;
+	}
+
+	/**
+	 * Trace location conversion result
+	 */
+	public class TraceConversionResult {
+
+		/**
+		 * Name of the group where the trace goes to
+		 */
+		public String group;
+
+		/**
+		 * Name for the trace
+		 */
+		public String name;
+
+		/**
+		 * Text for the trace
+		 */
+		public String text;
+
+		/**
+		 * List of parameters
+		 */
+		public List<ParameterConversionResult> parameters;
+
+		/**
+		 * Extensions for the trace
+		 */
+		public List<TraceModelExtension> extensions;
+
+	}
+
+	/**
+	 * Gets the name of this parser
+	 * 
+	 * @return the name
+	 */
+	public String getName();
+
+	/**
+	 * Gets the source tag to be located from source
+	 * 
+	 * @return the tag name
+	 */
+	public String getSearchTag();
+
+	/**
+	 * Checks if the trace tag suffix is allowed
+	 * 
+	 * @param tagSuffix
+	 *            the tag to be checked
+	 * @return true if allowed, false if not
+	 */
+	public boolean isAllowedTagSuffix(String tagSuffix);
+
+	/**
+	 * Parses a parameter list found from source
+	 * 
+	 * @param tag
+	 *            the location tag
+	 * @param list
+	 *            list of parameters
+	 * @return the parameter list
+	 * @throws TraceCompilerException
+	 *             if parameter list is not valid
+	 */
+	public SourceParserResult parseParameters(String tag, List<String> list)
+			throws TraceCompilerException;
+
+	/**
+	 * Gets the location parser interface
+	 * 
+	 * @return the location parser
+	 */
+	public TraceLocationParser getLocationParser();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceProperties.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,471 @@
+/*
+ * Copyright (c) 2010 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:
+ *
+ * Properties of a source document opened to Eclipse editor
+ *
+ */
+package com.nokia.tracecompiler.engine.source;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineConfiguration;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceLocation;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.source.SourceDocumentFactory;
+import com.nokia.tracecompiler.source.SourceDocumentInterface;
+import com.nokia.tracecompiler.source.SourceIterator;
+import com.nokia.tracecompiler.source.SourceParser;
+import com.nokia.tracecompiler.source.SourceParserException;
+import com.nokia.tracecompiler.source.SourcePropertyProvider;
+import com.nokia.tracecompiler.source.SourceStringSearch;
+
+/**
+ * Properties of a source document which contains trace locations
+ * 
+ */
+public class SourceProperties implements Iterable<TraceLocation> {
+
+	/**
+	 * Trace locations within the source
+	 */
+	private ArrayList<TraceLocation> locations = new ArrayList<TraceLocation>();
+
+	/**
+	 * Source parser
+	 */
+	private SourceParser sourceParser;
+
+	/**
+	 * Offset is stored in preProcess and reset in postProcess.
+	 */
+	private int firstChangedLocation = -1;
+
+	/**
+	 * Offset is stored in preProcess and reset in postProcess.
+	 */
+	private int firstUnchangedLocation = -1;
+
+	/**
+	 * The searchers for trace identifiers
+	 */
+	private ArrayList<SourceStringSearch> searchers = new ArrayList<SourceStringSearch>();
+
+	/**
+	 * Start index for calls to parseTrace
+	 */
+	private int searchStartIndex;
+
+	/**
+	 * Read-only flag
+	 */
+	private boolean readOnly;
+
+	/**
+	 * Creates source properties for given source document
+	 * 
+	 * @param model
+	 *            the trace model
+	 * @param framework
+	 *            the document framework
+	 * @param document
+	 *            the document
+	 */
+	SourceProperties(TraceModel model, SourceDocumentFactory framework,
+			SourceDocumentInterface document) {
+		sourceParser = new SourceParser(framework, document);
+		Iterator<SourceParserRule> parsers = model
+				.getExtensions(SourceParserRule.class);
+		while (parsers.hasNext()) {
+			// The rule defines what to search and how to interpret the
+			// parameters. It is stored into the searcher as search data
+			addParserRule(parsers.next());
+		}
+	}
+
+	/**
+	 * Gets the source parser
+	 * 
+	 * @return the parser
+	 */
+	public SourceParser getSourceParser() {
+		return sourceParser;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Iterable#iterator()
+	 */
+	public Iterator<TraceLocation> iterator() {
+		return locations.iterator();
+	}
+
+	/**
+	 * Gets the file name of this source
+	 * 
+	 * @return the name
+	 */
+	public String getFileName() {
+		String retval = null;
+		if (sourceParser != null) {
+			SourceDocumentInterface source = sourceParser.getSource();
+			if (source != null) {
+				SourcePropertyProvider provider = source.getPropertyProvider();
+				if (provider != null) {
+					retval = provider.getFileName();
+				}
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Sets the read-only flag for this source. Traces cannot be added to
+	 * read-only sources, but they can be parsed for data
+	 * 
+	 * @param readOnly
+	 *            the read-only flag
+	 */
+	void setReadOnly(boolean readOnly) {
+		this.readOnly = readOnly;
+	}
+
+	/**
+	 * Gets the read-only flag
+	 * 
+	 * @return read-only flag
+	 */
+	public boolean isReadOnly() {
+		return readOnly;
+	}
+
+	/**
+	 * Source opened notification
+	 */
+	void sourceOpened() {
+		updateTraces(0, sourceParser.getDataLength());
+	}
+
+	/**
+	 * Parses the document starting from given offset and locates the trace
+	 * entries from it. The first unchanged trace entry stops the search
+	 * 
+	 * @param startOffset
+	 *            the offset where to start the search
+	 * @param endOffset
+	 *            the offset where to end the search
+	 */
+	private void updateTraces(int startOffset, int endOffset) {
+		Iterator<SourceStringSearch> itr = searchers.iterator();
+		while (itr.hasNext()) {
+			SourceStringSearch searcher = itr.next();
+			searcher.resetSearch(startOffset, endOffset);
+			updateTraces(endOffset, searcher);
+		}
+	}
+
+	/**
+	 * Uses the given SourceSearch to parse traces
+	 * 
+	 * @param end
+	 *            the offset where parser should stop
+	 * @param searcher
+	 *            the searcher
+	 */
+	private void updateTraces(int end, SourceStringSearch searcher) {
+		int offset;
+		searchStartIndex = 0;
+		// If not updating, the entries contents are processed
+		do {
+			offset = searcher.findNext();
+			try {
+				if (offset != -1 && offset < end) {
+					String tag = isValidTrace(offset, searcher
+							.getSearchString().length(), searcher, false);
+					if (tag != null) {
+						parseTrace(offset, (SourceParserRule) searcher
+								.getSearchData(), tag);
+					}
+				}
+			} catch (SourceParserException e) {
+				TraceLocation location = new TraceLocation(this, offset,
+						offset + 80);
+				TraceCompilerEngineGlobals
+						.getEvents()
+						.postErrorMessage(
+								Messages
+										.getString("SourceProperties.parsingArrowAtBeginText") + location.getFilePath() + location.getFileName() + Messages.getString("SourceProperties.parsingArrownAtMiddleText") + location.getLineNumber(), null, true); //$NON-NLS-1$ //$NON-NLS-2$
+				// If the parameters cannot be parsed, the trace is
+				// not added to the array
+			}
+		} while (offset != -1 && offset < end);
+	}
+
+	/**
+	 * Parses a trace found from the document and adds it to the document's list
+	 * of positions. The position updater keeps the trace location up-to-date.
+	 * 
+	 * @param offset
+	 *            the offset to the trace
+	 * @param parserRule
+	 *            the parser to be attached to the location
+	 * @param locationTag
+	 *            the tag of the location
+	 * @throws SourceParserException
+	 *             if trace cannot be parsed
+	 */
+	private void parseTrace(int offset, SourceParserRule parserRule,
+			String locationTag) throws SourceParserException {
+		int arrayIndex = -1;
+		// Checks the changed locations. If a matching offset if found, the
+		// location is an existing one. In that case the location is not
+		// added to the array. If an offset larger than the new offset is
+		// found from the array, the location is inserted into that slot. If
+		// all locations within the array are smaller than the new offset,
+		// the new location is inserted before the first unchanged location.
+		// Since the locations in the array are ordered, the checking can
+		// always start from the latest location that has been found from
+		// the array. The caller of this function must set
+		// parseTraceStartIndex to 0 before starting a loop where this
+		// function is called. If firstUnchangedLocation is -1, this is the
+		// first time the file is being parsed and thus all locations are
+		// checked
+		boolean found = false;
+		int searchEndIndex;
+		int newSearchStartIndex = -1;
+		if (firstUnchangedLocation >= 0) {
+			searchEndIndex = firstUnchangedLocation;
+		} else {
+			searchEndIndex = locations.size();
+		}
+		for (int i = searchStartIndex; i < searchEndIndex && !found; i++) {
+			TraceLocation location = locations.get(i);
+			// Deleted locations are ignored. If a trace was replaced, the
+			// new offset will match the offset of the deleted one.
+			if (!location.isDeleted()) {
+				// If the offset of the trace matches an existing offset,
+				// the trace is old one. If the offset within the array is
+				// larger than the source offset, the trace found from
+				// source is new.
+				if (location.getOffset() == offset) {
+					found = true;
+					// Starts the next search from the value following the
+					// trace that was found
+					searchStartIndex = i + 1;
+					arrayIndex = -1;
+				} else if (location.getOffset() > offset) {
+					found = true;
+					// A new trace will be added into the current index, so
+					// the next search will start from the same location as
+					// was checked now. The index is updated after the trace has
+					// succesfully been created
+					newSearchStartIndex = i + 1;
+					arrayIndex = i;
+				}
+			}
+		}
+		// If trace was not found from the list, the trace is new and all
+		// traces following it are also new. The start index is set to point
+		// past the first unchanged location and thus the next search will
+		// ignore the above loop.
+		if (!found) {
+			arrayIndex = searchEndIndex;
+			searchStartIndex = firstUnchangedLocation + 1;
+		}
+		if (arrayIndex >= 0) {
+			// Creates a new location if it was not found
+			ArrayList<String> list = new ArrayList<String>();
+			int endOfTrace = sourceParser
+					.tokenizeParameters(offset, list, true);
+
+			TraceLocation location = new TraceLocation(this, offset, endOfTrace
+					- offset);
+
+			// The parser rules have been associated with the searchers. The
+			// parser rule that found the location is associated with the
+			// location and used to process its parameters
+			location.setTag(locationTag);
+			location.setParserRule(parserRule);
+			location.setData(list);
+
+			TraceCompilerEngineGlobals
+					.getEvents()
+					.postInfoMessage(
+							Messages
+									.getString("SourceProperties.newTraceLocationFoundBeginText") + location.getFilePath() + location.getFileName() + Messages.getString("SourceProperties.newTraceLocationFoundMiddleText") + location.getLineNumber() + Messages.getString("SourceProperties.newTraceLocationFoundEndText") + location.getTraceText(), null); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+
+			locations.add(arrayIndex, location);
+			// The changed flag is set to newly added traces. If a location
+			// is added prior to the first changed location, the index of first
+			// changed location needs to be adjusted so that the flag gets
+			// cleared in postprocessing. Also the index of first unchanged
+			// location needs to be updated to reflect the changed array
+			if (firstUnchangedLocation >= 0) {
+				location.setContentChanged(true);
+				if (arrayIndex < firstChangedLocation) {
+					firstChangedLocation = arrayIndex;
+				}
+				firstUnchangedLocation++;
+			}
+			// Updates the search start index if trace creation was succesful
+			if (newSearchStartIndex >= 0) {
+				searchStartIndex = newSearchStartIndex;
+			}
+		}
+	}
+
+	/**
+	 * Checks that a trace is valid
+	 * 
+	 * @param offset
+	 *            offset to trace identifier
+	 * @param length
+	 *            length of trace
+	 * @param searcher
+	 *            the source searcher
+	 * @param checkMainTag
+	 *            true if the main search tag needs to be checked, false if only
+	 *            the tag suffix is checked
+	 * @return the trace tag or null if trace is not valid
+	 */
+	private String isValidTrace(int offset, int length,
+			SourceStringSearch searcher, boolean checkMainTag) {
+		String retval = null;
+		try {
+			int idlen = searcher.getSearchString().length();
+			int idend = offset + idlen;
+			if (checkMainTag) {
+				if (length >= idlen
+						&& searcher.isSearchStringMatch(sourceParser.getData(
+								offset, idlen))) {
+					// The previous character must be a separator or white space
+					if (offset == 0
+							|| !Character.isJavaIdentifierPart(sourceParser
+									.getData(offset - 1))) {
+						retval = getSearchTag(offset, idend);
+					}
+				}
+			} else {
+				// If main tag is not checked
+				retval = getSearchTag(offset, idend);
+			}
+			retval = verifyTag(searcher, retval, idlen);
+		} catch (Exception e) {
+			if (TraceCompilerEngineConfiguration.ASSERTIONS_ENABLED) {
+				TraceCompilerEngineGlobals.getEvents().postAssertionFailed(
+						"Trace validity check failed", e); //$NON-NLS-1$
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Verifies the tag against tag suffixes from parser
+	 * 
+	 * @param searcher
+	 *            the searcher
+	 * @param tag
+	 *            the tag include main tag and suffix
+	 * @param idlen
+	 *            the length of the main tag
+	 * @return the tag if it is valid, null if not
+	 */
+	private String verifyTag(SourceStringSearch searcher, String tag, int idlen) {
+		if (tag != null) {
+			// The trace suffix is verified by the parser. For example, if
+			// search data is "SymbianTrace" and the tag found from source
+			// is "SymbianTraceData1", the parser checks if "Data1" is a
+			// valid trace tag suffix.
+			if (!((SourceParserRule) searcher.getSearchData())
+					.isAllowedTagSuffix(tag.substring(idlen))) {
+				tag = null;
+			}
+		}
+		return tag;
+	}
+
+	/**
+	 * Gets the search tag between offset and next '(' character
+	 * 
+	 * @param offset
+	 *            the start of tag
+	 * @param idend
+	 *            the end of tag
+	 * @return the tag
+	 * @throws SourceParserException
+	 *             if parser fails
+	 */
+	private String getSearchTag(int offset, int idend)
+			throws SourceParserException {
+		// Locates the parameters starting from trace identifier
+		String retval = null;
+		SourceIterator srcitr = sourceParser.createIterator(idend - 1,
+				SourceParser.SKIP_ALL);
+		boolean found = false;
+		while (srcitr.hasNext() && !found) {
+			char c = srcitr.next();
+			if (c == ';') {
+				// Trace must have parameters
+				found = true;
+			} else if (c == '(') {
+				found = true;
+				// Stores the tag into location
+				retval = sourceParser.getData(offset, srcitr.previousIndex()
+						- offset + 1);
+			} else if (srcitr.hasSkipped()) {
+				// White spaces are not allowed within trace tag
+				found = true;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Checks if a trace can be inserted into given location
+	 * 
+	 * @param offset
+	 *            the offset to the location
+	 * @return true if location is valid
+	 */
+	boolean checkInsertLocation(int offset) {
+		boolean retval = true;
+		try {
+			offset = sourceParser.findStartOfLine(offset, false, true);
+			if (sourceParser.isInExcludedArea(offset)) {
+				retval = false;
+			}
+		} catch (SourceParserException e) {
+			retval = false;
+		}
+		return retval;
+	}
+
+	/**
+	 * Adds a new parser
+	 * 
+	 * @param rule
+	 *            the new parser rule
+	 */
+	void addParserRule(SourceParserRule rule) {
+		SourceStringSearch searcher = sourceParser.startStringSearch(rule
+				.getSearchTag(), 0, -1, SourceParser.MATCH_WORD_BEGINNING
+				| SourceParser.SKIP_ALL);
+		searcher.setSearchData(rule);
+		searchers.add(searcher);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/TraceFormattingRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,64 @@
+/*
+* 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:
+*
+* Formatting rules are provided by Trace objects
+*
+*/
+package com.nokia.tracecompiler.engine.source;
+
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceObjectRule;
+import com.nokia.tracecompiler.plugin.TraceAPIFormatter.TraceFormatType;
+
+/**
+ * Formatting rules are stored into traces as extension. When inserting a trace
+ * to source the formatting rules are used to convert the trace into source file
+ * representation.
+ * 
+ */
+public interface TraceFormattingRule extends TraceObjectRule {
+
+	/**
+	 * Gets the format for given trace
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @param formatType
+	 *            the type of the format requested
+	 * @return the format
+	 */
+	public String getFormat(Trace trace, TraceFormatType formatType);
+
+	/**
+	 * Maps the trace name to name shown in source
+	 * 
+	 * @param trace
+	 *            the trace to be mapped
+	 * @return the name shown in source
+	 */
+	public String mapNameToSource(Trace trace);
+
+	/**
+	 * Maps the parameter count to source.
+	 * 
+	 * @param trace
+	 *            the trace
+	 * @param count
+	 *            the parameter count
+	 * @return mapped parameter count
+	 */
+	public String mapParameterCountToSource(Trace trace, int count);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/TraceParameterFormattingRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,48 @@
+/*
+* 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:
+*
+* Rule interface for parameters
+*
+*/
+package com.nokia.tracecompiler.engine.source;
+
+import com.nokia.tracecompiler.model.TraceObjectRule;
+
+/**
+ * Rule interface for parameters. Each parameter may provide replacement text
+ * for the %EXT% formatting.
+ * 
+ */
+public interface TraceParameterFormattingRule extends TraceObjectRule {
+
+	/**
+	 * Determines if this object should be shown in source
+	 * 
+	 * @return true if shown in source, false otherwise
+	 */
+	public boolean isShownInSource();
+
+	/**
+	 * Maps parameter name to name shown in source. Note that the original name
+	 * passed to this function is not necessarily the name returned by
+	 * getOwner().getName()
+	 * 
+	 * @param originalName
+	 *            the original name to be inserted to source
+	 * @return the name shown in source
+	 */
+	public String mapNameToSource(String originalName);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/messages.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,7 @@
+SourceFormatter.replaceAllBeginText=Replacing all : 
+SourceFormatter.replaceAllMiddleText=\ by 
+SourceProperties.newTraceLocationFoundBeginText=New TraceLocation found : 
+SourceProperties.newTraceLocationFoundEndText=. Trace text: 
+SourceProperties.newTraceLocationFoundMiddleText=. Line : 
+SourceProperties.parsingArrowAtBeginText=Parsing arror at 
+SourceProperties.parsingArrownAtMiddleText=. Line : 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+Source engine monitors the source editors opened into Eclipse UI
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/utils/TraceMultiplierRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,43 @@
+/*
+* 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:
+*
+* Rule which can be used to create copies of new traces
+*
+*/
+package com.nokia.tracecompiler.engine.utils;
+
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceObjectRule;
+
+/**
+ * Rule which can be used to create copies of new traces
+ * 
+ */
+public interface TraceMultiplierRule extends TraceObjectRule {
+
+	/**
+	 * Gets copies of the given trace which is about to be inserted into given
+	 * context. The new trace is added first and the the copies will be inserted
+	 * after it in the order they are received from the iterator.
+	 * 
+	 * @param trace
+	 *            the new trace
+	 * @return a list of copies
+	 */
+	public Iterator<Trace> createCopies(Trace trace);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/utils/TraceUtils.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Utility functions related to traces
+*
+*/
+package com.nokia.tracecompiler.engine.utils;
+
+import com.nokia.tracecompiler.plugin.TraceFormatConstants;
+
+/**
+ * Utility functions related to traces
+ * 
+ */
+public final class TraceUtils {
+
+	/**
+	 * Underscore character
+	 */
+	private static final String UNDERSCORE = "_"; //$NON-NLS-1$
+
+	/**
+	 * Underscore character
+	 */
+	private static final char UNDERSCORE_CHAR = '_';
+
+	/**
+	 * Cannot be constructed
+	 */
+	private TraceUtils() {
+	}
+
+	/**
+	 * Formats a trace
+	 * 
+	 * @param format
+	 *            the format specification
+	 * @param cname
+	 *            the class name
+	 * @param fname
+	 *            the function name
+	 * @return the formatted trace
+	 */
+	public static String formatTrace(String format, String cname, String fname) {
+		StringBuffer sb = new StringBuffer(format);
+		int cnindex = sb
+				.indexOf(TraceFormatConstants.FORMAT_CLASS_NAME_NORMAL_CASE);
+		if (cnindex >= 0) {
+			if (cname != null) {
+				sb.replace(cnindex, cnindex
+						+ TraceFormatConstants.FORMAT_CLASS_NAME_NORMAL_CASE
+								.length(), cname);
+			} else {
+				sb.replace(cnindex, cnindex
+						+ TraceFormatConstants.FORMAT_CLASS_NAME_NORMAL_CASE
+								.length(), ""); //$NON-NLS-1$
+			}
+		}
+		int cnup = sb
+				.indexOf(TraceFormatConstants.FORMAT_CLASS_NAME_UPPER_CASE);
+		if (cnup >= 0) {
+			if (cname != null) {
+				sb.replace(cnup, cnup
+						+ TraceFormatConstants.FORMAT_CLASS_NAME_UPPER_CASE
+								.length(), cname.toUpperCase());
+			} else {
+				sb.replace(cnup, cnup
+						+ TraceFormatConstants.FORMAT_CLASS_NAME_UPPER_CASE
+								.length(), ""); //$NON-NLS-1$
+			}
+		}
+		int fnindex = sb
+				.indexOf(TraceFormatConstants.FORMAT_FUNCTION_NAME_NORMAL_CASE);
+		if (fnindex >= 0) {
+			sb.replace(fnindex, fnindex
+					+ TraceFormatConstants.FORMAT_FUNCTION_NAME_NORMAL_CASE
+							.length(), fname);
+		}
+		int fnup = sb
+				.indexOf(TraceFormatConstants.FORMAT_FUNCTION_NAME_UPPER_CASE);
+		if (fnup >= 0) {
+			sb.replace(fnup, fnup
+					+ TraceFormatConstants.FORMAT_FUNCTION_NAME_UPPER_CASE
+							.length(), fname.toUpperCase());
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Replaces invalid characters with '_'
+	 * 
+	 * @param name
+	 *            name to be converted
+	 * @return the converted name
+	 */
+	public static String convertName(String name) {
+		StringBuffer sb;
+		if (name.length() > 0) {
+			boolean underscore = false;
+			sb = new StringBuffer(name);
+			if (Character.isDigit(name.charAt(0))) {
+				sb.insert(0, UNDERSCORE_CHAR);
+			}
+			for (int i = 0; i < sb.length(); i++) {
+				char c = sb.charAt(i);
+				if (!Character.isLetterOrDigit(c)) {
+					if (!underscore) {
+						sb.setCharAt(i, UNDERSCORE_CHAR);
+						underscore = true;
+					} else {
+						sb.deleteCharAt(i);
+						i--;
+					}
+				} else {
+					underscore = false;
+				}
+			}
+			if (sb.length() > 0) {
+				if (sb.charAt(sb.length() - 1) == UNDERSCORE_CHAR) {
+					sb.deleteCharAt(sb.length() - 1);
+				}
+			} else {
+				sb.append(UNDERSCORE);
+			}
+		} else {
+			sb = new StringBuffer();
+		}
+		// If parameter value is NULL, it would be used as name
+		String s = sb.toString();
+		if (s.equals("NULL")) { //$NON-NLS-1$
+			s = "_NULL"; //$NON-NLS-1$
+		}
+		return s;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/utils/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+Miscellaneus utility functions and interfaces that should not be in the public API
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/file/FileCompareOutputStream.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,82 @@
+/*
+* 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:
+*
+* Output stream which compares the data to existing file before writing
+*
+*/
+package com.nokia.tracecompiler.file;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Output stream which writes to a byte array. When writing is complete, the
+ * array contents are compared to existing file and the file is written only if
+ * there are changes
+ * 
+ */
+public class FileCompareOutputStream extends ByteArrayOutputStream {
+
+	/**
+	 * The header file
+	 */
+	private File file;
+
+	/**
+	 * Creates a new stream
+	 * 
+	 * @param file
+	 *            the header file
+	 */
+	public FileCompareOutputStream(File file) {
+		this.file = file;
+	}
+
+	/**
+	 * Writes the buffer to file if it has changed
+	 * 
+	 * @return true if header was written, false if it matched the existing
+	 *         header
+	 * @throws IOException
+	 *             if writing fails
+	 */
+	public boolean writeFile() throws IOException {
+		// Compares the file length to number of bytes in array
+		boolean writeHeader = true;
+		if (file.length() == count) {
+			FileInputStream fis = new FileInputStream(file);
+			byte[] temp = new byte[count];
+			fis.read(temp);
+			fis.close();
+			writeHeader = false;
+			// Compares the file content
+			for (int i = 0; i < count; i++) {
+				if (temp[i] != buf[i]) {
+					writeHeader = true;
+					i = count;
+				}
+			}
+		}
+		if (writeHeader) {
+			OutputStream fos = FileUtils.createOutputStream(file);
+			writeTo(fos);
+			fos.close();
+		}
+		return writeHeader;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/file/FileUtils.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,218 @@
+/*
+* Copyright (c) 2008-2010 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 utility functions
+*
+*/
+package com.nokia.tracecompiler.file;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import com.nokia.tracecompiler.source.SourceConstants;
+
+/**
+ * File utility functions
+ * 
+ */
+public final class FileUtils {
+
+	/**
+	 * File copy buffer size
+	 */
+	private static final int COPY_BUFFER_SIZE = 4096; // CodForChk_Dis_Magic
+
+	/**
+	 * cpp extension
+	 */
+	public final static String CPP_EXTENSION = "cpp"; //$NON-NLS-1$	
+
+	/**
+	 * c extension
+	 */
+	public final static String C_EXTENSION = "c"; //$NON-NLS-1$	
+
+	/**
+	 * Allowed files
+	 */
+	private final static String[] FILE_FILTERS = { ".cpp", //$NON-NLS-1$
+			".c", //$NON-NLS-1$
+			".inl", //$NON-NLS-1$
+			".h" //$NON-NLS-1$
+	};
+
+	/**
+	 * MMP file extension
+	 */
+	public static final String MMP = ".mmp"; //$NON-NLS-1$
+
+	/**
+	 * number of times trying to create a directy(ies)
+	 */
+	private static final int MAX_DIRECTORY_CREATION_TRIES = 5;
+	
+	/**
+	 * Time to sleep between tries to create a directory(ies)
+	 */
+	private static final int SLEEP_TIME_BETWEEN_DIRECTORY_CREATION_TRIES = 100;
+
+	
+	/**
+	 * Creates a file output stream. This creates directories and overwriting
+	 * possible read-only flag
+	 * 
+	 * @param file
+	 *            the file
+	 * @return the file output stream
+	 * @throws FileNotFoundException
+	 *             if file cannot be created
+	 */
+	public static OutputStream createOutputStream(File file)
+			throws FileNotFoundException {
+		File parent = file.getParentFile();
+		if (!parent.exists()) {
+			createDirectories(parent);
+		}
+		FileOutputStream fos;
+		try {
+			fos = new FileOutputStream(file);
+		} catch (IOException e) {
+			if (file.exists()) {
+				file.delete();
+			}
+			fos = new FileOutputStream(file);
+		}
+		return new BufferedOutputStream(fos);
+	}
+
+	/**
+	 * Creates a copy of a file
+	 * 
+	 * @param source
+	 *            the source file
+	 * @param target
+	 *            the target file
+	 * @return true if written successfully
+	 */
+	public static boolean copyFile(File source, File target) {
+		boolean backup = true;
+		try {
+			byte[] buf = new byte[COPY_BUFFER_SIZE];
+			FileInputStream fis = new FileInputStream(source);
+			OutputStream fos = createOutputStream(target);
+			int len;
+			do {
+				len = fis.read(buf);
+				if (len > 0) {
+					fos.write(buf, 0, len);
+				}
+			} while (len > 0);
+			fis.close();
+			fos.close();
+		} catch (Exception e) {
+			backup = false;
+		}
+		return backup;
+	}
+
+	/**
+	 * Converts file separator characters
+	 * 
+	 * @param separator
+	 *            separator to be used
+	 * @param path
+	 *            string to be converted
+	 * @param addLast
+	 *            true if the converted string should end with a separator
+	 * @return the converted string
+	 */
+	public static String convertSeparators(char separator, String path,
+			boolean addLast) {
+		path = path.replace(SourceConstants.FORWARD_SLASH_CHAR, separator);
+		path = path.replace(SourceConstants.BACKSLASH_CHAR, separator);
+		String sepStr = String.valueOf(separator);
+		if (addLast && !path.endsWith(sepStr)) {
+			path += separator;
+		} else if (!addLast && path.endsWith(sepStr)) {
+			path = path.substring(0, path.length() - 1);
+		}
+		return path;
+	}
+
+	/**
+	 * Checks if given file is allowed to be opened into TraceCompiler
+	 * 
+	 * @param fileName
+	 *            the file to be checked
+	 * @return true if filtered, false if not
+	 */
+	public static boolean isFileAllowed(String fileName) {
+		boolean allowed = false;
+		fileName = fileName.toLowerCase();
+		for (String filter : FILE_FILTERS) {
+			if (fileName.endsWith(filter)) {
+				allowed = true;
+				break;
+			}
+		}
+		return allowed;
+	}
+
+	/**
+	 * Create directories safely in a multiple instances case
+	 * @param path
+	 * @param access
+	 * @return boolean pass/fail
+	 */
+	public static boolean createDirectories(File path) {
+
+		boolean retVal = true;
+
+		int tries = 0;
+
+		if (path.exists()) {
+			return retVal;
+		}
+
+		// try few times
+		while (tries < MAX_DIRECTORY_CREATION_TRIES) {
+
+			retVal = path.mkdirs();
+			// mkdirs can fail for a number of reasons including the case where
+			// the directory is open by another process. The API does not make
+			// any difference so we assume the latter case (worst case)
+			if (!retVal) { // sleep for moment and try again.
+
+				tries++;
+
+				try {
+					Thread.sleep(SLEEP_TIME_BETWEEN_DIRECTORY_CREATION_TRIES);
+				} catch (InterruptedException e) {
+					// Do nothing
+				}
+			} else { // pass
+				break;
+			}
+		}
+
+		return retVal;
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/licence.lic	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,17 @@
+/*
+* This is Default Licence added by TraceCompiler
+* Copyright (c) 2010 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: 
+*
+*/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/licence_hash.lic	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,17 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/messages.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,65 @@
+TraceCompiler.componentUidIsNotValidExceptionText=Component UID is not valid : 
+TraceCompiler.invalidMmpExceptionText=Invalid mmp file : 
+TraceCompiler.invalidTraceCompilerArgumetsExceptionText=Invalid trace compiler arguments
+TraceCompiler.noSourceFilesExceptionText=No source files provided.
+TraceCompiler.settingComponentPath=Component path set to : 
+TraceCompiler.settingTracesPath=Traces path set to : 
+TraceCompiler.mkdirFailed=Failed to create directory/ies :
+TraceCompiler.TracesPathWriteProtected=Traces path is write protected :
+TraceCompilerLogger.errorPrefix=error: 
+TraceCompilerLogger.infoPrefix=info: 
+TraceCompilerLogger.warningPrefix=warning: 
+TraceCompilerModelListener.lineNumberPrefix=, line 
+TraceCompiler.UnsupportedSwitch=Unsupported switch : 
+TraceCompiler.projectNameMissing=Project name missing.
+TraceCompiler.mmpPathMissing=MMP path missing.
+TraceCompiler.tracesPathMissing=Traces path missing.
+TraceCompiler.fileListMissing=Input file list empty.
+TraceCompiler.sourceFileDoesNotExist=Source file does not exist : 
+TraceCompiler.veboseEnabled=Verbose mode enabled.
+TraceCompiler.StopOnErrorEnabled=Stop On Error enabled.
+TraceCompiler.CompNameSet=Project name set to : 
+TraceCompiler.MMPPathSet=MMP path set to : 
+TraceCompiler.UidStwich=--uid
+TraceCompiler.UidText=component uid.
+TraceCompiler.ProjectSwitch=--project
+TraceCompiler.ProjectText=project name.
+TraceCompiler.MmpSwitch= --mmp
+TraceCompiler.MmpText=mmp path
+TraceCompiler.TracesSwitch=--traces
+TraceCompiler.TracesText=traces folder path.
+TraceCompiler.VersionSwitchLong=--version
+TraceCompiler.VersionSwitchShort=-v
+TraceCompiler.VersionText=print TraceCompiler version.
+TraceCompiler.HelpSwicthLong=--help
+TraceCompiler.HelpSwitchShort=-h
+TraceCompiler.HelpText=print help
+TraceCompiler.VerboseSwitchLong=--verbose
+TraceCompiler.VerboseSwitchShort=-d
+TraceCompiler.VerboseText=print info messages.
+TraceCompiler.StopSwitchLong=--stopOnError
+TraceCompiler.StopSwitchShort=-s
+TraceCompiler.StopText=On error, stop at the end of the compilation unit.
+TraceCompiler.DisplayVersionText=TraceCompiler version 
+TraceCompiler.Options=Options:
+TraceCompiler.Value=value
+TraceCompiler.Usage=Usage: 
+TraceCompiler.UsageText=tracecompiler [options] source_file...]
+TraceCompiler.EndOfList=*ENDOFSOURCEFILES*
+TraceCompiler.MmpExtension=.mmp
+TraceCompiler.PluginPath=com/nokia/tracecompiler/decodeplugins
+TraceCompiler.DecodeText1=<DECODE_PLUGIN_NAME>
+TraceCompiler.DecodeText2=<DECODE_PLUGIN_CLASS_NAME>
+TraceCompiler.DecodePluginsNameSpace=com.nokia.tracecompiler.decodeplugins.
+TraceCompiler.Took= took 
+TraceCompiler.MS= ms
+TraceCompiler.DecodePlugin=Decode plugin 
+TraceCompiler.AddingFailed= adding failed
+TraceCompiler.Added= added
+TraceCompiler.DecodePluginFile=Decode plugin file
+TraceCompiler.DoesNotExist= does not exist
+TraceCompiler.BuildingTracesMess=Building traces...
+TraceCompiler.ReadingFilesMess=parameters read from stdin (empty lines allowed) ending with 
+TraceCompiler.ProjectCancelledMess=Project creation was cancelled
+TraceCompiler.BuildFailed=Build trace files failed.
+TraceCompiler.InvalidMMP2=Missing or can not access MMP path: 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/DuplicateParameterNameModifier.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,61 @@
+/*
+* 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:
+*
+* Parameter name modifier
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Parameter name modifier
+ * 
+ */
+final class DuplicateParameterNameModifier extends DuplicateValueModifier {
+
+	/**
+	 * The parameter owner
+	 */
+	private Trace owner;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param owner
+	 *            the owner of the parameter
+	 * @param name
+	 *            the parameter name
+	 */
+	DuplicateParameterNameModifier(Trace owner, String name) {
+		super(name);
+		this.owner = owner;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectUtils.DuplicateValueModifier#
+	 *      findObject(java.lang.String)
+	 */
+	@Override
+	TraceObject findObject(String name) {
+		TraceObject retval;
+		if (owner != null) {
+			retval = owner.findParameterByName(name);
+		} else {
+			retval = null;
+		}
+		return retval;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/DuplicateValueModifier.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,183 @@
+/*
+* 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:
+*
+* Base class for value modifiers
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Base class for value modifiers
+ * 
+ */
+abstract class DuplicateValueModifier implements TraceObjectModifier {
+
+	/**
+	 * Duplicate tag for values
+	 */
+	private static final String DUPLICATE_TAG = "DUP"; //$NON-NLS-1$
+
+	/**
+	 * Duplicate tag separator
+	 */
+	private static final char DUPLICATE_SEPARATOR = '_';
+
+	/**
+	 * Value
+	 */
+	private String value;
+
+	/**
+	 * Changed flag
+	 */
+	private boolean changed;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param value
+	 *            the value
+	 */
+	DuplicateValueModifier(String value) {
+		this.value = value;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectUtils.TraceObjectModifier#getData()
+	 */
+	public String getData() {
+		return value;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObjectUtils.TraceObjectModifier#hasChanged()
+	 */
+	public boolean hasChanged() {
+		return changed;
+	}
+
+	/**
+	 * Gets the separator character
+	 * 
+	 * @return the char
+	 */
+	protected char getSeparator() {
+		return DUPLICATE_SEPARATOR;
+	}
+
+	/**
+	 * Processes the name and modifies if there are duplicates
+	 */
+	void processName() {
+		int index = getStartIndex(value);
+		TraceObject object;
+		do {
+			object = findObject(value);
+			if (object != null) {
+				changed = true;
+				value = appendIndexToString(value, index);
+				index++;
+			}
+		} while (object != null);
+	}
+
+	/**
+	 * Gets the start index from given text
+	 * 
+	 * @param value
+	 *            the value to be parsed
+	 * @return the start index
+	 */
+	private int getStartIndex(String value) {
+		String valueStr = null;
+		if (value.startsWith(DUPLICATE_TAG)) {
+			for (int i = DUPLICATE_TAG.length(); i < value.length(); i++) {
+				char c = value.charAt(i);
+				if (!Character.isDigit(c)) {
+					valueStr = value.substring(DUPLICATE_TAG.length(), i);
+					i = value.length();
+				}
+			}
+		}
+		int retval = -1;
+		if (valueStr != null && valueStr.length() > 0) {
+			retval = Integer.parseInt(valueStr);
+		}
+		return retval;
+	}
+
+	/**
+	 * Appends an index value to given string replacing existing index if it
+	 * exists
+	 * 
+	 * @param value
+	 *            the string
+	 * @param index
+	 *            the index
+	 * @return the changed string
+	 */
+	private String appendIndexToString(String value, int index) {
+		StringBuffer newValue = new StringBuffer();
+		if (index >= 0) {
+			String indexStr = String.valueOf(index);
+			newValue.append(DUPLICATE_TAG);
+			newValue.append(String.valueOf(index + 1));
+			newValue.append(getSeparator());
+			newValue.append(value.substring(DUPLICATE_TAG.length()
+					+ indexStr.length() + 1)); // Add separator
+		} else {
+			newValue.append(DUPLICATE_TAG);
+			newValue.append("1"); //$NON-NLS-1$
+			newValue.append(getSeparator());
+			newValue.append(value);
+		}
+		return newValue.toString();
+	}
+
+	/**
+	 * Gets the duplicate modifier from beginning of given text
+	 * 
+	 * @param text
+	 *            the text
+	 * @return the modifier
+	 */
+	static String getModifier(String text) {
+		String retval = null;
+		if (text.startsWith(DUPLICATE_TAG)) {
+			for (int i = DUPLICATE_TAG.length(); i < text.length(); i++) {
+				char c = text.charAt(i);
+				if (!Character.isDigit(c)) {
+					retval = text.substring(0, i + 1); // Add separator
+					i = text.length();
+				}
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Finds the object from model
+	 * 
+	 * @param value
+	 *            the value
+	 * @return the object or null if not found
+	 */
+	abstract TraceObject findObject(String value);
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/Trace.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,273 @@
+/*
+* 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:
+*
+* Represents the mapping of a trace ID into actual trace string
+*
+*/
+package com.nokia.tracecompiler.model;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * Represents the mapping of a trace ID into actual trace string. When a trace
+ * is decoded, the trace ID found from the binary trace file is converted to the
+ * text stored in this trace.
+ * 
+ */
+public class Trace extends TraceObject implements Iterable<TraceParameter> {
+
+	/**
+	 * The trace string
+	 */
+	private String trace = ""; //$NON-NLS-1$
+
+	/**
+	 * List of TraceParameter objects.
+	 */
+	private ArrayList<TraceParameter> parameters = new ArrayList<TraceParameter>();
+
+	/**
+	 * The trace group this trace belongs to
+	 */
+	private TraceGroup group;
+
+	/**
+	 * Creates a new trace and associates it with given TraceGroup
+	 * 
+	 * @param group
+	 *            the trace group
+	 */
+	Trace(TraceGroup group) {
+		setModel(group.getModel());
+		this.group = group;
+		group.addTrace(this);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObject#reset()
+	 */
+	@Override
+	void reset() {
+		super.reset();
+		for (TraceParameter parameter : parameters) {
+			// Model listeners are not notified on reset, but if the
+			// parameter itself implements a delete notification interface,
+			// it must be called to do appropriate cleanup
+			notifyOnDelete(parameter);
+			parameter.reset();
+		}
+		parameters.clear();
+	}
+
+	/**
+	 * Sets the trace string. Generates propertyUpdated event to model listeners
+	 * if the string changes
+	 * 
+	 * @see TraceModelListener#propertyUpdated(TraceObject, int)
+	 * @param trace
+	 *            the trace string
+	 * @throws TraceCompilerException 
+	 */
+	public void setTrace(String trace) throws TraceCompilerException {
+		if (trace == null) {
+			trace = ""; //$NON-NLS-1$
+		}
+		if (!trace.equals(this.trace)) {
+			this.trace = trace;
+			getModel().notifyPropertyUpdated(this, TraceModelListener.TRACE);
+		}
+	}
+
+	/**
+	 * Returns the trace string. This never returns null
+	 * 
+	 * @return the trace string
+	 */
+	public String getTrace() {
+		return trace;
+	}
+
+	/**
+	 * Returns the group to which this trace belongs
+	 * 
+	 * @return trace group
+	 */
+	public TraceGroup getGroup() {
+		return group;
+	}
+
+	/**
+	 * Adds a new parameter to the end of parameter list. Generates objectAdded
+	 * event to model listeners
+	 * 
+	 * @see TraceModelListener#objectAdded(TraceObject, TraceObject)
+	 * @param parameter
+	 *            the new parameter
+	 */
+	public void addParameter(TraceParameter parameter) {
+		parameters.add(parameter);
+		getModel().notifyObjectAdded(this, parameter);
+	}
+
+	/**
+	 * Inserts a new parameter to the given location. Generates objectAdded
+	 * event to model listeners
+	 * 
+	 * @see TraceModelListener#objectAdded(TraceObject, TraceObject)
+	 * @param index
+	 *            the index for new parameter
+	 * @param parameter
+	 *            the new parameter
+	 */
+	void insertParameter(int index, TraceParameter parameter) {
+		parameters.add(index, parameter);
+		getModel().notifyObjectAdded(this, parameter);
+	}
+
+	/**
+	 * Removes a parameter from this trace object. Generates a objectRemoved
+	 * event to model listeners if the parameter is actually removed
+	 * 
+	 * @see TraceModelListener#objectRemoved(TraceObject, TraceObject)
+	 * @param parameter
+	 *            the parameter to be removed
+	 * @throws TraceCompilerException 
+	 */
+	public void removeParameter(TraceParameter parameter) throws TraceCompilerException {
+		if (parameters.remove(parameter)) {
+			getModel().notifyObjectRemoved(this, parameter);
+			parameter.reset();
+		}
+	}
+
+	/**
+	 * Removes parameter at given index
+	 * 
+	 * @param index
+	 *            the index of the parameter
+	 * @throws TraceCompilerException 
+	 */
+	public void removeParameterAt(int index) throws TraceCompilerException {
+		if (index >= 0 && index < parameters.size()) {
+			TraceParameter parameter = parameters.get(index);
+			parameters.remove(index);
+			getModel().notifyObjectRemoved(this, parameter);
+			parameter.reset();
+		}
+	}
+
+	/**
+	 * Determines if this object has parameters.
+	 * 
+	 * @return true if this object has parameters
+	 */
+	public boolean hasParameters() {
+		return !parameters.isEmpty();
+	}
+
+	/**
+	 * Gets the number of parameters
+	 * 
+	 * @return the number of parameters
+	 */
+	public int getParameterCount() {
+		return parameters.size();
+	}
+
+	/**
+	 * Returns highest parameter ID + 1. Can be used to create an unique ID for
+	 * a new parameter.
+	 * 
+	 * @return the next parameter ID
+	 */
+	public int getNextParameterID() {
+		int max = 0;
+		for (TraceParameter parameter : parameters) {
+			int id = parameter.getID();
+			if (id > max) {
+				max = id;
+			}
+		}
+		return max + 1;
+	}
+
+	/**
+	 * Gets the parameter at given index
+	 * 
+	 * @param index
+	 *            the parameter index
+	 * @return the parameter at the index
+	 */
+	public TraceParameter getParameter(int index) {
+		return parameters.get(index);
+	}
+
+	/**
+	 * Returns the parameters of this object
+	 * 
+	 * @return iterator over the parameters
+	 */
+	public Iterator<TraceParameter> getParameters() {
+		return parameters.iterator();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Iterable#iterator()
+	 */
+	public Iterator<TraceParameter> iterator() {
+		return parameters.iterator();
+	}
+
+	/**
+	 * Gets a parameter by ID
+	 * 
+	 * @param id
+	 *            the parameter ID
+	 * @return the parameter or null
+	 */
+	public TraceParameter findParameterByID(int id) {
+		TraceParameter retval = null;
+		for (TraceParameter parameter : parameters) {
+			if (parameter.getID() == id) {
+				retval = parameter;
+				break;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets a parameter by name
+	 * 
+	 * @param name
+	 *            the name of a parameter
+	 * @return the parameter or null
+	 */
+	public TraceParameter findParameterByName(String name) {
+		TraceParameter retval = null;
+		for (TraceParameter parameter : parameters) {
+			if (parameter.getName().equals(name)) {
+				retval = parameter;
+				break;
+			}
+		}
+		return retval;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceCompilerErrorParameters.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Parameters for errors
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Parameters for errors
+ * 
+ */
+public class TraceCompilerErrorParameters {
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceCompilerException.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,164 @@
+/*
+* 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:
+*
+* Exceptions thrown by TraceCompiler engine
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Exceptions thrown by TraceCompiler engine
+ * 
+ */
+public class TraceCompilerException extends Exception {
+
+	/**
+	 * Error codes for TraceCompiler exceptions
+	 * 
+	 */
+	public interface TraceCompilerExceptionCode {
+	}
+
+	/**
+	 * UID
+	 */
+	private static final long serialVersionUID = -2991616409482985157L; // CodForChk_Dis_Magic
+
+	/**
+	 * Error code
+	 */
+	private TraceCompilerExceptionCode errorCode;
+
+	/**
+	 * Error parameters
+	 */
+	private TraceCompilerErrorParameters parameters;
+
+	/**
+	 * Source object
+	 */
+	private Object source;
+
+	/**
+	 * Flag that defines will event related to exception posted to trace event view
+	 */
+	private boolean postEvent = true;
+	
+	/**
+	 * Constructor with error code
+	 * 
+	 * @param errorCode
+	 *            the error code
+	 */
+	public TraceCompilerException(TraceCompilerExceptionCode errorCode) {
+		this.errorCode = errorCode;
+	}
+	
+	/**
+	 * Constructor with error code and postEvent flag
+	 * 
+	 * @param errorCode
+	 *            the error code
+	 * @param postEvent
+	 *            flag that defines will event related to exception posted to trace event view   
+	 */
+	public TraceCompilerException(TraceCompilerExceptionCode errorCode, boolean postEvent) {
+		this.errorCode = errorCode;
+		this.postEvent = postEvent;
+	}
+
+	/**
+	 * Constructor with error code and parameters
+	 * 
+	 * @param errorCode
+	 *            the error code
+	 * @param parameters
+	 *            the error parameters
+	 */
+	public TraceCompilerException(TraceCompilerExceptionCode errorCode,
+			TraceCompilerErrorParameters parameters) {
+		this.errorCode = errorCode;
+		this.parameters = parameters;
+	}
+
+	/**
+	 * Constructor with error code, parameters and source object
+	 * 
+	 * @param errorCode
+	 *            the error code
+	 * @param parameters
+	 *            the error parameters
+	 * @param source
+	 *            the source object
+	 */
+	public TraceCompilerException(TraceCompilerExceptionCode errorCode,
+			TraceCompilerErrorParameters parameters, Object source) {
+		this.errorCode = errorCode;
+		this.parameters = parameters;
+		this.source = source;
+	}
+	
+	/**
+	 * Constructor with error code and root cause
+	 * 
+	 * @param errorCode
+	 *            the error code
+	 * @param cause
+	 *            the reason for this exception
+	 */
+	public TraceCompilerException(TraceCompilerExceptionCode errorCode,
+			Throwable cause) {
+		super(cause);
+		this.errorCode = errorCode;
+	}
+
+	/**
+	 * Gets the error code
+	 * 
+	 * @return error code
+	 */
+	public TraceCompilerExceptionCode getErrorCode() {
+		return errorCode;
+	}
+
+	/**
+	 * Gets the parameters related to the error
+	 * 
+	 * @return the parameters
+	 */
+	public TraceCompilerErrorParameters getErrorParameters() {
+		return parameters;
+	}
+
+	/**
+	 * Gets the source of this error
+	 * 
+	 * @return the source
+	 */
+	public Object getErrorSource() {
+		return source;
+	}
+
+	/**
+	 * Is event related to exception wanted to post to trace event view
+	 * 
+	 * @return true is event is wanted to post trace event view
+	 *         false is event is not wanted to post trace event view
+	 */
+	public boolean isEventWantedToPost() {
+		return postEvent;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceConstantTable.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,253 @@
+/*
+* 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:
+*
+* Integer-to-string mapping table for parameters
+*
+*/
+package com.nokia.tracecompiler.model;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * Integer-to-string mapping table for parameters
+ * 
+ */
+public class TraceConstantTable extends TraceObject implements
+		Iterable<TraceConstantTableEntry> {
+
+	/**
+	 * Table entries
+	 */
+	private ArrayList<TraceConstantTableEntry> entries = new ArrayList<TraceConstantTableEntry>();
+
+	/**
+	 * Table type
+	 */
+	private String type = TraceParameter.UDEC32;
+
+	/**
+	 * Parameter reference count
+	 */
+	private ArrayList<TraceParameter> parameterReferences = new ArrayList<TraceParameter>();
+
+	/**
+	 * Creates a new constant table
+	 * 
+	 * @param model
+	 *            the trace model
+	 */
+	TraceConstantTable(TraceModel model) {
+		setModel(model);
+		model.addConstantTable(this);
+	}
+
+	/**
+	 * Gets the type
+	 * 
+	 * @return the type
+	 */
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * Sets the constant type
+	 * 
+	 * @param type
+	 *            the parameter type
+	 */
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObject#setName(java.lang.String)
+	 */
+	@Override
+	public void setName(String name) throws TraceCompilerException {
+		super.setName(name);
+		// Note: Currently name changes are disabled when a table is referenced
+		// by parameters. If enabled at some point, a notification about this
+		// needs to be sent to the parameters
+	}
+
+	/**
+	 * Adds a constant table entry to this table. This is called from the
+	 * constant table entry constructor, to this is not public. Generates a
+	 * objectAdded event to model listeners
+	 * 
+	 * @see TraceModelListener#objectAdded(TraceObject, TraceObject)
+	 * @param entry
+	 *            the table entry
+	 */
+	void addEntry(TraceConstantTableEntry entry) {
+		entries.add(entry);
+		getModel().notifyObjectAdded(this, entry);
+	}
+
+	/**
+	 * Removes the given constant table entry. Creates a objectRemoved event to
+	 * the model listeners
+	 * 
+	 * @see TraceModelListener#objectRemoved(TraceObject, TraceObject)
+	 * @param entry
+	 *            the entry to be removed
+	 * @throws TraceCompilerException 
+	 */
+	public void removeEntry(TraceConstantTableEntry entry) throws TraceCompilerException {
+		if (entries.remove(entry)) {
+			getModel().notifyObjectRemoved(this, entry);
+			entry.reset();
+		}
+	}
+
+	/**
+	 * Gets the entry which has given ID
+	 * 
+	 * @param id
+	 *            the id
+	 * @return the entry or null
+	 */
+	public TraceConstantTableEntry findEntryByID(int id) {
+		TraceConstantTableEntry retval = null;
+		for (TraceConstantTableEntry entry : entries) {
+			if (entry.getID() == id) {
+				retval = entry;
+				break;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets the entry which has the given name
+	 * 
+	 * @param name
+	 *            the name
+	 * @return the entry or null
+	 */
+	public TraceConstantTableEntry findEntryByName(String name) {
+		TraceConstantTableEntry retval = null;
+		for (TraceConstantTableEntry entry : entries) {
+			if (entry.getName().equals(name)) {
+				retval = entry;
+				break;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets the constant table entries
+	 * 
+	 * @return the entries iterator
+	 */
+	public Iterator<TraceConstantTableEntry> getEntries() {
+		return entries.iterator();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Iterable#iterator()
+	 */
+	public Iterator<TraceConstantTableEntry> iterator() {
+		return entries.iterator();
+	}
+
+	/**
+	 * Determines if there are any entries in this table
+	 * 
+	 * @return true if there are entries
+	 */
+	public boolean hasEntries() {
+		return !entries.isEmpty();
+	}
+
+	/**
+	 * Adds a parameter reference
+	 * 
+	 * @param parameter
+	 *            the parameter to be added
+	 */
+	void addParameterReference(TraceParameter parameter) {
+		parameterReferences.add(parameter);
+	}
+
+	/**
+	 * Removes a parameter reference
+	 * 
+	 * @param parameter
+	 *            the reference to be removed
+	 */
+	void removeParameterReference(TraceParameter parameter) {
+		parameterReferences.remove(parameter);
+	}
+
+	/**
+	 * Checks if there are parameter references
+	 * 
+	 * @return true if this table is referenced from parameters
+	 */
+	public boolean hasParameterReferences() {
+		return !parameterReferences.isEmpty();
+	}
+
+	/**
+	 * Gets the parameter references
+	 * 
+	 * @return the iterator of the references
+	 */
+	public Iterator<TraceParameter> getParameterReferences() {
+		return parameterReferences.iterator();
+	}
+
+	/**
+	 * Gets the largest constant ID + 1
+	 * 
+	 * @return the ID
+	 */
+	public int getNextEntryID() {
+		int max = 0;
+		for (TraceConstantTableEntry entry : entries) {
+			int id = entry.getID();
+			if (id > max) {
+				max = id;
+			}
+		}
+		return max + 1;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObject#reset()
+	 */
+	@Override
+	void reset() {
+		for (TraceConstantTableEntry entry : entries) {
+			// Model listeners are not notified on reset, but if the
+			// entry itself implements a delete notification interface,
+			// it must be called to do appropriate cleanup
+			notifyOnDelete(entry);
+			entry.reset();
+		}
+		super.reset();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceConstantTableEntry.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* One entry in the integer-to-string mapping table
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * One entry in the integer-to-string mapping table
+ * 
+ */
+public class TraceConstantTableEntry extends TraceObject {
+
+	/**
+	 * Constant table that owns this parameter
+	 */
+	private TraceConstantTable table;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param table
+	 *            the constant table that owns this entry
+	 */
+	TraceConstantTableEntry(TraceConstantTable table) {
+		setModel(table.getModel());
+		this.table = table;
+		table.addEntry(this);
+	}
+
+	/**
+	 * Gets the table that owns this entry
+	 * 
+	 * @return the table
+	 */
+	public TraceConstantTable getTable() {
+		return table;
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceGroup.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,205 @@
+/*
+* 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:
+*
+* Represents a logical collection of traces somehow related to each other
+*
+*/
+package com.nokia.tracecompiler.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+
+/**
+ * Represents a logical collection of traces somehow related to each other. Each
+ * trace group specifies a prefix that is attached to all trace lines made
+ * within that group.
+ * 
+ */
+public class TraceGroup extends TraceObject implements Iterable<Trace> {
+
+	/**
+	 * List of traces, sorted by ID
+	 */
+	private ArrayList<Trace> tracesByID = new ArrayList<Trace>();
+
+	/**
+	 * List of traces, sorted by name
+	 */
+	private ArrayList<Trace> tracesByName = new ArrayList<Trace>();
+
+	/**
+	 * Creates a new trace group and associates it with given trace model.
+	 * 
+	 * @param model
+	 *            the trace model
+	 */
+	TraceGroup(TraceModel model) {
+		setModel(model);
+		model.addGroup(this);
+	}
+
+	/**
+	 * Adds a trace to this group. Creates objectAdded event to model listeners
+	 * 
+	 * @see TraceModelListener#objectAdded(TraceObject, TraceObject)
+	 * @param trace
+	 *            the trace to be added
+	 */
+	void addTrace(Trace trace) {
+		// Sorted when ID is set to trace
+		tracesByID.add(trace);
+		// Sorted when name is set to trace
+		tracesByName.add(trace);
+		getModel().notifyObjectAdded(this, trace);
+	}
+
+	/**
+	 * Removes a trace from this group. Creates objectRemoved event to model
+	 * listeners
+	 * 
+	 * @see TraceModelListener#objectRemoved(TraceObject, TraceObject)
+	 * @param trace
+	 *            the trace to be removed
+	 * @throws TraceCompilerException 
+	 */
+	public void removeTrace(Trace trace) throws TraceCompilerException {
+		int index = Collections.binarySearch(tracesByID, trace,
+				TraceObjectUtils.traceObjectIDComparator);
+		if (index >= 0) {
+			tracesByID.remove(index);
+			index = Collections.binarySearch(tracesByName, trace,
+					TraceObjectUtils.traceObjectNameComparator);
+			tracesByName.remove(index);
+			getModel().notifyObjectRemoved(this, trace);
+			trace.reset();
+		}
+	}
+
+	/**
+	 * Determines if this group has traces.
+	 * 
+	 * @return true if the group contains traces
+	 */
+	public boolean hasTraces() {
+		return !tracesByID.isEmpty();
+	}
+
+	/**
+	 * Gets the number of traces in this group.
+	 * 
+	 * @return the number of traces
+	 */
+	public int getTraceCount() {
+		return tracesByID.size();
+	}
+
+	/**
+	 * Returns an iterator over the traces within this group.
+	 * 
+	 * @return the iterator
+	 */
+	public Iterator<Trace> getTraces() {
+		return tracesByID.iterator();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Iterable#iterator()
+	 */
+	public Iterator<Trace> iterator() {
+		return tracesByID.iterator();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObject#reset()
+	 */
+	@Override
+	void reset() {
+		// Reset removes constant table references
+		for (Trace trace : tracesByID) {
+			// Model listeners are not notified on reset, but if the
+			// trace itself implements a delete notification interface,
+			// it must be called to do appropriate cleanup
+			notifyOnDelete(trace);
+			trace.reset();
+		}
+		tracesByID.clear();
+		tracesByName.clear();
+		super.reset();
+	}
+
+	/**
+	 * Returns highest trace ID + 1. Can be used to create an unique ID for a
+	 * new trace.
+	 * 
+	 * @return the next trace ID
+	 */
+	public int getNextTraceID() {
+		int ret;
+		if (tracesByID.size() > 0) {
+			ret = tracesByID.get(tracesByID.size() - 1).getID() + 1;
+		} else {
+			ret = 1;
+		}
+		return ret;
+	}
+
+	/**
+	 * Gets the trace which has given ID
+	 * 
+	 * @param id
+	 *            the trace ID
+	 * @return the trace or null
+	 */
+	public Trace findTraceByID(int id) {
+		int index = Collections.binarySearch(tracesByID, id,
+				TraceObjectUtils.traceToIDComparator);
+		Trace retval;
+		if (index >= 0) {
+			retval = tracesByID.get(index);
+		} else {
+			retval = null;
+		}
+		return retval;
+	}
+
+	/**
+	 * Called by the model when a trace property is updated
+	 * 
+	 * @param source
+	 *            the trace that was changed
+	 * @param property
+	 *            the property that was changed
+	 */
+	void tracePropertyUpdated(TraceObject source, int property) {
+		if (property == TraceModelListener.NAME) {
+			Collections.sort(tracesByName,
+					TraceObjectUtils.traceObjectNameComparator);
+		} else if (property == TraceModelListener.ID) {
+			traceIDsUpdated();
+		}
+	}
+
+	/**
+	 * Sorts the trace array based on new ID configuration
+	 */
+	void traceIDsUpdated() {
+		Collections.sort(tracesByID, TraceObjectUtils.traceObjectIDComparator);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModel.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,997 @@
+/*
+* 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:
+*
+* Trace model is a collection of trace groups
+*
+*/
+package com.nokia.tracecompiler.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Properties;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.project.SortedProperties;
+import com.nokia.tracecompiler.project.FormattingUtils;
+import com.nokia.tracecompiler.source.SourceConstants;
+
+/**
+ * Trace model is a collection of trace groups. Listener interfaces can be
+ * attached to a trace model to receive change notifications when traces are
+ * added, removed or modified.
+ * 
+ */
+public class TraceModel extends TraceObject implements Iterable<TraceGroup> {
+
+	/**
+	 * Group property prefix
+	 */
+	public final String GROUP_PROPERTY_PREFIX = "[GROUP]"; //$NON-NLS-1$
+
+	/**
+	 * Trace property prefix
+	 */
+	public final String TRACE_PROPERTY_PREFIX = "[TRACE]"; //$NON-NLS-1$
+
+	/**
+	 * Obsolete property prefix
+	 */
+	public final String OBSOLETE_PROPERTY_PREFIX = "[[OBSOLETE]]"; //$NON-NLS-1$
+
+	/**
+	 * Group Id prefix
+	 */
+	public final String GROUP_ID_PREFIX = "["; //$NON-NLS-1$
+
+	/**
+	 * Group Id suffix
+	 */
+	public final String GROUP_ID_SUFFIX = "]"; //$NON-NLS-1$	
+
+	/**
+	 * Factory object for creating other trace objects
+	 */
+	private TraceObjectFactory factory;
+
+	/**
+	 * Property verifier interface
+	 */
+	private TraceObjectPropertyVerifier verifier;
+
+	/**
+	 * List of trace groups
+	 */
+	private ArrayList<TraceGroup> groups = new ArrayList<TraceGroup>();
+
+	/**
+	 * List of traces, sorted by name
+	 */
+	private ArrayList<Trace> tracesByName = new ArrayList<Trace>();
+
+	/**
+	 * List of model listeners
+	 */
+	private ArrayList<TraceModelListener> modelListeners = new ArrayList<TraceModelListener>();
+
+	/**
+	 * List of extension listeners
+	 */
+	private ArrayList<TraceModelExtensionListener> extensionListeners = new ArrayList<TraceModelExtensionListener>();
+
+	/**
+	 * List of reset listeners
+	 */
+	private ArrayList<TraceModelResetListener> resetListeners = new ArrayList<TraceModelResetListener>();
+
+	/**
+	 * Processing listeners
+	 */
+	private ArrayList<TraceProcessingListener> processingListeners = new ArrayList<TraceProcessingListener>();
+
+	/**
+	 * List of constant tables
+	 */
+	private ArrayList<TraceConstantTable> constantTables = new ArrayList<TraceConstantTable>();
+
+	/**
+	 * Validity flag
+	 */
+	private boolean valid;
+
+	/**
+	 * Number of nested calls to startProcessing
+	 */
+	private int isProcessing;
+
+	/**
+	 * Model was changed during processing
+	 */
+	private boolean modelChangedDuringProcessing;
+
+	/**
+	 * Fixed Ids from fixed Ids definition file
+	 */
+	private SortedProperties fixedIds;
+
+	/**
+	 * Hex radix
+	 */
+	public int HEX_RADIX = 16; // CodForChk_Dis_Magic
+
+	/**
+	 * Constructor
+	 * 
+	 * @param factory
+	 *            the rule factory
+	 * @param verifier
+	 *            the property verifier
+	 * @throws TraceCompilerException 
+	 */
+	public TraceModel(TraceObjectRuleFactory factory,
+			TraceObjectPropertyVerifier verifier) throws TraceCompilerException {
+		// Stored for callback purposes
+		setModel(this);
+		this.factory = new TraceObjectFactory(this, factory);
+		this.verifier = verifier;
+	}
+
+	/**
+	 * Adds a new trace model listener to this model
+	 * 
+	 * @param listener
+	 *            the new listener
+	 */
+	public void addModelListener(TraceModelListener listener) {
+		modelListeners.add(listener);
+	}
+
+	/**
+	 * Removes a trace model listener. Does nothing if the listener is not found
+	 * 
+	 * @param listener
+	 *            the listener to be removed
+	 */
+	public void removeModelListener(TraceModelListener listener) {
+		modelListeners.remove(listener);
+	}
+
+	/**
+	 * Adds a new trace model extension listener to this model
+	 * 
+	 * @param listener
+	 *            the new listener
+	 */
+	public void addExtensionListener(TraceModelExtensionListener listener) {
+		extensionListeners.add(listener);
+	}
+
+	/**
+	 * Removes a trace model extension listener. Does nothing if the listener is
+	 * not found
+	 * 
+	 * @param listener
+	 *            the listener to be removed
+	 */
+	public void removeExtensionListener(TraceModelExtensionListener listener) {
+		extensionListeners.remove(listener);
+	}
+
+	/**
+	 * Adds a new trace model reset listener to this model
+	 * 
+	 * @param listener
+	 *            the new listener
+	 */
+	public void addResetListener(TraceModelResetListener listener) {
+		resetListeners.add(listener);
+	}
+
+	/**
+	 * Removes a trace model reset listener. Does nothing if the listener is not
+	 * found
+	 * 
+	 * @param listener
+	 *            the listener to be removed
+	 */
+	public void removeResetListener(TraceModelResetListener listener) {
+		resetListeners.remove(listener);
+	}
+
+	/**
+	 * Adds a new trace model listener to this model
+	 * 
+	 * @param listener
+	 *            the new listener
+	 */
+	public void addProcessingListener(TraceProcessingListener listener) {
+		processingListeners.add(listener);
+	}
+
+	/**
+	 * Removes a processing listener. Does nothing if the listener is not found
+	 * 
+	 * @param listener
+	 *            the listener to be removed
+	 */
+	public void removeProcessingListener(TraceProcessingListener listener) {
+		processingListeners.remove(listener);
+	}
+
+	/**
+	 * Returns highest group ID + 1. Can be used to create an unique ID for a
+	 * new trace group.
+	 * 
+	 * @return the next trace group ID
+	 * @throws TraceCompilerException
+	 */
+	public int getNextGroupID() throws TraceCompilerException {
+		int currentMaxGroupId = 0;
+		int nextGroupId = 0;
+		// Check if there are some fixed Ids
+		if (fixedIds != null) {
+			Enumeration<Object> keys = this.fixedIds.keys();
+			// Go through fixed Ids and check if there are fixed group Ids
+			while (keys.hasMoreElements()) {
+				String key = (String) keys.nextElement();
+				if (key.startsWith(GROUP_PROPERTY_PREFIX)
+						|| key.startsWith(OBSOLETE_PROPERTY_PREFIX
+								+ GROUP_PROPERTY_PREFIX)) {
+					// Fixed group Id found. Try to covert it to int value.
+					String value = fixedIds.getProperty(key);
+					int fixedId = 0;
+					try {
+						fixedId = Integer.decode(value).intValue();
+					} catch (NumberFormatException e) {
+						// Corrupted. Get next group Id later on.
+						currentMaxGroupId = 0;
+						break;
+					}
+					// Check if found fixed Id is bigger than current max group
+					// Id
+					if (fixedId > currentMaxGroupId) {
+						currentMaxGroupId = fixedId;
+					}
+				}
+			}
+		}
+
+		// If there were fixed group Ids. Set next group Id to be current max
+		// group Id + 1
+		if (currentMaxGroupId != 0) {
+			nextGroupId = currentMaxGroupId + 1;
+		}
+
+		// Get current max group id in model
+		int maxGroupIdInModel = 0;
+		for (TraceGroup group : groups) {
+			int groupIdInModel = group.getID();
+			if (groupIdInModel > maxGroupIdInModel) {
+				maxGroupIdInModel = groupIdInModel;
+			}
+		}
+
+		// If next group Id is zero or smaller than current max group id in
+		// model + 1. Set it be same as current max group id in model + 1. This
+		// is done in case that we have added more than one new group after last
+		// fixed Id update
+		if (nextGroupId == 0 || nextGroupId < maxGroupIdInModel + 1) {
+			nextGroupId = maxGroupIdInModel + 1;
+		}
+
+		// Check that next group Id is not bigger than max group Id
+		if (nextGroupId > TraceCompilerEngineGlobals.MAX_GROUP_ID) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.RUN_OUT_OF_GROUP_IDS);
+		}
+
+		return nextGroupId;
+	}
+
+	/**
+	 * Returns highest constant table ID + 1. Can be used to create an unique ID
+	 * for a new constant table.
+	 * 
+	 * @return the next constant table ID
+	 */
+	public int getNextConstantTableID() {
+		int max = 0;
+		for (TraceConstantTable table : constantTables) {
+			int id = table.getID();
+			if (id > max) {
+				max = id;
+			}
+		}
+		return max + 1;
+	}
+
+	/**
+	 * Removes a trace group from this model. Create groupRemoved event to model
+	 * listeners
+	 * 
+	 * @param group
+	 *            the group to be removed
+	 * @throws TraceCompilerException 
+	 */
+	public void removeGroup(TraceGroup group) throws TraceCompilerException {
+		if (groups.remove(group)) {
+			notifyObjectRemoved(this, group);
+			group.reset();
+		}
+	}
+
+	/**
+	 * Determines if this model contains any trace groups
+	 * 
+	 * @return true if there are trace groups
+	 */
+	public boolean hasGroups() {
+		return !groups.isEmpty();
+	}
+
+	/**
+	 * Gets the number of trace groups
+	 * 
+	 * @return trace group count
+	 */
+	public int getGroupCount() {
+		return groups.size();
+	}
+
+	/**
+	 * Returns the trace groups of this model
+	 * 
+	 * @return the iterator over the groups
+	 */
+	public Iterator<TraceGroup> getGroups() {
+		return groups.iterator();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Iterable#iterator()
+	 */
+	public Iterator<TraceGroup> iterator() {
+		return groups.iterator();
+	}
+
+	/**
+	 * Removes all trace groups and parameters from this model. Extensions are
+	 * not removed. Notifies the reset listeners with modelResetting and
+	 * modelReset
+	 * 
+	 * @see TraceModelResetListener#modelResetting
+	 * @see TraceModelResetListener#modelReset
+	 */
+	@Override
+	public void reset() {
+		notifyModelResetting();
+		// Properties are removed, other extensions are left
+		removeExtensions(TraceObjectPropertyList.class);
+		groups.clear();
+		tracesByName.clear();
+		constantTables.clear();
+		fixedIds = null;
+		super.reset();
+		notifyModelReset();
+	}
+
+	/**
+	 * Gets the group which has given ID
+	 * 
+	 * @param id
+	 *            the id
+	 * @return group or null
+	 */
+	public TraceGroup findGroupByID(int id) {
+		TraceGroup retval = null;
+		for (TraceGroup group : groups) {
+			if (group.getID() == id) {
+				retval = group;
+				break;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Locates a trace group which has the given name.
+	 * 
+	 * @param name
+	 *            the name of the trace group
+	 * @return the group or null if not found
+	 * @see TraceObject#getName
+	 */
+	public TraceGroup findGroupByName(String name) {
+		TraceGroup retval = null;
+		for (TraceGroup group : groups) {
+			if (group.getName().equals(name)) {
+				retval = group;
+				break;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Locates a trace which has the given name.
+	 * 
+	 * @param name
+	 *            the name of the trace
+	 * @return the trace or null if not found
+	 * @see TraceObject#getName
+	 */
+	public Trace findTraceByName(String name) {
+		Trace retval;
+		int index = Collections.binarySearch(tracesByName, name,
+				TraceObjectUtils.traceToNameComparator);
+		if (index >= 0) {
+			retval = tracesByName.get(index);
+		} else {
+			retval = null;
+		}
+		return retval;
+	}
+
+	/**
+	 * Returns the group at given index
+	 * 
+	 * @param index
+	 *            the group index
+	 * @return the group
+	 */
+	public TraceGroup getGroupAt(int index) {
+		return groups.get(index);
+	}
+
+	/**
+	 * Removes a constant table from this model. Creates objectRemoved event to
+	 * model listeners
+	 * 
+	 * @see TraceModelListener#objectRemoved(TraceObject, TraceObject)
+	 * @param table
+	 *            the table to be removed
+	 * @throws TraceCompilerException 
+	 */
+	public void removeConstantTable(TraceConstantTable table) throws TraceCompilerException {
+		if (constantTables.remove(table)) {
+			notifyObjectRemoved(this, table);
+			table.reset();
+		}
+	}
+
+	/**
+	 * Gets the constant tables of this model
+	 * 
+	 * @return the tables iterator
+	 */
+	public Iterator<TraceConstantTable> getConstantTables() {
+		return constantTables.iterator();
+	}
+
+	/**
+	 * Gets a constant table by ID
+	 * 
+	 * @param id
+	 *            the ID
+	 * @return the table or null
+	 */
+	public TraceConstantTable findConstantTableByID(int id) {
+		TraceConstantTable retval = null;
+		for (TraceConstantTable table : constantTables) {
+			if (table.getID() == id) {
+				retval = table;
+				break;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets a constant table by name
+	 * 
+	 * @param tableName
+	 *            the name
+	 * @return the table or null
+	 */
+	public TraceConstantTable findConstantTableByName(String tableName) {
+		TraceConstantTable retval = null;
+		for (TraceConstantTable table : constantTables) {
+			if (table.getName().equals(tableName)) {
+				retval = table;
+				break;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Checks if this model contains constant tables
+	 * 
+	 * @return true if there are constant tables
+	 */
+	public boolean hasConstantTables() {
+		return !constantTables.isEmpty();
+	}
+
+	/**
+	 * Returns the constant table at given index
+	 * 
+	 * @param index
+	 *            the group index
+	 * @return the group
+	 */
+	public TraceConstantTable getConstantTableAt(int index) {
+		return constantTables.get(index);
+	}
+
+	/**
+	 * Adds a new trace group to this model. Creates objectAdded event to model
+	 * listeners. This is only intended to be called from TraceGroup
+	 * constructor, so this is not public.
+	 * 
+	 * @see TraceModelListener#objectAdded(TraceObject, TraceObject)
+	 * @param group
+	 *            the group to be added
+	 */
+	void addGroup(TraceGroup group) {
+		groups.add(group);
+		notifyObjectAdded(this, group);
+	}
+
+	/**
+	 * Adds a constant table to this model. Created objectAdded event to model
+	 * listeners. This is only intended to be called from constant table
+	 * constructor, so this is not public
+	 * 
+	 * @see TraceModelListener#objectAdded(TraceObject, TraceObject)
+	 * @param table
+	 *            the constant table
+	 */
+	void addConstantTable(TraceConstantTable table) {
+		constantTables.add(table);
+		notifyObjectAdded(this, table);
+	}
+
+	/**
+	 * Fires propertiesUpdated event. Called from trace objects when their
+	 * properties change.
+	 * 
+	 * @see TraceModelListener#propertyUpdated(TraceObject, int)
+	 * @param source
+	 *            the object that changed
+	 * @param property
+	 *            the property that changed
+	 * @throws TraceCompilerException 
+	 */
+	void notifyPropertyUpdated(TraceObject source, int property) throws TraceCompilerException {
+		if (source instanceof Trace) {
+			if (property == TraceModelListener.NAME) {
+				Collections.sort(tracesByName,
+						TraceObjectUtils.traceObjectNameComparator);
+			}
+			((Trace) source).getGroup().tracePropertyUpdated(source, property);
+		}
+		for (TraceModelListener l : modelListeners) {
+			l.propertyUpdated(source, property);
+		}
+		modelChangedDuringProcessing = true;
+	}
+
+	/**
+	 * Fires objectAdded event to listeners
+	 * 
+	 * @see TraceModelListener#objectAdded(TraceObject, TraceObject)
+	 * @param owner
+	 *            the owner object
+	 * @param object
+	 *            the object that was added
+	 */
+	void notifyObjectAdded(TraceObject owner, TraceObject object) {
+		// List is sorted when the name is set to the trace
+		if (object instanceof Trace) {
+			tracesByName.add((Trace) object);
+		}
+		for (TraceModelListener l : modelListeners) {
+			l.objectAdded(owner, object);
+		}
+		modelChangedDuringProcessing = true;
+	}
+
+	/**
+	 * Fires objectRemoved event to listeners
+	 * 
+	 * @see TraceModelListener#objectRemoved(TraceObject, TraceObject)
+	 * @param owner
+	 *            the owner object
+	 * @param object
+	 *            the object that was removed
+	 * @throws TraceCompilerException 
+	 */
+	void notifyObjectRemoved(TraceObject owner, TraceObject object) throws TraceCompilerException {
+		if (object instanceof Trace) {
+			int index = Collections.binarySearch(tracesByName, (Trace) object,
+					TraceObjectUtils.traceObjectNameComparator);
+			tracesByName.remove(index);
+		}
+		notifyOnDelete(object);
+		for (TraceModelListener l : modelListeners) {
+			l.objectRemoved(owner, object);
+		}
+		modelChangedDuringProcessing = true;
+	}
+
+	/**
+	 * Notifies that an object creation is complete
+	 * 
+	 * @see TraceModelListener#objectCreationComplete(TraceObject)
+	 * @param object
+	 *            the object
+	 * @throws TraceCompilerException 
+	 */
+	void notifyObjectCreationComplete(TraceObject object) throws TraceCompilerException {
+		for (TraceModelListener l : modelListeners) {
+			l.objectCreationComplete(object);
+		}
+	}
+
+	/**
+	 * Fires modelResetting event to all listeners
+	 * 
+	 * @see TraceModelResetListener#modelResetting()
+	 */
+	private void notifyModelResetting() {
+		for (TraceModelResetListener l : resetListeners) {
+			l.modelResetting();
+		}
+	}
+
+	/**
+	 * Fires modelReset event to all listeners
+	 * 
+	 * @see TraceModelResetListener#modelReset()
+	 */
+	private void notifyModelReset() {
+		for (TraceModelResetListener l : resetListeners) {
+			l.modelReset();
+		}
+	}
+
+	/**
+	 * Fires extensionAdded event. Called from TraceObject when extension is
+	 * added to it
+	 * 
+	 * @see TraceModelExtensionListener#extensionAdded(TraceObject,
+	 *      TraceModelExtension)
+	 * @param object
+	 *            the trace object
+	 * @param extension
+	 *            the new extension
+	 */
+	void notifyExtensionAdded(TraceObject object, TraceModelExtension extension) {
+		for (TraceModelExtensionListener l : extensionListeners) {
+			l.extensionAdded(object, extension);
+		}
+		modelChangedDuringProcessing = true;
+	}
+
+	/**
+	 * Fires extensionRemoved event. Called from TraceObject when extension is
+	 * removed from it
+	 * 
+	 * @see TraceModelExtensionListener#extensionRemoved(TraceObject,
+	 *      TraceModelExtension)
+	 * @param object
+	 *            the object
+	 * @param extension
+	 *            the removed extension
+	 */
+	void notifyExtensionRemoved(TraceObject object,
+			TraceModelExtension extension) {
+		for (TraceModelExtensionListener l : extensionListeners) {
+			l.extensionRemoved(object, extension);
+		}
+		modelChangedDuringProcessing = true;
+	}
+
+	/**
+	 * Gets the validity flag of this model
+	 * 
+	 * @return the validity flag
+	 */
+	public boolean isValid() {
+		return valid;
+	}
+
+	/**
+	 * Sets the validity flag
+	 * 
+	 * @param valid
+	 *            new flag value
+	 * @throws TraceCompilerException 
+	 */
+	public void setValid(boolean valid) throws TraceCompilerException {
+		if (valid != this.valid) {
+			this.valid = valid;
+			for (TraceModelResetListener l : resetListeners) {
+				l.modelValid(valid);
+			}
+		}
+	}
+
+	/**
+	 * Gets the trace object factory
+	 * 
+	 * @return the factory
+	 */
+	public TraceObjectFactory getFactory() {
+		return factory;
+	}
+
+	/**
+	 * Gets the object verifier interface. The verifier should be used before
+	 * updating object properties
+	 * 
+	 * @return the verifier
+	 */
+	public TraceObjectPropertyVerifier getVerifier() {
+		return verifier;
+	}
+
+	/**
+	 * Notifies the process listeners that a process the results in multiple
+	 * listener updates is about to start
+	 */
+	public void startProcessing() {
+		isProcessing++;
+		if (isProcessing == 1) {
+			modelChangedDuringProcessing = false;
+			for (TraceProcessingListener l : processingListeners) {
+				l.processingStarted();
+			}
+		}
+	}
+
+	/**
+	 * Notifies the process listeners that a process the results in multiple
+	 * listener updates has finished
+	 */
+	public void processingComplete() {
+		isProcessing--;
+		if (isProcessing == 0) {
+			for (TraceProcessingListener l : processingListeners) {
+				l.processingComplete(modelChangedDuringProcessing);
+			}
+			modelChangedDuringProcessing = false;
+		}
+	}
+
+	/**
+	 * Checks the state of the processing flag
+	 * 
+	 * @return the processing flag
+	 */
+	public boolean isProcessing() {
+		return isProcessing > 0;
+	}
+
+	/**
+	 * Checks if model has traces
+	 * 
+	 * @return true if there's traces, false if not
+	 */
+	public boolean hasTraces() {
+		boolean retval = false;
+		for (TraceGroup group : groups) {
+			if (group.hasTraces()) {
+				retval = true;
+				break;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets group ID from properties
+	 * 
+	 * @param properties
+	 *            the properties
+	 * @param group
+	 *            the group
+	 * @return the group ID
+	 * @throws TraceCompilerException
+	 */
+	public int getGroupID(Properties properties, TraceGroup group)
+			throws TraceCompilerException {
+		String value = properties.getProperty(GROUP_PROPERTY_PREFIX
+				+ group.getName());
+		int id;
+		if (value == null) {
+			// Not found, assign a proper ID
+			id = getNewIdForGroup(group);
+
+		} else {
+			try {
+				id = Integer.decode(value).intValue();
+				TraceGroup traceGroup = findGroupByID(id);
+				if (traceGroup != null && !traceGroup.equals(group)) {
+					// Id already in use, assign a proper ID
+					id = getNewIdForGroup(group);
+				}
+			} catch (NumberFormatException e) {
+				// Corrupted, assign a proper ID
+				id = getNewIdForGroup(group);
+			}
+		}
+		group.internalSetID(id);
+		return id;
+	}
+
+	/**
+	 * Gets a new ID for this group
+	 * 
+	 * @param group
+	 *            the group
+	 * @return a new ID for this group
+	 * @throws TraceCompilerException
+	 */
+	private int getNewIdForGroup(TraceGroup group) throws TraceCompilerException {
+		int id = FormattingUtils.getGroupID(group.getModel(), group.getName());
+		return id;
+	}
+
+	/**
+	 * Saves trace and group identifiers to given properties.
+	 * 
+	 * @param properties
+	 *            the properties to use
+	 */
+	public void saveIDs(Properties properties) {
+		properties.clear();
+		StringBuffer sb = new StringBuffer();
+		for (TraceGroup group : this) {
+			int groupId = group.getID();
+			properties.setProperty(GROUP_PROPERTY_PREFIX + group.getName(),
+					SourceConstants.HEX_PREFIX + Integer.toHexString(groupId));
+			for (Trace trace : group) {
+				int traceId = trace.getID();
+				properties.setProperty(TRACE_PROPERTY_PREFIX
+						+ createTraceName(sb, group, trace),
+						SourceConstants.HEX_PREFIX
+								+ Integer.toHexString(traceId));
+			}
+		}
+	}
+
+	/**
+	 * Merges the group and trace names together
+	 * 
+	 * @param sb
+	 *            the buffer where name is stored
+	 * @param group
+	 *            group
+	 * @param trace
+	 *            trace
+	 * @return the trace name
+	 */
+	public String createTraceName(StringBuffer sb, TraceGroup group, Trace trace) {
+		sb.setLength(0);
+		sb.append(group.getName());
+		sb.append(GROUP_ID_PREFIX);
+		int groupId = group.getID();
+		String groupIdString = SourceConstants.HEX_PREFIX
+				+ Integer.toString(groupId, HEX_RADIX).toUpperCase();
+		sb.append(groupIdString);
+		sb.append(GROUP_ID_SUFFIX);
+		sb.append(SourceConstants.UNDERSCORE);
+		sb.append(trace.getName());
+		return sb.toString();
+	}
+
+	/**
+	 * Gets fixed group and trace ids
+	 * 
+	 * @return fixed Ids
+	 */
+	public SortedProperties getFixedIds() {
+		return fixedIds;
+	}
+
+	/**
+	 * Set fixed group and trace ids
+	 * 
+	 * @param fixedIds
+	 *            fixed Ids
+	 */
+	public void setFixedIds(SortedProperties fixedIds) {
+		this.fixedIds = fixedIds;
+	}
+
+	/**
+	 * Gets next trace ID
+	 * 
+	 * @param group
+	 *            the group
+	 * @return the trace ID
+	 * @throws TraceCompilerException
+	 */
+	public int getNextTraceId(TraceGroup group) throws TraceCompilerException {
+		int currentMaxTraceID = 0;
+		int nextTraceId = 0;
+		// Check if there are some fixed Ids
+		if (fixedIds != null) {
+			Enumeration<Object> keys = this.fixedIds.keys();
+			String groupName = group.getName();
+			int groupId = group.getID();
+			String groupIdString = SourceConstants.HEX_PREFIX
+					+ Integer.toString(groupId, HEX_RADIX).toUpperCase();
+			// Go through fixed Ids and check if there are fixed trace Ids to
+			// this group
+			while (keys.hasMoreElements()) {
+				String key = (String) keys.nextElement();
+				if (key.startsWith(TRACE_PROPERTY_PREFIX + groupName
+						+ GROUP_ID_PREFIX + groupIdString + GROUP_ID_SUFFIX
+						+ SourceConstants.UNDERSCORE)
+						|| key.startsWith(OBSOLETE_PROPERTY_PREFIX
+								+ TRACE_PROPERTY_PREFIX + groupName
+								+ GROUP_ID_PREFIX + groupIdString
+								+ GROUP_ID_SUFFIX + SourceConstants.UNDERSCORE)) {
+					// Fixed trace Id to in this group found. Try to covert it
+					// to int value.
+					String value = fixedIds.getProperty(key);
+					int fixedId = 0;
+					try {
+						fixedId = Integer.decode(value).intValue();
+					} catch (NumberFormatException e) {
+						// Corrupted. Get next trace Id later on.
+						nextTraceId = 0;
+						break;
+					}
+					// Check if found fixed Id is bigger than current max trace
+					// Id in this group
+					if (fixedId > currentMaxTraceID) {
+						currentMaxTraceID = fixedId;
+					}
+				}
+			}
+			// If there were fixed trace Ids to this group. Set next trace Id to
+			// be current max trace Id + 1
+			if (currentMaxTraceID != 0) {
+				nextTraceId = currentMaxTraceID + 1;
+			}
+			// If next trace Id is zero or smaller than trace Id that group
+			// suggest. Set it be same as group suggest. This is done in case
+			// that we have added more than one new trace to same group after
+			// last fixed Id update
+			if (nextTraceId == 0 || nextTraceId < group.getNextTraceID()) {
+				nextTraceId = group.getNextTraceID();
+			}
+		} else {
+			// No fixed Ids. Get next trace Id from group
+			nextTraceId = group.getNextTraceID();
+		}
+		// Check that next trace Id is not bigger than max trace Id
+		if (nextTraceId > TraceCompilerEngineGlobals.MAX_TRACE_ID) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.RUN_OUT_OF_TRACE_IDS);
+		}
+
+		return nextTraceId;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModelExtension.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,43 @@
+/*
+* 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:
+*
+* Interface implemented by trace model extensions
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Interface implemented by trace model extensions
+ * 
+ */
+public interface TraceModelExtension {
+
+	/**
+	 * Sets the owner of this extension. Called when extension is added to a
+	 * trace object and called with null when removed from trace object
+	 * 
+	 * @param owner
+	 *            the owning object
+	 */
+	public void setOwner(TraceObject owner);
+
+	/**
+	 * Gets the owner of this extension
+	 * 
+	 * @return the owner
+	 */
+	public TraceObject getOwner();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModelExtensionListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,48 @@
+/*
+* 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:
+*
+* Listener interface for trace model extension notifications
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Listener interface for trace model extension notifications
+ * 
+ */
+public interface TraceModelExtensionListener {
+
+	/**
+	 * Notifies that an extension was added to the trace object
+	 * 
+	 * @param object
+	 *            the object where the extension was added
+	 * @param extension
+	 *            the new extension object
+	 */
+	public void extensionAdded(TraceObject object, TraceModelExtension extension);
+
+	/**
+	 * Notifies that an extension was removed from the trace object
+	 * 
+	 * @param object
+	 *            the object from where the extension was removed
+	 * @param extension
+	 *            the removed extension object
+	 */
+	public void extensionRemoved(TraceObject object,
+			TraceModelExtension extension);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModelListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Listener interface for trace model change notifications
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Listener interface for trace model change notifications
+ * 
+ */
+public interface TraceModelListener {
+
+	/**
+	 * Object name has been updated
+	 */
+	int NAME = 1;
+
+	/**
+	 * Object ID has been updated
+	 */
+	int ID = 2;
+
+	/**
+	 * Trace text has been updated
+	 */
+	int TRACE = 3;
+
+	/**
+	 * Parameter type has been updated
+	 */
+	int TYPE = 4;
+
+	/**
+	 * Notification which is fired when a trace object has been added
+	 * 
+	 * @param owner
+	 *            the owner of the object
+	 * @param object
+	 *            the object
+	 */
+	public void objectAdded(TraceObject owner, TraceObject object);
+
+	/**
+	 * Notification that is fired a trace object is removed from the model
+	 * 
+	 * @param owner
+	 *            the owner of the object
+	 * @param object
+	 *            the removed object
+	 * @throws TraceCompilerException 
+	 */
+	public void objectRemoved(TraceObject owner, TraceObject object) throws TraceCompilerException;
+
+	/**
+	 * Notifies that the one of the properties of an object have been updated
+	 * 
+	 * @param object
+	 *            the object which was updated
+	 * @param property
+	 *            the property that was updated
+	 * @throws TraceCompilerException 
+	 */
+	public void propertyUpdated(TraceObject object, int property) throws TraceCompilerException;
+
+	/**
+	 * Notifies that object creation is complete
+	 * 
+	 * @param object
+	 *            the object
+	 * @throws TraceCompilerException 
+	 */
+	public void objectCreationComplete(TraceObject object) throws TraceCompilerException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModelPersistentExtension.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Interface implemented by trace model extensions that need to store themselves 
+* into persistent storage along with other model elements
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Interface implemented by trace model extensions that need to store themselves
+ * into persistent storage along with other model elements. The storage format
+ * is left to the implementation. When loading, the trace provider calls
+ * TraceObjectFactory.createExtension with the storage name. The object factory
+ * returns an instance of this interface and the provider calls setData to
+ * initialize this.
+ * 
+ */
+public interface TraceModelPersistentExtension extends TraceModelExtension {
+
+	/**
+	 * Gets the name used when storing this extension
+	 * 
+	 * @return the storage name
+	 */
+	public String getStorageName();
+
+	/**
+	 * Gets the data of this extension
+	 * 
+	 * @return the extension data
+	 */
+	public String getData();
+
+	/**
+	 * Sets the data of this extension
+	 * 
+	 * @param data
+	 *            the data
+	 * @return true if extension should be added to model, false if not
+	 */
+	public boolean setData(String data);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModelResetListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Listener interface for trace model reset notifications
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Listener interface for trace model reset notifications
+ * 
+ */
+public interface TraceModelResetListener {
+
+	/**
+	 * Notification that is fired before the model is reset.
+	 */
+	public void modelResetting();
+
+	/**
+	 * Notification that is fired after the model is reset.
+	 */
+	public void modelReset();
+
+	/**
+	 * Validity changed notification
+	 * 
+	 * @param valid
+	 *            the validity changed flag
+	 * @throws TraceCompilerException 
+	 */
+	public void modelValid(boolean valid) throws TraceCompilerException;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObject.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,273 @@
+/*
+* 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:
+*
+* Base class for all trace model objects
+*
+*/
+package com.nokia.tracecompiler.model;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * Base class for all trace model objects
+ * 
+ */
+public abstract class TraceObject {
+
+	/**
+	 * The extensions can be used by trace providers to associate extra data to
+	 * the object.
+	 */
+	private ArrayList<TraceModelExtension> extensions = new ArrayList<TraceModelExtension>();
+
+	/**
+	 * Object ID.
+	 */
+	private int id;
+
+	/**
+	 * Object name.
+	 */
+	private String name = ""; //$NON-NLS-1$
+
+	/**
+	 * The trace model.
+	 */
+	private TraceModel model;
+
+	/**
+	 * Complete flag
+	 */
+	private boolean complete;
+
+	/**
+	 * Associates this object to a trace model.
+	 * 
+	 * @param model
+	 *            the model where this object belongs to
+	 */
+	void setModel(TraceModel model) {
+		this.model = model;
+	}
+
+	/**
+	 * Returns the trace model this object is associated to.
+	 * 
+	 * @return the trace model
+	 */
+	public TraceModel getModel() {
+		return model;
+	}
+
+	/**
+	 * Sets the ID of this object. Generates propertyUpdated event to model
+	 * listeners if the ID changes
+	 * 
+	 * @see TraceModelListener#propertyUpdated(TraceObject, int)
+	 * @param id
+	 *            the new ID
+	 * @throws TraceCompilerException 
+	 */
+	public void setID(int id) throws TraceCompilerException {
+		if (this.id != id) {
+			this.id = id;
+			model.notifyPropertyUpdated(this, TraceModelListener.ID);
+		}
+	}
+
+	/**
+	 * Sets the ID of this object but does not generate any notifications
+	 * 
+	 * @param id
+	 *            the new ID
+	 */
+	void internalSetID(int id) {
+		this.id = id;
+	}
+
+	/**
+	 * Returns the ID of this object.
+	 * 
+	 * @return the ID
+	 */
+	public int getID() {
+		return id;
+	}
+
+	/**
+	 * Sets the name of this object. Generates propertyUpdated event to model
+	 * listeners if the name changes
+	 * 
+	 * @see TraceModelListener#propertyUpdated(TraceObject, int)
+	 * @param name
+	 *            the new name
+	 * @throws TraceCompilerException 
+	 */
+	public void setName(String name) throws TraceCompilerException {
+		if (name == null) {
+			name = ""; //$NON-NLS-1$
+		}
+		if (!name.equals(this.name)) {
+			this.name = name;
+			model.notifyPropertyUpdated(this, TraceModelListener.NAME);
+		}
+	}
+
+	/**
+	 * Returns the name of this object. This never returns null
+	 * 
+	 * @return the name
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Adds an extension to this object. Generates extensionAdded event to model
+	 * listeners
+	 * 
+	 * @param extension
+	 *            the new extension
+	 */
+	public void addExtension(TraceModelExtension extension) {
+		if (extension == null) {
+			throw new NullPointerException();
+		}
+		extensions.add(extension);
+		extension.setOwner(this);
+		model.notifyExtensionAdded(this, extension);
+	}
+
+	/**
+	 * Removes an extension from this object. Generates extensionRemoved event
+	 * to model listeners if the extension was actually removed
+	 * 
+	 * @param extension
+	 *            the extension to be removed
+	 */
+	public void removeExtension(TraceModelExtension extension) {
+		if (extensions.remove(extension)) {
+			extension.setOwner(null);
+			model.notifyExtensionRemoved(this, extension);
+		}
+	}
+
+	/**
+	 * Removes all extensions which are of given type
+	 * 
+	 * @param <T>
+	 *            the type of the extension
+	 * @param extClass
+	 *            the extension type
+	 */
+	public <T extends TraceModelExtension> void removeExtensions(
+			Class<T> extClass) {
+		Iterator<TraceModelExtension> itr = extensions.iterator();
+		while (itr.hasNext()) {
+			TraceModelExtension ext = itr.next();
+			if (extClass.isAssignableFrom(ext.getClass())) {
+				itr.remove();
+				ext.setOwner(null);
+				model.notifyExtensionRemoved(this, ext);
+			}
+		}
+	}
+
+	/**
+	 * Returns the first extension which is of given type. The extensions are
+	 * stored in a list in the order they have been added. This returns the
+	 * first instance found from the list.
+	 * 
+	 * @param <T>
+	 *            the type of the extension
+	 * @param extClass
+	 *            the extension type
+	 * @return the extension or null if not found
+	 */
+	@SuppressWarnings("unchecked")
+	public <T extends TraceModelExtension> T getExtension(Class<T> extClass) {
+		T ret = null;
+		for (TraceModelExtension ext : extensions) {
+			if (extClass.isAssignableFrom(ext.getClass())) {
+				ret = (T) ext;
+				break;
+			}
+		}
+		return ret;
+	}
+
+	/**
+	 * Returns the extensions which are of given type.
+	 * 
+	 * @param <T>
+	 *            the type of the extension
+	 * @param extClass
+	 *            the extension type
+	 * @return iterator over the list of extension
+	 */
+	@SuppressWarnings("unchecked")
+	public <T extends TraceModelExtension> Iterator<T> getExtensions(
+			Class<T> extClass) {
+		ArrayList<T> list = new ArrayList<T>();
+		for (TraceModelExtension ext : extensions) {
+			if (extClass.isAssignableFrom(ext.getClass())) {
+				list.add((T) ext);
+			}
+		}
+		return list.iterator();
+	}
+
+	/**
+	 * Resets the ID and name
+	 */
+	void reset() {
+		id = 0;
+		name = ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * Sets the complete flag and fires complete event
+	 * @throws TraceCompilerException 
+	 */
+	void setComplete() throws TraceCompilerException {
+		complete = true;
+		model.notifyObjectCreationComplete(this);
+	}
+
+	/**
+	 * Calls OnDelete rules if the object owns them
+	 * 
+	 * @param object
+	 *            the object that was removed
+	 */
+	protected void notifyOnDelete(TraceObject object) {
+		Iterator<TraceObjectRuleOnDelete> rules = object
+				.getExtensions(TraceObjectRuleOnDelete.class);
+		while (rules.hasNext()) {
+			rules.next().objectDeleted();
+		}
+	}
+
+	/**
+	 * Gets the complete flag
+	 * 
+	 * @return the flag
+	 */
+	public boolean isComplete() {
+		return complete;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectFactory.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,319 @@
+/*
+* 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:
+*
+* Creates trace objects and provides configurable rules for trace object creation
+*
+*/
+package com.nokia.tracecompiler.model;
+
+import java.util.Iterator;
+
+/**
+ * Creates trace objects and provides configurable rules for trace object
+ * creation
+ * 
+ */
+public class TraceObjectFactory {
+
+	/**
+	 * The trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * Rule factory
+	 */
+	private TraceObjectRuleFactory ruleFactory;
+
+	/**
+	 * Creates a new factory
+	 * 
+	 * @param model
+	 *            the model
+	 * @param factory
+	 *            the rule factory
+	 * @throws TraceCompilerException 
+	 */
+	TraceObjectFactory(TraceModel model, TraceObjectRuleFactory factory) throws TraceCompilerException {
+		this.model = model;
+		this.ruleFactory = factory;
+		processNewObjectRules(model);
+		model.setComplete();
+	}
+
+	/**
+	 * Gets the rule factory
+	 * 
+	 * @return the rule factory
+	 */
+	public TraceObjectRuleFactory getRuleFactory() {
+		return ruleFactory;
+	}
+
+	/**
+	 * Creates a new trace group
+	 * 
+	 * @param id
+	 *            the group ID
+	 * @param name
+	 *            the name for the group
+	 * @param extensions
+	 *            list of extensions to be added to the group
+	 * @return the new group
+	 * @throws TraceCompilerException 
+	 */
+	public TraceGroup createTraceGroup(int id, String name,
+			TraceModelExtension[] extensions) throws TraceCompilerException {
+		TraceGroup group = new TraceGroup(model);
+		group.setID(id);
+		group.setName(name);
+		setExtensions(group, extensions);
+		processNewObjectRules(group);
+		group.setComplete();
+		return group;
+	}
+
+	/**
+	 * Creates a new trace
+	 * 
+	 * @param group
+	 *            the trace group
+	 * @param id
+	 *            the id for the trace
+	 * @param name
+	 *            the trace name
+	 * @param traceText
+	 *            the trace text
+	 * @param extensions
+	 *            list of extensions to be added to the trace
+	 * @return the new trace
+	 * @throws TraceCompilerException 
+	 */
+	public Trace createTrace(TraceGroup group, int id, String name,
+			String traceText, TraceModelExtension[] extensions) throws TraceCompilerException {
+		Trace trace = new Trace(group);
+		trace.setID(id);
+		trace.setName(name);
+		trace.setTrace(traceText);
+		setExtensions(trace, extensions);
+		processNewObjectRules(trace);
+		trace.setComplete();
+		return trace;
+	}
+
+	/**
+	 * Creates a new trace parameter
+	 * 
+	 * @param trace
+	 *            the trace the parameter is associated to
+	 * @param id
+	 *            the parameter ID
+	 * @param name
+	 *            the parameter name
+	 * @param type
+	 *            parameter type
+	 * @param extensions
+	 *            list of extensions to be added to the parameter
+	 * @return the new parameter
+	 * @throws TraceCompilerException 
+	 */
+	public TraceParameter createTraceParameter(Trace trace, int id,
+			String name, String type, TraceModelExtension[] extensions) throws TraceCompilerException {
+		TraceParameter parameter = new TraceParameter(trace);
+		initializeParameter(parameter, id, name, type, extensions);
+		return parameter;
+	}
+
+	/**
+	 * Creates a new trace parameter inserting it into the specified index
+	 * 
+	 * @param objectIndex
+	 *            the index for the object
+	 * @param trace
+	 *            the trace the parameter is associated to
+	 * @param id
+	 *            the parameter ID
+	 * @param name
+	 *            the parameter name
+	 * @param type
+	 *            parameter type
+	 * @param extensions
+	 *            list of extensions to be added to the parameter
+	 * @return the new parameter
+	 * @throws TraceCompilerException 
+	 */
+	public TraceParameter createTraceParameter(int objectIndex, Trace trace,
+			int id, String name, String type, TraceModelExtension[] extensions) throws TraceCompilerException {
+		TraceParameter parameter = new TraceParameter(trace, objectIndex);
+		initializeParameter(parameter, id, name, type, extensions);
+		return parameter;
+	}
+
+	/**
+	 * Initializes a parameter
+	 * 
+	 * @param parameter
+	 *            the parameter
+	 * @param id
+	 *            the parameter ID
+	 * @param name
+	 *            the parameter name
+	 * @param type
+	 *            parameter type
+	 * @param extensions
+	 *            list of extensions to be added to the parameter
+	 * @throws TraceCompilerException 
+	 */
+	private void initializeParameter(TraceParameter parameter, int id,
+			String name, String type, TraceModelExtension[] extensions) throws TraceCompilerException {
+		parameter.setID(id);
+		parameter.setName(name);
+		parameter.setType(type);
+		setExtensions(parameter, extensions);
+		processNewObjectRules(parameter);
+		parameter.setComplete();
+	}
+
+	/**
+	 * Creates a new constant table
+	 * 
+	 * @param id
+	 *            id for the table
+	 * @param typeName
+	 *            the name for the table
+	 * @param extensions
+	 *            list of extensions to be added to the table
+	 * @return the constant table
+	 * @throws TraceCompilerException 
+	 */
+	public TraceConstantTable createConstantTable(int id, String typeName,
+			TraceModelExtension[] extensions) throws TraceCompilerException {
+		TraceConstantTable table = new TraceConstantTable(model);
+		table.setID(id);
+		table.setName(typeName);
+		setExtensions(table, extensions);
+		processNewObjectRules(table);
+		table.setComplete();
+		for (TraceGroup group : model) {
+			for (Trace trace : group) {
+				for (TraceParameter param : trace) {
+					if (param.getType().equals(typeName)) {
+						table.addParameterReference(param);
+					}
+				}
+			}
+		}
+		return table;
+	}
+
+	/**
+	 * Creates a new constant table entry
+	 * 
+	 * @param table
+	 *            constant table
+	 * @param id
+	 *            id for the entry
+	 * @param value
+	 *            value for the entry
+	 * @param extensions
+	 *            list of extensions to be added to the constant
+	 * @return the constant table entry
+	 * @throws TraceCompilerException 
+	 */
+	public TraceConstantTableEntry createConstantTableEntry(
+			TraceConstantTable table, int id, String value,
+			TraceModelExtension[] extensions) throws TraceCompilerException {
+		TraceConstantTableEntry entry = new TraceConstantTableEntry(table);
+		entry.setID(id);
+		entry.setName(value);
+		setExtensions(entry, extensions);
+		processNewObjectRules(entry);
+		entry.setComplete();
+		return entry;
+	}
+
+	/**
+	 * Creates an extension based on its name. This does not add the extension
+	 * to the object, since the setData method should be called first
+	 * 
+	 * @param object
+	 *            the target object for the extension
+	 * @param name
+	 *            the extension name
+	 * @return the created extension
+	 */
+	public TraceModelPersistentExtension createExtension(TraceObject object,
+			String name) {
+		return ruleFactory.createExtension(object, name);
+	}
+
+	/**
+	 * Adds extensions to given object
+	 * 
+	 * @param object
+	 *            the object
+	 * @param extensions
+	 *            extensions to be added
+	 */
+	private void setExtensions(TraceObject object,
+			TraceModelExtension[] extensions) {
+		if (extensions != null) {
+			for (TraceModelExtension element : extensions) {
+				object.addExtension(element);
+			}
+		}
+	}
+
+	/**
+	 * Processes the rules of a new object
+	 * 
+	 * @param object
+	 *            the object to be processed
+	 * @throws TraceCompilerException 
+	 */
+	private void processNewObjectRules(TraceObject object) throws TraceCompilerException {
+		// Calls the factory to preprocess the extensions passed to
+		// create-function
+		ruleFactory.preProcessNewRules(object);
+		// The rules may contain object creation rules
+		Iterator<TraceObjectRule> rules = object
+				.getExtensions(TraceObjectRule.class);
+		while (rules.hasNext()) {
+			TraceObjectRule rule = rules.next();
+			if (rule instanceof TraceObjectRuleCreateObject) {
+				TraceObjectRuleCreateObject createRule = (TraceObjectRuleCreateObject) rule;
+				createRule.createObject();
+			}
+		}
+		// Some rules are removed after the objects have been created
+		Iterator<TraceObjectRuleRemoveOnCreate> itr;
+		boolean changed;
+		do {
+			changed = false;
+			itr = object.getExtensions(TraceObjectRuleRemoveOnCreate.class);
+			while (itr.hasNext() && !changed) {
+				TraceObjectRuleRemoveOnCreate ext = itr.next();
+				if (ext.canBeRemoved()) {
+					object.removeExtension(ext);
+					changed = true;
+				}
+			}
+		} while (changed);
+		// After processing is complete, the rule factory is used to do
+		// post-processing
+		ruleFactory.postProcessNewRules(object);
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectModifier.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,42 @@
+/*
+* 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:
+*
+* Modifier properties is returned by one of the TraceObjectUtils.modify methods
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Modifier properties is returned by one of the TraceObjectUtils.modify
+ * methods.
+ * 
+ */
+public interface TraceObjectModifier {
+
+	/**
+	 * Gets the data
+	 * 
+	 * @return the data
+	 */
+	public String getData();
+
+	/**
+	 * Checks if the data was changed during the modify call
+	 * 
+	 * @return true if data was changed
+	 */
+	public boolean hasChanged();
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectProperty.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Property associated with a trace object
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Property associated with a trace object
+ * 
+ */
+public interface TraceObjectProperty {
+
+	/**
+	 * Gets the name of the property
+	 * 
+	 * @return the name
+	 */
+	public String getName();
+
+	/**
+	 * Gets the value of the property
+	 * 
+	 * @return the value
+	 */
+	public String getValue();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectPropertyList.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* List of properties associated to a trace object
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * List of properties associated to a trace object
+ * 
+ */
+public interface TraceObjectPropertyList extends TraceModelExtension,
+		Iterable<TraceObjectProperty> {
+
+	/**
+	 * Gets a property by name
+	 * 
+	 * @param name
+	 *            the property name
+	 * @return the property
+	 */
+	public TraceObjectProperty getProperty(String name);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectPropertyVerifier.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,143 @@
+/*
+* 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:
+*
+* Content verifier interface for trace objects
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Content verifier interface for trace objects
+ * 
+ */
+public interface TraceObjectPropertyVerifier {
+
+	/**
+	 * Checks the properties of a trace before it is created or modified
+	 * 
+	 * @param group
+	 *            the group for the trace
+	 * @param trace
+	 *            trace to be modified. If creating new, this is null
+	 * @param id
+	 *            the trace ID
+	 * @param name
+	 *            the name of the trace
+	 * @param data
+	 *            the trace data
+	 * @throws TraceCompilerException
+	 *             if properties are not valid. The error code from the
+	 *             exception is used to create an error dialog
+	 */
+	public void checkTraceProperties(TraceGroup group, Trace trace, int id,
+			String name, String data) throws TraceCompilerException;
+
+	/**
+	 * Checks the properties of a trace group before it is created or modified
+	 * 
+	 * @param owner
+	 *            the model owning the trace group
+	 * @param group
+	 *            group to be modified. If creating new, this is null
+	 * @param id
+	 *            the trace ID
+	 * @param name
+	 *            the name of the trace
+	 * @throws TraceCompilerException
+	 *             if properties are not valid. The error code from the
+	 *             exception is used to create an error dialog
+	 */
+	public void checkTraceGroupProperties(TraceModel owner, TraceGroup group,
+			int id, String name) throws TraceCompilerException;
+
+	/**
+	 * Checks the properties of a parameter before it is created or modified
+	 * 
+	 * @param owner
+	 *            the parameter owner
+	 * @param parameter
+	 *            parameter to be modified. If creating new, this is null
+	 * @param id
+	 *            the parameter ID
+	 * @param name
+	 *            the name of the parameter
+	 * @param type
+	 *            the type of the parameter
+	 * @throws TraceCompilerException
+	 *             if properties are not valid. The error code from the
+	 *             exception is used to create an error dialog
+	 */
+	public void checkTraceParameterProperties(Trace owner,
+			TraceParameter parameter, int id, String name, String type)
+			throws TraceCompilerException;
+
+	/**
+	 * Checks the properties of a constant table before it is created or
+	 * modified
+	 * 
+	 * @param owner
+	 *            the model owning the constant table
+	 * @param table
+	 *            the table to be changed. If creating new, this is null
+	 * @param id
+	 *            the ID of the table
+	 * @param tableName
+	 *            the name of the table
+	 * @throws TraceCompilerException
+	 *             if properties are not valid. The error code from the
+	 *             exception is used to create an error dialog
+	 */
+	public void checkConstantTableProperties(TraceModel owner,
+			TraceConstantTable table, int id, String tableName)
+			throws TraceCompilerException;
+
+	/**
+	 * Checks the properties of a constant table entry before it is created
+	 * 
+	 * @param table
+	 *            the constant table
+	 * @param entry
+	 *            the entry to be modified. If creating new, this is null
+	 * @param id
+	 *            the ID for the new entry
+	 * @param value
+	 *            the value for the new entry
+	 * @throws TraceCompilerException
+	 *             if properties are not valid. The error code from the
+	 *             exception is used to create an error dialog
+	 */
+	public void checkConstantProperties(TraceConstantTable table,
+			TraceConstantTableEntry entry, int id, String value)
+			throws TraceCompilerException;
+
+	/**
+	 * Checks the properties of trace model before it is modified
+	 * 
+	 * @param model
+	 *            the trace model
+	 * @param id
+	 *            the model ID
+	 * @param name
+	 *            the model name
+	 * @param path
+	 *            the model path
+	 * @throws TraceCompilerException
+	 *             if properties are not valid. The error code from the
+	 *             exception is used to create an error dialog
+	 */
+	public void checkTraceModelProperties(TraceModel model, int id,
+			String name, String path) throws TraceCompilerException;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,26 @@
+/*
+* 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:
+*
+* Base interface for trace model object processing rules
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Base interface for trace model object processing rules
+ * 
+ */
+public interface TraceObjectRule extends TraceModelExtension {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectRuleCreateObject.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Rule for automatic object creation
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Rule for automatic object creation
+ * 
+ */
+public interface TraceObjectRuleCreateObject extends TraceObjectRule {
+
+	/**
+	 * Called to create a new object into the owner of this rule
+	 * @throws TraceCompilerException 
+	 */
+	public void createObject() throws TraceCompilerException;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectRuleFactory.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,55 @@
+/*
+* 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:
+*
+* Creates trace objects and provides configurable rules for trace object creation
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Allows registration of rules into the trace object factory
+ * 
+ */
+public interface TraceObjectRuleFactory {
+
+	/**
+	 * Called before the rules of a new object are processed by object factory
+	 * 
+	 * @param object
+	 *            new object
+	 */
+	public void preProcessNewRules(TraceObject object);
+
+	/**
+	 * Called after the rules of a new object are processed by object factory
+	 * 
+	 * @param object
+	 *            new object
+	 */
+	public void postProcessNewRules(TraceObject object);
+
+	/**
+	 * Creates an extension based on extension name
+	 * 
+	 * @param object
+	 *            the target object
+	 * @param name
+	 *            the name of the extension
+	 * @return the new extension
+	 */
+	public TraceModelPersistentExtension createExtension(TraceObject object,
+			String name);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectRuleOnDelete.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Rule to perform processing when object is deleted
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Rule to perform processing when object is deleted
+ * 
+ */
+public interface TraceObjectRuleOnDelete extends TraceObjectRule {
+
+	/**
+	 * Called when the object that owns this rule is deleted
+	 */
+	public void objectDeleted();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectRuleRemoveOnCreate.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,34 @@
+/*
+* 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:
+*
+* Extension that is removed from the object after it has been created
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Extension that is removed from the object after it has been created
+ * 
+ */
+public interface TraceObjectRuleRemoveOnCreate extends TraceObjectRule {
+
+	/**
+	 * Returns true if this rule can be removed
+	 * 
+	 * @return true if remove, false otherwise
+	 */
+	public boolean canBeRemoved();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceObjectUtils.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,224 @@
+/*
+* 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:
+*
+* Utility functions for checking properties of trace objects
+*
+*/
+package com.nokia.tracecompiler.model;
+
+import java.util.Comparator;
+
+/**
+ * Utility functions for checking properties of trace objects.
+ * 
+ */
+public class TraceObjectUtils {
+
+	/**
+	 * Compares a trace to trace ID
+	 */
+	static Comparator<Object> traceToIDComparator = new Comparator<Object>() {
+
+		/**
+		 * Compares a trace to trace name
+		 * 
+		 * @param t1
+		 *            the trace
+		 * @param t2
+		 *            the trace name
+		 * @return the comparison result
+		 */
+		public int compare(Object t1, Object t2) {
+			int n1 = ((Trace) t1).getID();
+			int n2 = (Integer) t2;
+			return n1 > n2 ? 1 : n1 < n2 ? -1 : 0;
+		}
+
+	};
+
+	/**
+	 * Compares a trace to trace name
+	 */
+	static Comparator<Object> traceToNameComparator = new Comparator<Object>() {
+
+		/**
+		 * Compares a trace to trace name
+		 * 
+		 * @param t1
+		 *            the trace
+		 * @param t2
+		 *            the trace name
+		 * @return the comparison result
+		 */
+		public int compare(Object t1, Object t2) {
+			String n1 = ((Trace) t1).getName();
+			String n2 = (String) t2;
+			if (n1 == null) {
+				n1 = ""; //$NON-NLS-1$
+			}
+			if (n2 == null) {
+				n2 = ""; //$NON-NLS-1$
+			}
+			return n1.compareTo(n2);
+		}
+
+	};
+
+	/**
+	 * Compares a trace to trace text
+	 */
+	static Comparator<Object> traceToTextComparator = new Comparator<Object>() {
+
+		/**
+		 * Compares a trace to trace text
+		 * 
+		 * @param t1
+		 *            the trace
+		 * @param t2
+		 *            the trace text
+		 * @return the comparison result
+		 */
+		public int compare(Object t1, Object t2) {
+			String n1 = ((Trace) t1).getTrace();
+			String n2 = (String) t2;
+			if (n1 == null) {
+				n1 = ""; //$NON-NLS-1$
+			}
+			if (n2 == null) {
+				n2 = ""; //$NON-NLS-1$
+			}
+			return n1.compareTo(n2);
+		}
+
+	};
+
+	/**
+	 * Compares trace objects by ID
+	 */
+	static Comparator<TraceObject> traceObjectIDComparator = new Comparator<TraceObject>() {
+
+		/**
+		 * Compares ID's of trace objects
+		 * 
+		 * @param t1
+		 *            trace 1
+		 * @param t2
+		 *            trace 2
+		 * @return the comparison result
+		 */
+		public int compare(TraceObject t1, TraceObject t2) {
+			int n1 = t1.getID();
+			int n2 = t2.getID();
+			return n1 > n2 ? 1 : n1 < n2 ? -1 : 0;
+		}
+
+	};
+
+	/**
+	 * Compares trace objects by name
+	 */
+	static Comparator<TraceObject> traceObjectNameComparator = new Comparator<TraceObject>() {
+
+		/**
+		 * Compares names of trace objects
+		 * 
+		 * @param t1
+		 *            trace 1
+		 * @param t2
+		 *            trace 2
+		 * @return the comparison result
+		 */
+		public int compare(TraceObject t1, TraceObject t2) {
+			String n1 = t1.getName();
+			String n2 = t2.getName();
+			if (n1 == null) {
+				n1 = ""; //$NON-NLS-1$
+			}
+			if (n2 == null) {
+				n2 = ""; //$NON-NLS-1$
+			}
+			return n1.compareTo(n2);
+		}
+
+	};
+
+	/**
+	 * Prevents construction
+	 */
+	private TraceObjectUtils() {
+	}
+
+	/**
+	 * Checks if trace parameter name is already in use and changes if it is.
+	 * 
+	 * @param owner
+	 *            the owner of the parameter
+	 * @param name
+	 *            the parameter name
+	 * @return the modifier interface
+	 */
+	public static TraceObjectModifier modifyDuplicateParameterName(Trace owner,
+			String name) {
+		DuplicateParameterNameModifier modifier = new DuplicateParameterNameModifier(
+				owner, name);
+		modifier.processName();
+		return modifier;
+	}
+
+	/**
+	 * Gets the duplicate modifier from given text
+	 * 
+	 * @param text
+	 *            the text
+	 * @return the duplicate modifier
+	 */
+	public static String removeDuplicateModifier(String text) {
+		String retval;
+		String s = DuplicateValueModifier.getModifier(text);
+		if (s != null) {
+			retval = text.substring(s.length());
+		} else {
+			retval = text;
+		}
+		return retval;
+	}
+
+	/**
+	 * Finds a property from a trace object. This returns an empty string if not
+	 * found
+	 * 
+	 * @param object
+	 *            the object
+	 * @param name
+	 *            the property name
+	 * @return the property value
+	 */
+	public static String findProperty(TraceObject object, String name) {
+		String retval = null;
+		TraceObjectPropertyList propertyList = object
+				.getExtension(TraceObjectPropertyList.class);
+		if (propertyList != null) {
+			TraceObjectProperty property = propertyList.getProperty(name);
+			if (property != null) {
+				retval = property.getValue();
+			}
+		}
+		if (retval == null) {
+			retval = ""; //$NON-NLS-1$
+		}
+		return retval;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceParameter.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,249 @@
+/*
+* 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:
+*
+* All trace objects may contain parameters
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Traces may contain parameters
+ * 
+ */
+public class TraceParameter extends TraceObject {
+
+	/**
+	 * The type of this parameter
+	 */
+	private String type;
+
+	/**
+	 * Hexadecimal (%p), pointer type
+	 */
+	public static final String POINTER = "void*"; //$NON-NLS-1$
+	
+	/**
+	 * Signed decimal (%d), 32-bit type
+	 */
+	public static final String SDEC32 = "int32"; //$NON-NLS-1$
+
+	/**
+	 * Hexadecimal (%x), 32-bit type
+	 */
+	public static final String HEX32 = "hex32"; //$NON-NLS-1$
+
+	/**
+	 * Unsigned decimal (%u), 32-bit type
+	 */
+	public static final String UDEC32 = "uint32"; //$NON-NLS-1$
+	
+	/**
+	 * Octal (%o), 32-bit type
+	 */
+	public static final String OCT32 = "oct32"; //$NON-NLS-1$	
+
+	/**
+	 * Signed decimal (%hd), 16-bit type
+	 */
+	public static final String SDEC16 = "int16"; //$NON-NLS-1$
+
+	/**
+	 * Hexadecimal (%hx), 16-bit type
+	 */
+	public static final String HEX16 = "hex16"; //$NON-NLS-1$
+
+	/**
+	 * Unsigned decimal (%hu), 16-bit type
+	 */
+	public static final String UDEC16 = "uint16"; //$NON-NLS-1$
+	
+	/**
+	 * Octal (%ho), 16-bit type
+	 */
+	public static final String OCT16 = "oct16"; //$NON-NLS-1$	
+
+	/**
+	 * Signed decimal (%hhd), 8-bit type
+	 */
+	public static final String SDEC8 = "int8"; //$NON-NLS-1$
+
+	/**
+	 * Hexadecimal (%hhx), 8-bit type
+	 */
+	public static final String HEX8 = "hex8"; //$NON-NLS-1$
+
+	/**
+	 * Unsigned decimal (%hhu), 8-bit type
+	 */
+	public static final String UDEC8 = "uint8"; //$NON-NLS-1$
+	
+	/**
+	 * Octal (%hho), 8-bit type
+	 */
+	public static final String OCT8 = "oct8"; //$NON-NLS-1$
+
+	/**
+	 * Signed decimal (%ld), 64-bit type
+	 */
+	public static final String SDEC64 = "int64"; //$NON-NLS-1$
+
+	/**
+	 * Time, 64-bit type
+	 */
+	public static final String TIME = "time"; //$NON-NLS-1$	
+	
+	/**
+	 * Hexadecimal (%lx), 64-bit type
+	 */
+	public static final String HEX64 = "hex64"; //$NON-NLS-1$
+
+	/**
+	 * Unsigned decimal (%lu), 64-bit type
+	 */
+	public static final String UDEC64 = "uint64"; //$NON-NLS-1$
+	
+	/**
+	 * Octal (%lo), 64-bit type
+	 */
+	public static final String OCT64 = "oct64"; //$NON-NLS-1$	
+
+	/**
+	 * Ascii string (%s) type
+	 */
+	public static final String ASCII = "ascii"; //$NON-NLS-1$
+
+	/**
+	 * Unicode string (%S) type
+	 */
+	public static final String UNICODE = "unicode"; //$NON-NLS-1$
+
+	/**
+	 * Fixed floating point (%f), 64-bit
+	 */
+	public static final String FLOAT_FIX = "ffix"; //$NON-NLS-1$
+
+	/**
+	 * Exponent floating point (%e), 64-bit
+	 */
+	public static final String FLOAT_EXP = "fexp"; //$NON-NLS-1$
+
+	/**
+	 * Fixed / exponential floating point (%g), 64-bit
+	 */
+	public static final String FLOAT_OPT = "fopt"; //$NON-NLS-1$
+
+	/**
+	 * The trace this parameter belongs to
+	 */
+	private Trace owner;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param owner
+	 *            the object owning this parameter
+	 */
+	public TraceParameter(Trace owner) {
+		setModel(owner.getModel());
+		owner.addParameter(this);
+		this.owner = owner;
+	}
+
+	/**
+	 * Constructor, which inserts the parameter into specified index
+	 * 
+	 * @param owner
+	 *            the object owning this parameter
+	 * @param index
+	 *            the parameter index
+	 */
+	TraceParameter(Trace owner, int index) {
+		setModel(owner.getModel());
+		owner.insertParameter(index, this);
+		this.owner = owner;
+	}
+
+	/**
+	 * Gets the trace this parameter is associated to.
+	 * 
+	 * @return the trace
+	 */
+	public Trace getTrace() {
+		return owner;
+	}
+
+	/**
+	 * Sets the parameter type. Generates propertyUpdated event to model
+	 * listeners if type changes
+	 * 
+	 * @see TraceModelListener#propertyUpdated(TraceObject, int)
+	 * @param type
+	 *            the parameter type
+	 * @throws TraceCompilerException 
+	 */
+	public void setType(String type) throws TraceCompilerException {
+		if (!type.equals(this.type)) {
+			removeTableReference();
+			this.type = type;
+			addTableReference();
+			getModel().notifyPropertyUpdated(this, TraceModelListener.TYPE);
+		}
+	}
+
+	/**
+	 * Gets the parameter type
+	 * 
+	 * @return the parameter type
+	 */
+	public String getType() {
+		return type;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceObject#reset()
+	 */
+	@Override
+	void reset() {
+		removeTableReference();
+		super.reset();
+	}
+
+	/**
+	 * Adds a constant table reference
+	 */
+	private void addTableReference() {
+		if (type != null) {
+			TraceConstantTable table = getModel().findConstantTableByName(type);
+			if (table != null) {
+				table.addParameterReference(this);
+			}
+		}
+	}
+
+	/**
+	 * Removes the constant table reference
+	 */
+	private void removeTableReference() {
+		if (type != null) {
+			TraceConstantTable table = getModel().findConstantTableByName(type);
+			if (table != null) {
+				table.removeParameterReference(this);
+			}
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceProcessingListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,42 @@
+/*
+* 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:
+*
+* Multi-update optimization
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Callback interface which should be notified when performing multiple updates
+ * to the trace model. The implementation of TraceModelListener can also
+ * implement this interface to avoid performing unnecessary updates.
+ * 
+ */
+public interface TraceProcessingListener {
+
+	/**
+	 * Called when a sequence of trace model updates is about to start
+	 */
+	public void processingStarted();
+
+	/**
+	 * Called when a sequence of trace model updates has finished
+	 * 
+	 * @param changed
+	 *            true if the model was changed while processing, false if not
+	 */
+	public void processingComplete(boolean changed);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+Contains the model of TraceCompiler.
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+TraceCompiler implementation.
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceAPIFormatter.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,86 @@
+/*
+* 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:
+*
+* Trace API formatter plug-in
+*
+*/
+package com.nokia.tracecompiler.plugin;
+
+/**
+ * Trace API formatter plug-in
+ * 
+ */
+public interface TraceAPIFormatter {
+
+	/**
+	 * Formatting types for traces
+	 */
+	public enum TraceFormatType {
+
+		/**
+		 * Format for extension function header
+		 */
+		HEADER,
+
+		/**
+		 * Format for trace buffer function. Added to extension function
+		 * definition if trace contains more data than is supported by the API
+		 */
+		TRACE_BUFFER,
+
+		/**
+		 * Format for trace function if the extension function parameters can be
+		 * packed into normal trace API call. For example, if the extension
+		 * function takes 4 8-bit arguments, they are packed into a single
+		 * 32-bit parameter
+		 */
+		TRACE_PACKED,
+
+		/**
+		 * Format for trace activation check function. Added to extension
+		 * function definition
+		 */
+		TRACE_ACTIVATION,
+
+		/**
+		 * Empty declaration for an extension function header
+		 */
+		EMPTY_MACRO
+	}
+
+	/**
+	 * Gets the name of this formatter
+	 * 
+	 * @return the name
+	 */
+	public String getName();
+
+	/**
+	 * Gets the title shown in the API selection preferences dialog
+	 * 
+	 * @return the title
+	 */
+	public String getTitle();
+
+	/**
+	 * Gets the trace format based on format type
+	 * 
+	 * @param type
+	 *            the format type
+	 * @return the trace format
+	 */
+	public String getTraceFormat(TraceFormatType type);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceAPIParser.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,60 @@
+/*
+* 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:
+*
+* Trace API parser plug-in
+*
+*/
+package com.nokia.tracecompiler.plugin;
+
+import com.nokia.tracecompiler.engine.TraceLocation;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+
+/**
+ * Trace API parser plug-in
+ * 
+ */
+public interface TraceAPIParser {
+
+	/**
+	 * Gets the tag to be located from source
+	 * 
+	 * @return the tag
+	 */
+	public String getSourceTag();
+
+	/**
+	 * Gets the list of suffixes that are allowed with the source tag
+	 * 
+	 * @return the suffixes
+	 */
+	public String[] getTagSuffixes();
+
+	/**
+	 * Verifies the validity of given location
+	 * 
+	 * @param location
+	 *            the location to be checked
+	 * @return error code from TraceCompilerErrorCodes
+	 */
+	public TraceCompilerErrorCode checkLocationValidity(TraceLocation location);
+
+	/**
+	 * Gets the name of the group where locations created by this parser belong
+	 * 
+	 * @return the location group
+	 */
+	public String getLocationGroup();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceAPIPlugin.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Plug-in which provides trace API extensions
+*
+*/
+package com.nokia.tracecompiler.plugin;
+
+/**
+ * Plug-in which provides trace API extensions
+ * 
+ */
+public interface TraceAPIPlugin extends TraceCompilerPlugin {
+
+	/**
+	 * Gets the list of trace API formatters
+	 * 
+	 * @return the formatters
+	 */
+	public TraceAPIFormatter[] getFormatters();
+
+	/**
+	 * Gets the list of trace API parsers
+	 * 
+	 * @return the parsers
+	 */
+	public TraceAPIParser[] getParsers();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceCompilerExport.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* Export plug-in interface for trace projects
+*
+*/
+package com.nokia.tracecompiler.plugin;
+
+import com.nokia.tracecompiler.model.TraceCompilerException;
+
+/**
+ * Export plug-in interface for trace projects.
+ * 
+ */
+public interface TraceCompilerExport extends TraceCompilerPlugin {
+
+	/**
+	 * Exports the trace project. This is called when the user selects the
+	 * export action from the menu
+	 * 
+	 * @throws TraceCompilerException
+	 *             if export fails
+	 */
+	public void exportTraceProject() throws TraceCompilerException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceCompilerPlugin.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,43 @@
+/*
+* 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:
+*
+* TraceCompiler plug-in interface
+*
+*/
+package com.nokia.tracecompiler.plugin;
+
+import com.nokia.tracecompiler.model.TraceModel;
+
+/**
+ * TraceCompiler plug-in interface
+ * 
+ */
+public interface TraceCompilerPlugin {
+
+	/**
+	 * Notification that the trace project has been opened. Provides the model
+	 * to this plug-in. The model is not changed until closeTraceProject and
+	 * thus no null-checks are needed.
+	 * 
+	 * @param model
+	 *            the trace model
+	 */
+	public void traceProjectOpened(TraceModel model);
+
+	/**
+	 * Notification that the trace project has been closed
+	 */
+	public void traceProjectClosed();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceFormatConstants.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,123 @@
+/*
+ * 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:
+ *
+ * Formatting constants for traces
+ *
+ */
+package com.nokia.tracecompiler.plugin;
+
+/**
+ * Formatting constants for traces
+ * 
+ */
+public interface TraceFormatConstants {
+
+	/**
+	 * Function name in upper case
+	 */
+	String FORMAT_FUNCTION_NAME_UPPER_CASE = "{$FN}"; //$NON-NLS-1$
+
+	/**
+	 * Function name in normal case
+	 */
+	String FORMAT_FUNCTION_NAME_NORMAL_CASE = "{$fn}"; //$NON-NLS-1$
+
+	/**
+	 * Class name in upper case
+	 */
+	String FORMAT_CLASS_NAME_UPPER_CASE = "{$CN}"; //$NON-NLS-1$
+
+	/**
+	 * Class name in normal case
+	 */
+	String FORMAT_CLASS_NAME_NORMAL_CASE = "{$cn}"; //$NON-NLS-1$
+
+	/**
+	 * Tag which is replaced by trace text when inserting a trace to source
+	 */
+	String FORMATTED_TRACE = "%FORMATTED_TRACE%"; //$NON-NLS-1$
+
+	/**
+	 * Tag which is replaced by parameters when inserting a trace to source
+	 */
+	String PARAMETERS_FORMAT = "%PARAMETERS%"; //$NON-NLS-1$
+
+	/**
+	 * Insert format for include header
+	 */
+	String INCLUDE_FORMAT = "%INCLUDE%"; //$NON-NLS-1$
+
+	/**
+	 * Tag which is replaced by parameter count when inserting a trace to source
+	 */
+	String PARAM_COUNT_FORMAT = "%PC%"; //$NON-NLS-1$
+
+	/**
+	 * Tag which is replaced by group name when inserting a trace to source
+	 */
+	String GROUP_FORMAT = "%GROUP%"; //$NON-NLS-1$
+
+	/**
+	 * Tag which is replaced by trace name when inserting a trace to source
+	 */
+	String NAME_FORMAT = "%NAME%"; //$NON-NLS-1$
+
+	/**
+	 * Tag which is replaced by state machine name when inserting a trace to
+	 * source
+	 */
+	String STATE_MACHINE_NAME_FORMAT = "%STATE_MACHINE_NAME%"; //$NON-NLS-1$
+
+	/**
+	 * Tag which is replaced by state machine state when inserting a trace to
+	 * source
+	 */
+	String STATE_MACHINE_STATE_FORMAT = "%STATE_MACHINE_STATE%"; //$NON-NLS-1$
+
+	/**
+	 * Tag which is replaced by event name when inserting a trace to source
+	 */
+	String EVENT_NAME_FORMAT = "%EVENT_NAME%"; //$NON-NLS-1$
+
+	/**
+	 * Tag which is replaced by event start trace name when inserting a trace to
+	 * source
+	 */
+	String EVENT_START_TRACE_NAME_FORMAT = "%EVENT_START_TRACE_NAME%"; //$NON-NLS-1$
+
+	/**
+	 * Tag which is replaced by trace text when inserting a trace to source
+	 */
+	String TEXT_FORMAT = "%TEXT%"; //$NON-NLS-1$
+
+	/**
+	 * Tag which is replaced with the data buffer pointer when formatting
+	 * complex traces into the trace header
+	 */
+	String DATA_BUFFER_FORMAT = "%DATA%"; //$NON-NLS-1$
+
+	/**
+	 * Tag which is replaced with the data buffer length when formatting complex
+	 * traces into the trace header
+	 */
+	String DATA_LENGTH_FORMAT = "%LENGTH%"; //$NON-NLS-1$
+
+	/**
+	 * Comment format which needs to be used. Otherwise the comment before /
+	 * after trace configuration will not work
+	 */
+	String COMMENT_FORMAT = " //"; //$NON-NLS-1$
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/TraceHeaderContribution.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,61 @@
+/*
+* 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:
+*
+* Trace header contribution
+*
+*/
+package com.nokia.tracecompiler.plugin;
+
+import com.nokia.tracecompiler.model.TraceModelExtension;
+
+/**
+ * Interface which can be added to model by plug-in's to contribute data to the
+ * trace header
+ * 
+ */
+public interface TraceHeaderContribution extends TraceModelExtension {
+
+	/**
+	 * List of possible contributions to the trace header file
+	 */
+	public enum TraceHeaderContributionType {
+
+		/**
+		 * #define statements to be added to the header
+		 */
+		GLOBAL_DEFINES,
+
+		/**
+		 * #include statements to be added to the header
+		 */
+		GLOBAL_INCLUDES,
+
+		/**
+		 * Content for the main header file
+		 */
+		MAIN_HEADER_CONTENT
+
+	}
+
+	/**
+	 * Gets data to be added to the trace header
+	 * 
+	 * @param type
+	 *            the contribution type
+	 * @return the data to be added, depends on type
+	 */
+	public String[] getContribution(TraceHeaderContributionType type);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/plugin/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+Interfaces for TraceCompiler plug-ins
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/FormattingUtils.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,122 @@
+/*
+* 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:
+*
+* Utilities for trace formatting
+*
+*/
+package com.nokia.tracecompiler.project;
+
+//import java.util.*;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceGroup;
+import com.nokia.tracecompiler.model.TraceModel;
+
+
+/**
+ * Utilities for trace formatting
+ * 
+ */
+public final class FormattingUtils {
+
+	/**
+	 * Separator for prefix
+	 */
+	private static final String PREFIX_SEPARATOR = ": "; //$NON-NLS-1$
+
+	/**
+	 * Gets a group ID based on group name
+	 * 
+	 * @param model
+	 *            the trace model
+	 * @param name
+	 *            the group name
+	 * @return the group ID
+	 * @throws TraceCompilerException
+	 */
+	public static int getGroupID(TraceModel model, String name)
+			throws TraceCompilerException {
+
+		// First check that is group one of the default groups
+		int retval = GroupNames.getIdByName(name);
+		// If group was not one of the default groups then get next group Id from model
+		if (retval == 0) {
+			retval = model.getNextGroupID();
+			if (retval < GroupNames.USER_GROUP_ID_FIRST) {
+				retval = GroupNames.USER_GROUP_ID_FIRST;
+			}
+			else if(retval > GroupNames.USER_GROUP_ID_LAST){
+				String msg = "You have exceeded the number of Group IDs you have allocated."; //$NON-NLS-1$
+				TraceCompilerEngineGlobals.getEvents().postErrorMessage(msg, null, true);
+				throw new TraceCompilerException(
+						TraceCompilerErrorCode.RUN_OUT_OF_GROUP_IDS);		
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets the default component prefix
+	 * 
+	 * @param model
+	 *            the model
+	 * @return the prefix
+	 */
+	public static String getDefaultComponentPrefix(TraceModel model) {
+		return model.getName() + PREFIX_SEPARATOR;
+	}
+
+	/**
+	 * Gets the default component suffix
+	 * 
+	 * @param model
+	 *            the model
+	 * @return the suffix
+	 */
+	public static String getDefaultComponentSuffix(TraceModel model) {
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * Gets the default group prefix
+	 * 
+	 * @param group
+	 *            the group
+	 * @return the prefix
+	 */
+	public static String getDefaultGroupPrefix(TraceGroup group) {
+		String name = group.getName();
+		if (name.startsWith(GroupNames.DEFAULT_GROUP_PREFIX)) {
+			int start = GroupNames.DEFAULT_GROUP_PREFIX.length();
+			// First character retains case, others are converted to lower case
+			name = name.charAt(start) + name.substring(start + 1).toLowerCase();
+		}
+		name += PREFIX_SEPARATOR;
+		return name;
+	}
+
+	/**
+	 * Gets the default group suffix
+	 * 
+	 * @param group
+	 *            the group
+	 * @return the suffix
+	 */
+	public static String getDefaultGroupSuffix(TraceGroup group) {
+		return ""; //$NON-NLS-1$
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/GroupNameIdPair.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2010 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 that include group name and id pair
+ *
+ */
+package com.nokia.tracecompiler.project;
+
+public class GroupNameIdPair {
+
+	// class associates a group name with an integer id
+	String name;
+	int id;
+
+	/**
+	 * Conctructor
+	 * 
+	 * @param name
+	 *            name of the group
+	 * @param id
+	 *            id of the group
+	 */
+	public GroupNameIdPair(String name, int id) {
+		if (name == null) {
+			this.name = ""; //$NON-NLS-1$
+			this.id = -1; // TODO - what is appropriate value here ?
+		} else {
+			this.name = name;
+			this.id = id;
+		}
+	}
+
+	/**
+	 * Get ID
+	 * 
+	 * @return id of the group
+	 */
+	public int Id() {
+		return this.id;
+	}
+
+	/**
+	 * Get name
+	 * 
+	 * @return name of the group
+	 */
+	public String Name() {
+		return this.name;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/GroupNames.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,291 @@
+/*
+ * Copyright (c) 2010 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:
+ *
+ * Default names for trace groups
+ *
+ */
+package com.nokia.tracecompiler.project;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import com.nokia.tracecompiler.TraceCompilerLogger;
+import com.nokia.tracecompiler.TraceCompilerRootException;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+
+/**
+ * Default names for trace groups
+ * 
+ */
+public class GroupNames {
+
+	public static Vector<GroupNameIdPair> DEFAULT_GROUPS;
+
+	/**
+	 * epoc32 directory
+	 */
+	private static final String EPOC32_DIRECTORY = "epoc32"; //$NON-NLS-1$	
+	
+	/**
+	 * Start of user-defined groups
+	 */
+	public static int USER_GROUP_ID_FIRST = -1;
+
+	/**
+	 * end of user-defined groups
+	 */
+	public static int USER_GROUP_ID_LAST = -1;
+
+	/**
+	 * Constant to be used for EPOCROOT
+	 */
+	public static String EPOCROOT = "EPOCROOT"; //$NON-NLS-1$
+
+	/**
+	 * Constant to be used for the location of opensystemtrace_types.h
+	 */
+	public static String OST_TYPES = "epoc32" + File.separator + "include" + File.separator + "platform" + File.separator + "opensystemtrace_types.h"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+
+	/**
+	 * Prefix for all default groups
+	 */
+	public static String DEFAULT_GROUP_PREFIX = "TRACE_"; //$NON-NLS-1$
+
+	/**
+	 * TRACE_BORDER group name
+	 */
+	public static final String TRACE_BORDER = "TRACE_BORDER"; //$NON-NLS-1$
+
+	/**
+	 * TRACE_API group name
+	 */
+	public static final String TRACE_API = "TRACE_API"; //$NON-NLS-1$
+
+	/**
+	 * TRACE_DUMP group name
+	 */
+	public static final String TRACE_DUMP = "TRACE_DUMP"; //$NON-NLS-1$
+
+	/**
+	 * TRACE_DEBUG group name
+	 */
+	public static final String TRACE_DEBUG = "TRACE_DEBUG"; //$NON-NLS-1$
+
+	/**
+	 * TRACE_DETAILED group name
+	 */
+	public static final String TRACE_DETAILED = "TRACE_DETAILED"; //$NON-NLS-1$
+
+	/**
+	 * TRACE_INTERNALS group name
+	 */
+	public static final String TRACE_INTERNALS = "TRACE_INTERNALS"; //$NON-NLS-1$
+
+	/**
+	 * Calculates location of opensystemtrace_types.h Calls getGroupName Returns
+	 * false if there have been any errors
+	 * 
+	 * @throws TraceCompilerRootException
+	 */
+	public static void initialiseGroupName() throws TraceCompilerRootException {
+
+		String e32 = System.getenv(EPOCROOT);
+		TraceCompilerLogger.printInfo(e32);
+		if (e32 == null || (e32.length() == 0)) {
+			String msg = Messages.getString("GroupNames.0"); //$NON-NLS-1$
+			throw new TraceCompilerRootException(msg, null);
+		}
+
+		// need to check that e32 ends in a file separator
+		if (!e32.endsWith(File.separator)) {
+			TraceCompilerLogger.printInfo(Messages.getString("GroupNames.2")); //$NON-NLS-1$
+			e32 += File.separator;
+		}
+
+		// Check that EPOCROOT is valid
+		File epocRoot = new File(e32 + EPOC32_DIRECTORY);
+		if (epocRoot.exists() == false) {
+			throw new TraceCompilerRootException(Messages.getString("GroupNames.invalidEpocRoot"), null); //$NON-NLS-1$
+		}
+		
+		// tests parsing the opensystemtrace_types.h for expected values
+		String ostHeaderFilename = e32 + OST_TYPES;
+
+		// add the predefined names / ids
+		// this was changed from the previous mechanism to break array indexing
+		// dependency
+		// for linking group names to group ids
+		DEFAULT_GROUPS = new Vector<GroupNameIdPair>();
+
+		// The testing ranges are being hardcoded as the values are linked to
+		// e32btrace.h
+		// The TC would have to be redesigned to read in the values from this
+		// file, which would impact performance
+
+		DEFAULT_GROUPS.add(new GroupNameIdPair("TRACE_TESTING1", 254)); //$NON-NLS-1$
+		TraceCompilerLogger.printInfo(Messages.getString("GroupNames.1")); //$NON-NLS-1$
+		DEFAULT_GROUPS.add(new GroupNameIdPair("TRACE_TESTING2", 255)); //$NON-NLS-1$
+		TraceCompilerLogger.printInfo(Messages.getString("GroupNames.3")); //$NON-NLS-1$
+		try {
+			getGroupName(ostHeaderFilename);
+		} catch (Exception e) {
+			throw new TraceCompilerRootException(
+					Messages.getString("GroupNames.failedToProcessOstHeaderText"), e); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Reads opensystemtrace_types.h and extracts the GroupIds
+	 * 
+	 * @throws IOException
+	 *             if fail to read the header file
+	 * @throws TraceCompilerException
+	 */
+
+	private static void getGroupName(String headerFilename) throws Exception {
+		// TODO this method is buggy as it could process group ids even if there
+		// are commented out
+		// should use regular expression or better parser.
+
+		TraceCompilerLogger
+				.printInfo(Messages.getString("GroupNames.8") + headerFilename); //$NON-NLS-1$
+
+		BufferedReader in = new BufferedReader(new FileReader(headerFilename));
+		try {
+			String str;
+			while ((str = in.readLine()) != null) {
+				if (str.length() != 0) {
+					if (((str.indexOf("EUserDefinedRangeFirst")) != -1) && (USER_GROUP_ID_FIRST == -1)) { //$NON-NLS-1$
+						int val = getGroupIdFromString(str);
+						if (val != -1) {
+							// set user group id first
+							USER_GROUP_ID_FIRST = val;
+							TraceCompilerLogger.printInfo(Messages
+									.getString("GroupNames.4") + val); //$NON-NLS-1$
+						}
+					}
+
+					if (((str.indexOf("EUserDefinedRangeLast")) != -1) && (USER_GROUP_ID_LAST == -1)) { //$NON-NLS-1$
+						int val = getGroupIdFromString(str);
+						if (val != -1) {
+							// set user group id last
+							USER_GROUP_ID_LAST = val;
+							TraceCompilerLogger.printInfo(Messages
+									.getString("GroupNames.12") + val); //$NON-NLS-1$
+						}
+					}
+
+					if ((str.indexOf("enum TGroupIdReserved")) != -1) { //$NON-NLS-1$
+						// search for reserved
+						while ((str.indexOf("};") < 1) && (str.indexOf("} ;") < 1)) { //$NON-NLS-1$//$NON-NLS-2$
+
+							str = in.readLine();
+							if (((str.indexOf("=")) != -1) && ((str.indexOf("*")) < 1)) { //$NON-NLS-1$ //$NON-NLS-2$
+								String groupName = str.substring(0, (str
+										.indexOf("="))); //$NON-NLS-1$
+								groupName = groupName.trim();
+								String substr = str
+										.substring(
+												(str.indexOf("=")) + 1, (str.indexOf(','))); //$NON-NLS-1$
+								int groupId = -1;
+								String trim = substr.trim();
+								try {
+									groupId = Integer.parseInt(trim);
+								} catch (NumberFormatException e) {
+									// not an Int so could be a renaming
+									groupId = getIdByName(trim);
+									if (groupId == 0) {
+										TraceCompilerEngineGlobals
+												.getEvents()
+												.postErrorMessage(
+														Messages.getString("GroupNames.canNotresolveGroupIdPrefix") + trim, null, true); //$NON-NLS-1$
+										// not resolved to an existing name
+										throw new TraceCompilerException(null,
+												true);
+									}
+								}
+								DEFAULT_GROUPS.add(new GroupNameIdPair(
+										groupName, groupId));
+								TraceCompilerLogger.printInfo(groupName
+										+ " = " + groupId); //$NON-NLS-1$
+							}
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			TraceCompilerEngineGlobals.getEvents().postErrorMessage(
+					e.getMessage(), null, true);
+			throw e;
+		} finally {
+			in.close();
+		}
+	}
+
+	/**
+	 * Reads opensystemtrace_types.h and extracts the GroupIds value from a
+	 * string containing GroupId name and value. 
+	 * Returns GroupId value, returns -1 if not found or resolved in case of group renaming
+	 */
+
+	private static int getGroupIdFromString(String str) {
+		int groupId = -1;
+		if ((str.indexOf("=")) != -1) { //$NON-NLS-1$
+			String substr = str.substring(
+					(str.indexOf("=")) + 1, (str.indexOf(','))); //$NON-NLS-1$
+
+			try {
+				// try to read the id from the header file
+				groupId = Integer.parseInt(substr.trim());
+			} catch (NumberFormatException e) {
+				// it's probably a rename, so get the id for the old name if
+				// there is one
+				groupId = getIdByName(substr.trim());
+				if (groupId == 0) {
+					// return -1 because we could not resolve it
+					groupId = -1;
+				}
+			}
+		}
+		return groupId;
+	}
+
+	/**
+	 * Searches all known GroupIds for name and then returns value. 
+	 * Returns GroupId value, 0 if not found in DEFAULT_GROUPS
+	 */
+
+	public static int getIdByName(String name) {
+		TraceCompilerLogger
+				.printInfo(Messages.getString("GroupNames.23") + name); //$NON-NLS-1$
+		for (Enumeration<GroupNameIdPair> e = GroupNames.DEFAULT_GROUPS
+				.elements(); e.hasMoreElements();) {
+			GroupNameIdPair gnidp = e.nextElement();
+			if (name.equals(gnidp.Name())) {
+				TraceCompilerLogger.printInfo(Messages
+						.getString("GroupNames.24") + gnidp.Id()); //$NON-NLS-1$
+				return gnidp.Id();
+			}
+		}
+		// the caller should decide what to do with value 0
+		return 0;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/Messages.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* 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:
+*
+* Localized strings for project package
+*
+*/
+package com.nokia.tracecompiler.project;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Localized strings for project package
+ * 
+ */
+class Messages {
+
+	/**
+	 * Bundle name
+	 */
+	private static final String BUNDLE_NAME = "com.nokia.tracecompiler.project.messages"; //$NON-NLS-1$
+
+	/**
+	 * Bundle
+	 */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Prevents construction
+	 */
+	private Messages() {
+	}
+
+	/**
+	 * Gets localized string based on key
+	 * 
+	 * @param key
+	 *            the resource key
+	 * @return the localized resource
+	 */
+	public static String getString(String key) {
+		String value;
+		try {
+			value = RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			value = '!' + key + '!';
+		}
+		return value;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/ProjectFileParser.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,85 @@
+/*
+* 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:
+*
+* Base class for project file parsers
+*
+*/
+package com.nokia.tracecompiler.project;
+
+import java.io.File;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.FileErrorParameters;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+
+/**
+ * Base class for project file parsers
+ * 
+ */
+public abstract class ProjectFileParser {
+
+	/**
+	 * Trace model
+	 */
+	protected TraceModel model;
+
+	/**
+	 * Project file to be parsed
+	 */
+	protected File projectFile;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param model
+	 *            the trace model
+	 * @param fileName
+	 *            the project file name
+	 * @throws TraceCompilerException
+	 *             if file does not exist
+	 */
+	protected ProjectFileParser(TraceModel model, String fileName)
+			throws TraceCompilerException {
+		File file = new File(fileName);
+		if (file.exists()) {
+			this.model = model;
+			this.projectFile = file;
+			createParser();
+		} else {
+			FileErrorParameters params = new FileErrorParameters();
+			params.file = fileName;
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.FILE_NOT_FOUND, params);
+		}
+	}
+
+	/**
+	 * Creates the file parser
+	 * 
+	 * @throws TraceCompilerException
+	 *             if creation fails
+	 */
+	protected abstract void createParser() throws TraceCompilerException;
+
+	/**
+	 * Parses the project file
+	 * 
+	 * @throws TraceCompilerException
+	 *             if parser fails
+	 */
+	public abstract void parse() throws TraceCompilerException;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/ProjectUtils.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,271 @@
+/*
+* Copyright (c) 2010 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 file utilities
+*
+*/
+package com.nokia.tracecompiler.project;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.project.ProjectEngine;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.source.SymbianConstants;
+
+/**
+ * Project file utilities
+ *
+ */
+public final class ProjectUtils {
+
+
+	/**
+	 * Tries to locate existing file with given extension and if not found,
+	 * proposes a new location for that file. The new location will be
+	 * <i>createPath</i> or if that is null, the directory where the trace
+	 * project file (.tbprj) resides. Trace project must be open before this can
+	 * be called
+	 *
+	 * @param model
+	 *            the trace model
+	 * @param createPath
+	 *            the path to create if existing file is not found
+	 * @param fileName
+	 *            the name for the new file
+	 * @param appendProjectName
+	 *            true if the name is appended to end of model name
+	 * @return the project file path for the new file
+	 * @throws TraceCompilerException
+	 *             if the model does not have any project files
+	 */
+	public static String getLocationForFile(TraceModel model,
+			String createPath, String fileName, boolean appendProjectName)
+			throws TraceCompilerException {
+		TraceProjectFile projectFile = model
+				.getExtension(TraceProjectFile.class);
+		if (projectFile == null) {
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.MODEL_NOT_READY);
+		}
+		String projectName = ""; //$NON-NLS-1$
+		if (appendProjectName) {
+			projectName = projectFile.getProjectName();
+		}
+		return getLocationForFile(projectFile.getPath(), projectName,
+				createPath, fileName);
+	}
+
+	/**
+	 * Tries to locate existing file with given extension and if not found,
+	 * proposes a new location for that file. The new location will be
+	 * <i>createPath</i> or if that is null, the directory where the trace
+	 * project file resides. Trace project must be open before this can
+	 * be called
+	 *
+	 * @param projectPath
+	 *            path to the project
+	 * @param projectName
+	 *            name of the project
+	 * @param createPath
+	 *            the path to create if existing file is not found
+	 * @param extension
+	 *            the file extension for the new file
+	 * @return the project file path for the new file
+	 */
+	public static String getLocationForFile(String projectPath,
+			String projectName, String createPath, String extension) {
+		ArrayList<String> searchPaths = new ArrayList<String>();
+		if (createPath != null && createPath.length() > 0) {
+			// If create path is explicitly specified, it is added to the search
+			// path list
+			searchPaths.add(createPath);
+		}
+		// Default directories are always included into search
+		searchPaths.add(ProjectEngine.traceFolderName);
+		searchPaths.add(SymbianConstants.GROUP_DIRECTORY);
+		searchPaths.add(SymbianConstants.INCLUDE_DIRECTORY);
+		String[] pathArr = new String[searchPaths.size()];
+		searchPaths.toArray(pathArr);
+		return getLocationForFile(projectPath, projectName, pathArr,
+				createPath, extension);
+	}
+
+	/**
+	 * Tries to locate existing file and if not found, proposes a new location
+	 * for that file. The search starts from <i>projectPath</i>. If
+	 * <i>checkParents</i> is true, the parent directories are also checked if
+	 * the file is not found
+	 *
+	 * @param projectPath
+	 *            path where to start the search
+	 * @param projectName
+	 *            the name of the project
+	 * @param searchPaths
+	 *            the sub-paths to be searched
+	 * @param createPath
+	 *            the sub-path to create if file is not found
+	 * @param fileName
+	 *            extension of the file to be located
+	 * @return the project file path for the new file
+	 */
+	private static String getLocationForFile(String projectPath,
+			String projectName, String[] searchPaths, String createPath,
+			String fileName) {
+		// If the project file is in one of the search paths, the path is
+		// changed to its parent
+		File projectPathFile = new File(projectPath);
+		String projectPathName = projectPathFile.getName();
+		for (int i = 0; i < searchPaths.length; i++) {
+			if (searchPaths[i].equals(projectPathName)) {
+				projectPath = projectPathFile.getParent();
+				i = searchPaths.length;
+			}
+		}
+		// Tries to find an existing file based on project path and project name
+		String filePath = findProjectFile(projectPath, projectName,
+				searchPaths, fileName, false);
+		if (filePath == null) {
+			// If file is not found, this returns a new path
+			filePath = projectPath + File.separator + createPath
+					+ File.separator + projectName + fileName;
+		}
+		return filePath;
+	}
+
+	/**
+	 * Finds a project file or directory based on a file or directory
+	 *
+	 * @param startPath
+	 *            the file name or path where to start search
+	 * @param projectName
+	 *            the name of the project file
+	 * @param searchDirectories
+	 *            the directories to search
+	 * @param fileExtension
+	 *            the file extension to be located or null if locating one of
+	 *            the search directories
+	 * @param checkParents
+	 *            true if parent directories should be checked
+	 * @return the file or directory path if found or null if not
+	 */
+	private static String findProjectFile(String startPath, String projectName,
+			String[] searchDirectories, String fileExtension,
+			boolean checkParents) {
+		String foundFile = null;
+		if (startPath != null) {
+			File file = new File(startPath);
+			if (!file.isDirectory()) {
+				file = file.getParentFile();
+			}
+			if (file != null) {
+				do {
+					for (int i = 0; i < searchDirectories.length
+							&& foundFile == null; i++) {
+						foundFile = findProjectFile(searchDirectories[i],
+								projectName, fileExtension, file);
+					}
+					file = file.getParentFile();
+				} while (file != null && foundFile == null && checkParents);
+			}
+		}
+		return foundFile;
+	}
+
+	/**
+	 * Searches a single directory for a project file
+	 *
+	 * @param searchDirectory
+	 *            the directory to search
+	 * @param fileExtension
+	 *            the file extension to be located or null if locating one of
+	 *            the search directories
+	 * @param projectName
+	 *            the name of the project file
+	 * @param file
+	 *            the current file
+	 * @return the file or directory path if found or null if not
+	 */
+	private static String findProjectFile(String searchDirectory,
+			String projectName, String fileExtension, File file) {
+		String foundFile = null;
+		File projectPath = new File(file.getAbsolutePath() + File.separator
+				+ searchDirectory + File.separator);
+		if (projectPath.exists()) {
+			if (fileExtension == null) {
+				foundFile = projectPath.getAbsolutePath();
+			} else {
+				foundFile = findProjectFileFromDirectory(projectPath,
+					projectName, fileExtension);
+			}
+		}
+		return foundFile;
+	}
+
+	/**
+	 * Gets the first file with given extension from given directory
+	 *
+	 * @param path
+	 *            the path to search
+	 * @param projectName
+	 *            the name of the project file
+	 * @param fileExtension
+	 *            the file extension
+	 * @return the file name if found or null if not
+	 */
+	private static String findProjectFileFromDirectory(File path,
+			String projectName, String fileExtension) {
+		String proposal = null;
+		File[] files = path.listFiles();
+		if (projectName != null) {
+			// If project name is specified, only the file that matches the name
+			// is returned
+			String nameFromProjectFile = projectName + fileExtension;
+
+			// Check does user have access rights to the traces folder
+			if (path.canWrite() == false) {
+				TraceCompilerEngineGlobals
+						.getEvents()
+						.postErrorMessage(
+								Messages
+										.getString("ProjectUtils.accesRightErrorText"), null, true); //$NON-NLS-1$
+				System.exit(1);
+			}
+			
+			for (int i = 0; i < files.length && proposal == null; i++) {
+				String fname = files[i].getName();
+				if (fname.equals(nameFromProjectFile)) {
+					proposal = files[i].getAbsolutePath();
+				}
+			}
+		} else {
+			// If project name is not specified, this proposes the first file
+			// which ends with the file extension
+			for (int i = 0; i < files.length && proposal == null; i++) {
+				String fname = files[i].getName();
+				if (fname.length() > fileExtension.length()) {
+					int extstart = fname.length() - fileExtension.length();
+					if (fname.substring(extstart).equals(fileExtension)) {
+						proposal = files[i].getAbsolutePath();
+					}
+				}
+			}
+		}
+		return proposal;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/PropertyNames.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* List of supported property names
+*
+*/
+package com.nokia.tracecompiler.project;
+
+/**
+ * List of supported property names
+ * 
+ */
+public interface PropertyNames {
+
+	/**
+	 * Group / component prefix
+	 */
+	public String PREFIX = "prefix"; //$NON-NLS-1$
+
+	/**
+	 * Group / component suffix
+	 */
+	public String SUFFIX = "suffix"; //$NON-NLS-1$
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/TraceLocationParser.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* 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:
+*
+* Interface to location parser
+*
+*/
+package com.nokia.tracecompiler.project;
+
+import com.nokia.tracecompiler.engine.TraceLocation;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.source.SourceParserRule.TraceConversionResult;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.source.SourceExcludedArea;
+
+/**
+ * Interface to location parser. The parser is implemented into the project API
+ * 
+ */
+public interface TraceLocationParser {
+
+	/**
+	 * Processes a newly parsed location. The location has not yet been
+	 * associated with a trace.
+	 * 
+	 * @param location
+	 *            the new location
+	 */
+	public void processNewLocation(TraceLocation location);
+
+	/**
+	 * Gets the group where locations created by this parser belong
+	 * 
+	 * @return the location group
+	 */
+	public String getLocationGroup();
+
+	/**
+	 * Converts a location to trace
+	 * 
+	 * @param location
+	 *            the location to be parsed
+	 * @return properties for new trace
+	 * @throws TraceCompilerException
+	 *             if the location cannot be converted
+	 */
+	public TraceConversionResult convertLocation(TraceLocation location)
+			throws TraceCompilerException;
+
+	/**
+	 * Finds the comment related to given location
+	 * 
+	 * @param location
+	 *            the location to be checked
+	 * @return the comment related to the location or null if not found
+	 */
+	public SourceExcludedArea findLocationComment(TraceLocation location);
+
+	/**
+	 * Determines if a location parsed from source should be automatically
+	 * converted to a trace. This is called only if
+	 * isLocationAutoConvertSupported has returned true
+	 * 
+	 * @param location
+	 *            the location to be checked
+	 * 
+	 * @return true if automatically converted, false if not
+	 */
+	public boolean isLocationConverted(TraceLocation location);
+
+	/**
+	 * Checks if a location matches its trace
+	 * 
+	 * @param location
+	 *            the location to be checked
+	 * @return error code from TraceCompilerErrorCodes
+	 */
+	public TraceCompilerErrorCode checkLocationValidity(TraceLocation location);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/TraceProjectAPI.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,60 @@
+/*
+* 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:
+*
+* Interface to the properties of the trace API used by the currently open trace project
+*
+*/
+package com.nokia.tracecompiler.project;
+
+import com.nokia.tracecompiler.model.Trace;
+import com.nokia.tracecompiler.model.TraceModelExtension;
+
+/**
+ * Interface to the properties of the trace API used by the currently open trace
+ * project
+ * 
+ */
+public interface TraceProjectAPI extends TraceModelExtension {
+
+	/**
+	 * Formatting flags for formatTraceForExport
+	 */
+	public class TraceFormatFlags {
+
+		/**
+		 * Formatting characters supported flag
+		 */
+		public boolean isFormattingSupported;
+	}
+
+	/**
+	 * Gets the name of this API
+	 * 
+	 * @return the name
+	 */
+	public String getName();
+
+	/**
+	 * Formats a trace for into a string suitable for export
+	 * 
+	 * @param trace
+	 *            the trace to be formatted
+	 * @param flags
+	 *            the formatting flags
+	 * @return the formatted text
+	 */
+	public String formatTraceForExport(Trace trace, TraceFormatFlags flags);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/TraceProjectAPIList.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,38 @@
+/*
+* 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:
+*
+* Interface to the list of trace project API's registered to TraceCompiler
+*
+*/
+package com.nokia.tracecompiler.project;
+
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.model.TraceModelExtension;
+
+/**
+ * Interface to the list of trace project API's registered to TraceCompiler
+ * 
+ */
+public interface TraceProjectAPIList extends TraceModelExtension {
+
+	/**
+	 * Gets the list of API's
+	 * 
+	 * @return the list
+	 */
+	public Iterator<TraceProjectAPI> getAPIs();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/TraceProjectFile.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,291 @@
+/*
+* 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:
+*
+* Generic trace project file properties
+*
+*/
+package com.nokia.tracecompiler.project;
+
+import java.io.File;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.file.FileUtils;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.model.TraceModelExtension;
+import com.nokia.tracecompiler.model.TraceModelListener;
+import com.nokia.tracecompiler.model.TraceObject;
+import com.nokia.tracecompiler.source.SourceConstants;
+
+/**
+ * Generic trace project file properties
+ * 
+ */
+public abstract class TraceProjectFile implements TraceModelExtension,
+		TraceModelListener {
+
+	/**
+	 * The trace model
+	 */
+	private TraceModel owner;
+
+	/**
+	 * Name of the project file
+	 */
+	private String name;
+
+	/**
+	 * Project file path
+	 */
+	private String path;
+
+	/**
+	 * Project file name is based on model name and updated when model changes
+	 */
+	protected boolean hasModelName;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param path
+	 *            the path to the file
+	 * @param name
+	 *            the name of the project or empty if this file does not use the
+	 *            project name
+	 */
+	protected TraceProjectFile(String path, String name) {
+		this.path = path;
+		this.name = name;
+		if (name == null || name.length() == 0) {
+			this.hasModelName = false;
+		} else {
+			this.hasModelName = true;
+		}
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param absolutePath
+	 *            the absolute path to the file
+	 * @param hasModelName
+	 *            flag, which tells to update the project file name if model
+	 *            name changes
+	 */
+	protected TraceProjectFile(String absolutePath, boolean hasModelName) {
+		this.hasModelName = hasModelName;
+		updatePath(absolutePath);
+	}
+
+	/**
+	 * Gets the file extension of this project file
+	 * 
+	 * @return the extension
+	 */
+	protected abstract String getFileExtension();
+
+	/**
+	 * Gets the title to be shown in UI
+	 * 
+	 * @return the title
+	 */
+	public abstract String getTitle();
+
+	/**
+	 * Gets the name of the project
+	 * 
+	 * @return the project name
+	 */
+	public final String getProjectName() {
+		return name;
+	}
+
+	/**
+	 * Gets the path of this project file
+	 * 
+	 * @return the project file path
+	 */
+	public final String getPath() {
+		return path;
+	}
+
+	/**
+	 * Gets the name of this project file
+	 * 
+	 * @return the file name
+	 */
+	public final String getFileName() {
+		StringBuffer sb = new StringBuffer();
+		addFileName(sb, false);
+		return sb.toString();
+	}
+
+	/**
+	 * Checks if this file is valid
+	 * 
+	 * @return true if valid, false if not
+	 */
+	public boolean isValid() {
+		return path != null && name != null;
+	}
+
+	/**
+	 * Posts a project file written event
+	 * 
+	 * @param path
+	 *            the path where file was written
+	 */
+	public void postFileWrittenEvent(String path) {
+		String msg = Messages
+				.getString("TraceProjectFile.ProjectFileWrittenMiddle"); //$NON-NLS-1$
+		TraceCompilerEngineGlobals.getEvents().postInfoMessage(
+				getTitle() + msg + path, null);
+	}
+
+	/**
+	 * Updates the project file name and path
+	 * 
+	 * @param absolutePath
+	 *            the new path including the file name
+	 */
+	public void updatePath(String absolutePath) {
+		File file = new File(absolutePath);
+		path = file.getParent();
+		name = file.getName();
+		String ext = getFileExtension();
+		if (name.endsWith(ext)) {
+			name = name.substring(0, name.length() - ext.length());
+		}
+	}
+
+	/**
+	 * Gets the path including file name
+	 * 
+	 * @return the path
+	 */
+	public final String getAbsolutePath() {
+		String retval;
+		if (isValid()) {
+			StringBuffer sb = new StringBuffer();
+			sb.append(FileUtils.convertSeparators(
+					SourceConstants.FORWARD_SLASH_CHAR, path, true));
+			addFileName(sb, false);
+			retval = sb.toString();
+		} else {
+			retval = null;
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets the absolute path to this file, including the model ID in file name
+	 * 
+	 * @return the path
+	 */
+	public final String getAbsolutePathWithID() {
+		String retval;
+		if (isValid()) {
+			StringBuffer sb = new StringBuffer();
+			sb.append(FileUtils.convertSeparators(
+					SourceConstants.FORWARD_SLASH_CHAR, path, true));
+			addFileName(sb, true);
+			retval = sb.toString();
+		} else {
+			retval = null;
+		}
+		return retval;
+	}
+
+	/**
+	 * Adds the file name to the given buffer
+	 * 
+	 * @param sb
+	 *            the buffer
+	 * @param addID
+	 *            true if ID needs to be added to name
+	 */
+	private void addFileName(StringBuffer sb, boolean addID) {
+		sb.append(name);
+		if (addID) {
+			sb.append("_0x"); //$NON-NLS-1$
+			sb.append(Integer.toHexString(getOwner().getModel().getID()));
+			sb.append("_"); //$NON-NLS-1$
+		}
+		sb.append(getFileExtension());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtension#getOwner()
+	 */
+	public TraceObject getOwner() {
+		return owner;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelExtension#
+	 *      setOwner(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void setOwner(TraceObject owner) {
+		if (this.owner != null) {
+			this.owner.removeModelListener(this);
+		}
+		if (owner instanceof TraceModel) {
+			this.owner = (TraceModel) owner;
+			this.owner.addModelListener(this);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      objectAdded(com.nokia.tracecompiler.model.TraceObject,
+	 *      com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectAdded(TraceObject owner, TraceObject object) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      objectCreationComplete(com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectCreationComplete(TraceObject object) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      objectRemoved(com.nokia.tracecompiler.model.TraceObject,
+	 *      com.nokia.tracecompiler.model.TraceObject)
+	 */
+	public void objectRemoved(TraceObject owner, TraceObject object) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.model.TraceModelListener#
+	 *      propertyUpdated(com.nokia.tracecompiler.model.TraceObject, int)
+	 */
+	public void propertyUpdated(TraceObject object, int property) {
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/messages.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,23 @@
+GroupNames.0=Need to set EPOCROOT env variable
+GroupNames.1=TRACE_TESTING1 = 254
+GroupNames.12=USER_GROUP_ID_LAST = 
+GroupNames.2=Appending file separator to EPOCROOT
+GroupNames.23=GetIdByName called name = 
+GroupNames.24=GetIdByName returning 
+GroupNames.25=getIdByName NOT FOUND returning 0
+GroupNames.26=GetNameById called id = 
+GroupNames.27=GetNameById returning 
+GroupNames.28=getNameById NOT FOUND  returning empty string 
+GroupNames.29=
+GroupNames.3=TRACE_TESTING2 = 255
+GroupNames.30=TC:
+GroupNames.4=USER_GROUP_ID_FIRST = 
+GroupNames.8=getGroupName() header name
+GroupNames.canNotresolveGroupIdPrefix=Can not resolve Group Id for 
+GroupNames.failedToProcessOstHeaderText=failed to process ost header.
+GroupNames.invalidEpocRoot=Invalid EPOCROOT
+ProjectUtils.accesRightErrorText=Trace compiler does not have access rights to the traces folder
+TraceProjectFile.ProjectFileRenamedPrefix=\ renamed from 
+TraceProjectFile.ProjectFileRenamedMiddle=\ to 
+TraceProjectFile.NotValid=Not Valid
+TraceProjectFile.ProjectFileWrittenMiddle=\ written to 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+Interface to the trace project management
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/rules/ArrayParameterRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Rule interface for parameters that represent array types
+*
+*/
+package com.nokia.tracecompiler.rules;
+
+import com.nokia.tracecompiler.model.TraceObjectRule;
+
+/**
+ * Rule interface for parameters that represent array types
+ * 
+ */
+public interface ArrayParameterRule extends TraceObjectRule {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/rules/FillerParameterRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Rule that defines a filler parameter
+*
+*/
+package com.nokia.tracecompiler.rules;
+
+/**
+ * Rule that defines a filler parameter. A filler does not have a source or view
+ * representation, but does have a representation in the header and decoder
+ * files. It aligns trace parameters to 32-bit boundaries.
+ * 
+ */
+public interface FillerParameterRule extends HiddenTraceObjectRule {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/rules/HiddenTraceObjectRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Rule that allows an object to be marked as hidden
+*
+*/
+package com.nokia.tracecompiler.rules;
+
+import com.nokia.tracecompiler.model.TraceObjectRule;
+
+/**
+ * Rule that allows an object to be marked as hidden in the view
+ * 
+ */
+public interface HiddenTraceObjectRule extends TraceObjectRule {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/rules/ReadOnlyObjectRule.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,30 @@
+/*
+* 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:
+*
+* Rule which marks an object "read-only"
+*
+*/
+package com.nokia.tracecompiler.rules;
+
+import com.nokia.tracecompiler.model.TraceObjectRule;
+
+/**
+ * Rule which marks an object "read-only". Read-only objects cannot be updated
+ * via UI
+ * 
+ */
+public interface ReadOnlyObjectRule extends TraceObjectRule {
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/rules/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+Rules for trace objects
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/ContextAreaParser.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,521 @@
+/*
+* 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:
+*
+* Parser for source contexts
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Parser for source contexts
+ * 
+ */
+class ContextAreaParser {
+
+	/**
+	 * Source parser
+	 */
+	private SourceParser parser;
+
+	/**
+	 * List of source file contexts
+	 */
+	protected ArrayList<SourceContext> contextAreas = new ArrayList<SourceContext>();
+
+	/**
+	 * Comparator for array sorting and searching
+	 */
+	private PositionArrayComparator arrayComparator = new PositionArrayComparator();
+
+	/**
+	 * "usingnamespace" text
+	 */
+	private static final String USINGNAMESPACE = "usingnamespace"; //$NON-NLS-1$
+
+	/**
+	 * Start index of "using" substring in "usingnamespace" string
+	 */
+	private static final int START_INDEX_OF_USING_SUBSTRING = 0; // CodForChk_Dis_Magic
+
+	/**
+	 * End index of "using" substring in "usingnamespace" string
+	 */
+	private static final int END_INDEX_OF_USING_SUBSTRING = 5; // CodForChk_Dis_Magic
+
+	/**
+	 * Start index of "namespace" substring in "usingnamespace" string
+	 */
+	private static final int START_INDEX_OF_NAMESPACE_SUBSTRING = 5; // CodForChk_Dis_Magic
+
+	/**
+	 * End index of "namespace" substring in "usingnamespace" string
+	 */
+	private static final int END_INDEX_OF_NAMESPACE_SUBSTRING = 14; // CodForChk_Dis_Magic
+
+	/**
+	 * Constructor
+	 * 
+	 * @param parser
+	 *            the source parser
+	 */
+	ContextAreaParser(SourceParser parser) {
+		this.parser = parser;
+	}
+
+	/**
+	 * Resets the context areas
+	 */
+	void reset() {
+		contextAreas.clear();
+	}
+
+	/**
+	 * Returns the context at given offset
+	 * 
+	 * @param offset
+	 *            the offset to the source data
+	 * @return the context at the offset or null if no context exists
+	 * @throws SourceParserException
+	 *             if parser fails
+	 */
+	SourceContext parseAndGet(int offset) throws SourceParserException {
+		if (contextAreas.isEmpty()) {
+			parseAll();
+		}
+		int index = find(offset);
+		SourceContext context = null;
+		if (index >= 0) {
+			context = contextAreas.get(index);
+		}
+		return context;
+	}
+
+	/**
+	 * Gets the context areas. If the areas have not been parsed, this parses
+	 * them
+	 * 
+	 * @return the areas
+	 * @throws SourceParserException
+	 *             if parser fails
+	 */
+	Iterator<SourceContext> parseAndGetAll() throws SourceParserException {
+		if (contextAreas.isEmpty()) {
+			parseAll();
+		}
+		return contextAreas.iterator();
+	}
+
+	/**
+	 * Gets the context area list. This does not parse the areas
+	 * 
+	 * @return the list of context areas
+	 */
+	List<SourceContext> getContextList() {
+		return contextAreas;
+	}
+
+	/**
+	 * Finds the array index of the context area which contains the offset. If
+	 * none of the areas contain the offset, returns negative integer indicating
+	 * the index of the context area following the offset
+	 * 
+	 * @param offset
+	 *            the offset to the data
+	 * @return the context area index
+	 */
+	int find(int offset) {
+		return Collections.binarySearch(contextAreas, new SourceLocationBase(
+				parser, offset), arrayComparator);
+	}
+
+	/**
+	 * Builds the context array
+	 * 
+	 * @throws SourceParserException
+	 *             if parser fails
+	 */
+	void parseAll() throws SourceParserException { // CodForChk_Dis_ComplexFunc
+		contextAreas.clear();
+		char value;
+		
+		int inBrackets = 0;
+		int inContext = 0;
+		int inNamespace = 0;
+
+		int usingIndex = START_INDEX_OF_USING_SUBSTRING;
+		int usingKeywordEnd = 0;
+		int namespaceIndex = START_INDEX_OF_NAMESPACE_SUBSTRING;
+		int nameSpaceKeywordEnd = 0;
+		int previousIndexBeforeNamespace = 0;
+		boolean checkNextCharacter = false;
+
+		SourceContext context = null;
+		SourceIterator itr = parser.createIterator(0, SourceParser.SKIP_ALL);
+
+		while (itr.hasNext()) {
+			value = itr.next();
+
+			// Next character check is need only if we have found "namespace"
+			// text
+			if (checkNextCharacter) {
+
+				// Next character after "namespace" text should be space.
+				// Because we have skipped spaces, current index should be
+				// bigger than nameSpaceKeywordEnd + 1. If it is not space then
+				// we are not inside namespace
+				if (itr.currentIndex() - nameSpaceKeywordEnd < 2) { // CodForChk_Dis_Magic
+					inNamespace--;
+				}
+				checkNextCharacter = false;
+			}
+
+			// Check is character part of "using" text
+			if (value == USINGNAMESPACE.charAt(usingIndex)) {
+				usingIndex++;
+			} else {
+
+				// Character not part of "using" text -> reset usingIndex
+				usingIndex = START_INDEX_OF_USING_SUBSTRING;
+			}
+
+			// Check that did we found "using" text
+			if (usingIndex == END_INDEX_OF_USING_SUBSTRING) {
+				usingKeywordEnd = itr.currentIndex();
+				usingIndex = START_INDEX_OF_USING_SUBSTRING;
+			}
+
+			// Check is character part of "namespace" text
+			if (value == USINGNAMESPACE.charAt(namespaceIndex)) {
+				if (previousIndexBeforeNamespace == 0) {
+					previousIndexBeforeNamespace = itr.previousIndex();
+				}
+				namespaceIndex++;
+			} else {
+
+				// Character not part of "namespace" text -> reset
+				// previousIndexBeforeNamespace and namespaceIndex
+				previousIndexBeforeNamespace = 0;
+				namespaceIndex = START_INDEX_OF_NAMESPACE_SUBSTRING;
+			}
+
+			// Check that did we found "namespace" text
+			if (namespaceIndex == END_INDEX_OF_NAMESPACE_SUBSTRING) {
+				nameSpaceKeywordEnd = itr.currentIndex();
+
+				// If there was "using" text just before "namespace" text, then
+				// namespace is defined like: "using namespace foo;" and we are
+				// not going inside namespace brackets
+				if (usingKeywordEnd != previousIndexBeforeNamespace) {
+					inNamespace++;
+					checkNextCharacter = true;
+				}
+				namespaceIndex = START_INDEX_OF_NAMESPACE_SUBSTRING;
+			}
+
+			if (value == '{') {
+				inBrackets++;
+
+				// Check that are we inside namespace or context
+				if (inBrackets > inNamespace) {
+					inContext++;
+					if (inContext == 1) {
+						int start = itr.currentIndex() + 1;
+						context = new SourceContext(parser, start);
+
+						// Includes the '{' character into the context
+						if (!createContext(context, start - 2)) { // CodForChk_Dis_Magic
+							context = null;
+						}
+					}
+				}
+			} else if (value == '}') {
+				// Check that are we exiting from context or namespace
+				if (inBrackets == inNamespace) {
+					inNamespace--;
+				} else {
+					inContext--;
+					if (inContext == 0 && context != null) {
+						context.setLength(itr.currentIndex() + 1
+								- context.getOffset());
+						contextAreas.add(context);
+					}
+				}
+
+				inBrackets--;
+			}
+		}
+	}
+
+	/**
+	 * Sets the data to the source context
+	 * 
+	 * @param context
+	 *            the source context to be updated
+	 * @param offset
+	 *            the index preceeding the '{' character
+	 * @return true if valid, false otherwise
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private boolean createContext(SourceContext context, int offset)
+			throws SourceParserException {
+		ContextSearchData data = new ContextSearchData();
+		data.itr = parser.createIterator(offset, SourceParser.BACKWARD_SEARCH
+				| SourceParser.SKIP_ALL);
+		data.context = context;
+		while (data.itr.hasNext() && !data.finished) {
+			char c = data.itr.next();
+			// Function start or stop character or statement separator breaks
+			// the search in normal case. In case of nested class separator
+			// character breaks the search.
+			if (c == ';' || c == '}' || c == '{'
+					|| (c == ':' && data.itr.peek() == ':')
+					&& data.classStartIndex != -1) {
+				processContextTerminator(context, data, false);
+			} else if (!data.parametersFound) {
+				processParametersNotFoundCharacter(data, c);
+			} else if (c == ')' || c == '(' || c == ','
+					|| (c == ':' && data.itr.peek() != ':')) {
+				// Constructor member initializer list may contain brackets, ','
+				// and ':'. When one of the characters from member initializer
+				// list is encountered, this assumes that the previous
+				// one was not the actual function parameter list yet. All
+				// variables are reset in that case
+				data.parametersFound = false;
+				data.functionEndIndex = -1;
+				data.functionStartIndex = -1;
+				data.classEndIndex = -1;
+				processParametersNotFoundCharacter(data, c);
+			} else if (data.functionEndIndex == -1) {
+				processFunctionNameNotFoundCharacter(data, c);
+			} else if (data.functionStartIndex == -1) {
+				processFunctionNameCharacter(context, data, c);
+			} else if (data.classEndIndex == -1) {
+				processClassNameNotFoundCharacter(data);
+			} else if (data.classStartIndex == -1) {
+				processClassNameCharacter(context, data, c);
+			} else {
+				processReturnTypeCharacter(context, data);
+			}
+		}
+		if (!data.finished) {
+			processContextTerminator(context, data, true);
+		}
+		return data.valid;
+	}
+
+	/**
+	 * Processes a character after class and function names have been found
+	 * 
+	 * @param context
+	 *            the context
+	 * @param data
+	 *            the search data
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private void processReturnTypeCharacter(SourceContext context,
+			ContextSearchData data) throws SourceParserException {
+		if (data.itr.hasSkipped()) {
+			// Collects all return type candidates to the context
+			addReturnType(context, data.itr.previousIndex(),
+					data.returnEndIndex);
+			data.returnEndIndex = data.itr.currentIndex();
+		}
+	}
+
+	/**
+	 * Processes a character after function name has been found, but class name
+	 * has not yet been found
+	 * 
+	 * @param data
+	 *            the search flags
+	 */
+	private void processClassNameNotFoundCharacter(ContextSearchData data) {
+		// After start of function and the separator has been found, the
+		// next character marks the end of class name
+		data.classEndIndex = data.itr.currentIndex() + 1;
+	}
+
+	/**
+	 * Parses a character which belongs to the class name
+	 * 
+	 * @param context
+	 *            the source context to be parsed
+	 * @param data
+	 *            the context search parameters
+	 * @param c
+	 *            the character
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private void processClassNameCharacter(SourceContext context,
+			ContextSearchData data, char c) throws SourceParserException {
+		if (data.itr.hasSkipped() || (c == ':' && data.itr.peek() == ':')) {
+			// Start of class name is found when iterator skips over
+			// white space or comment characters or in case of nested class
+			// separator character has been found
+			context.setFunctionName(parser.getSource().get(
+					data.functionStartIndex,
+					data.functionEndIndex - data.functionStartIndex));
+			data.classStartIndex = data.itr.previousIndex();
+			data.returnEndIndex = data.itr.currentIndex();
+			context.setClassName(parser.getSource().get(data.classStartIndex,
+					data.classEndIndex - data.classStartIndex));
+
+			// In case of nested class skips over the second ':'
+			if (c == ':' && data.itr.peek() == ':') {
+				data.itr.next();
+			}
+		}
+	}
+
+	/**
+	 * Processes a character while within function name
+	 * 
+	 * @param context
+	 *            the source context under processing
+	 * @param data
+	 *            the context search flags
+	 * @param c
+	 *            the character
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private void processFunctionNameCharacter(SourceContext context,
+			ContextSearchData data, char c) throws SourceParserException {
+		// After end of function has been found the separator character
+		// marks the start of function
+		if (c == ':') {
+			if (data.itr.hasNext() && data.itr.peek() == ':') {
+				data.functionStartIndex = data.itr.previousIndex();
+				context.setFunctionName(parser.getSource().get(
+						data.functionStartIndex,
+						data.functionEndIndex - data.functionStartIndex));
+				// Skips over the second ':'
+				data.itr.next();
+			} else {
+				// Only one ':' character -> Invalid
+				data.finished = true;
+			}
+		} else if (data.itr.hasSkipped()) {
+			// If the iterator skipped over some characters and the next
+			// character is not ':' the function is a non-member
+			data.functionStartIndex = data.itr.previousIndex();
+			context.setFunctionName(parser.getSource().get(
+					data.functionStartIndex,
+					data.functionEndIndex - data.functionStartIndex));
+			// Class name indices are set so parser does not search for them
+			data.classStartIndex = data.itr.previousIndex();
+			data.classEndIndex = data.itr.previousIndex();
+			data.returnEndIndex = data.itr.currentIndex();
+		}
+	}
+
+	/**
+	 * Processes a character when function name has not yet been found
+	 * 
+	 * @param data
+	 *            the search flags
+	 * @param c
+	 *            the character to be processed
+	 */
+	private void processFunctionNameNotFoundCharacter(ContextSearchData data,
+			char c) {
+		// The next character after parameters is the end of function
+		if (c == ':') {
+			data.finished = true;
+		}
+		data.functionEndIndex = data.itr.currentIndex() + 1;
+	}
+
+	/**
+	 * Checks if the character is '(' or ')' and updates the parametersFound
+	 * flag accordingly
+	 * 
+	 * @param data
+	 *            the search data
+	 * @param c
+	 *            the current character
+	 */
+	private void processParametersNotFoundCharacter(ContextSearchData data,
+			char c) {
+		if (c == ')') {
+			data.inParameters++;
+		} else if (c == '(') {
+			data.inParameters--;
+			if (data.inParameters == 0) {
+				data.context.setParametersStartIndex(data.itr.currentIndex());
+				data.parametersFound = true;
+			}
+		}
+	}
+
+	/**
+	 * Processes a context terminating character
+	 * 
+	 * @param context
+	 *            the context under processing
+	 * @param data
+	 *            the search data
+	 * @param startOfFile
+	 *            context was terminated due to start of file
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private void processContextTerminator(SourceContext context,
+			ContextSearchData data, boolean startOfFile)
+			throws SourceParserException {
+		int offset = startOfFile ? data.itr.currentIndex() : data.itr
+				.previousIndex();
+		if (data.classStartIndex != -1) {
+			addReturnType(context, offset, data.returnEndIndex);
+			data.valid = true;
+		} else if (data.classEndIndex != -1) {
+			context.setClassName(parser.getSource().get(offset,
+					data.classEndIndex - offset));
+			data.valid = true;
+		} else if (data.functionEndIndex != -1) {
+			context.setFunctionName(parser.getSource().get(offset,
+					data.functionEndIndex - offset));
+			data.valid = true;
+		}
+		// Finished flag is set. If function name was not found, the valid flag
+		// remains false
+		data.finished = true;
+	}
+
+	/**
+	 * Adds a return type to the context
+	 * 
+	 * @param context
+	 *            the context to be searched
+	 * @param start
+	 *            the start index
+	 * @param end
+	 *            the end index
+	 * @throws SourceParserException
+	 *             if return type cannot be added
+	 */
+	private void addReturnType(SourceContext context, int start, int end)
+			throws SourceParserException {
+		context.addReturnType(parser.getSource().get(start, end - start + 1));
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/ContextSearchData.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,82 @@
+/*
+* 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 search variables during SourceParser.createContext call
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Contains search variables during SourceParser.createContext call
+ * 
+ */
+final class ContextSearchData {
+
+	/**
+	 * Index is currently in parameters
+	 */
+	int inParameters;
+
+	/**
+	 * Parameters have been found
+	 */
+	boolean parametersFound;
+
+	/**
+	 * Start of function name
+	 */
+	int functionStartIndex = -1;
+
+	/**
+	 * End of function name
+	 */
+	int functionEndIndex = -1;
+
+	/**
+	 * Start of class name
+	 */
+	int classStartIndex = -1;
+
+	/**
+	 * End of class name
+	 */
+	int classEndIndex = -1;
+
+	/**
+	 * End of return statement
+	 */
+	int returnEndIndex = -1;
+
+	/**
+	 * Context is valid
+	 */
+	boolean valid;
+
+	/**
+	 * Processing is finished
+	 */
+	boolean finished;
+
+	/**
+	 * The iterator
+	 */
+	SourceIterator itr;
+
+	/**
+	 * The context
+	 */
+	SourceContext context;
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/ExcludedAreaParser.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,352 @@
+/*
+* 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:
+*
+* Parser for comments and strings
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Parser for comments and strings
+ * 
+ */
+final class ExcludedAreaParser {
+
+	/**
+	 * The check range is used to limit the effect of unterminated ' in code
+	 */
+	private static final int CHAR_CHECK_RANGE = 3; // CodForChk_Dis_Magic
+
+	/**
+	 * Source parser
+	 */
+	private SourceParser parser;
+
+	/**
+	 * List of source file areas that are not used in search
+	 */
+	private ArrayList<SourceExcludedArea> excludedAreas = new ArrayList<SourceExcludedArea>();
+
+	/**
+	 * Comparator for array sorting and searching
+	 */
+	private PositionArrayComparator arrayComparator = new PositionArrayComparator();
+
+	/**
+	 * Constructor
+	 * 
+	 * @param parser
+	 *            the source parser
+	 */
+	ExcludedAreaParser(SourceParser parser) {
+		this.parser = parser;
+	}
+
+	/**
+	 * Resets the excluded areas
+	 */
+	void reset() {
+		excludedAreas.clear();
+	}
+
+	/**
+	 * Finds the array index of the excluded area which contains the offset. If
+	 * none of the areas contain the offset, returns negative integer indicating
+	 * the index of the excluded area following the offset
+	 * 
+	 * @param offset
+	 *            the offset to the data
+	 * @return the excluded area index
+	 */
+	int find(int offset) {
+		return Collections.binarySearch(excludedAreas, new SourceLocationBase(
+				parser, offset), arrayComparator);
+	}
+
+	/**
+	 * Finds the excluded source file areas. Excluded areas include comments and
+	 * quoted strings. Overwrites possible old areas.
+	 * 
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	void parseAll() throws SourceParserException {
+		excludedAreas.clear();
+		ExcludedAreaSearchData data = new ExcludedAreaSearchData();
+		int length = parser.getSource().getLength();
+		SourceExcludedArea lastarea = parse(data, length);
+		if (data.inString || data.inChar || data.inComment
+				|| data.inLineComment || data.inPreprocessor) {
+			lastarea.setLength(parser.getSource().getLength()
+					- lastarea.getOffset());
+			excludedAreas.add(lastarea);
+		}
+	}
+
+	/**
+	 * Parses the excluded areas of source
+	 * 
+	 * @param data
+	 *            the search data
+	 * @param length
+	 *            the length of data to be parsed
+	 * @return the last area
+	 * @throws SourceParserException
+	 *             if parser fails
+	 */
+	private SourceExcludedArea parse(ExcludedAreaSearchData data, int length)
+			throws SourceParserException {
+		SourceExcludedArea area = null;
+		while (data.index < length) {
+			data.value = parser.getSource().getChar(data.index++);
+			// Line comments end at end-of-line
+			if (data.inLineComment) {
+				processInLineComment(data, area);
+			} else if (data.inComment) {
+				processInComment(data, area);
+			} else if (data.inPreprocessor) {
+				processInPreprocessor(data, area);
+			} else if (data.inString) {
+				processInString(data, area);
+			} else if (data.inChar) {
+				processInChar(data, area);
+			} else if (data.value == '/' && data.index < length) {
+				area = createCommentArea(data);
+			} else if (data.value == '\"') {
+				area = createStringArea(data);
+			} else if (data.value == '\'') {
+				area = createCharArea(data);
+			} else if (data.value == '#'
+					&& (data.index == 1 || parser.getSource().getChar(
+							data.index - 2) == '\n')) { // CodForChk_Dis_Magic
+				area = createPreprocessorArea(data);
+			}
+		}
+		return area;
+	}
+
+	/**
+	 * Gets the excluded area that contains given offset
+	 * 
+	 * @param offset
+	 *            the offset to the area
+	 * @return the area or null if offset does not hit any area
+	 */
+	SourceExcludedArea getArea(int offset) {
+		SourceExcludedArea retval;
+		int index = find(offset);
+		if (index >= 0) {
+			retval = excludedAreas.get(index);
+		} else {
+			retval = null;
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets the list of excluded areas
+	 * 
+	 * @return the list of areas
+	 */
+	List<SourceExcludedArea> getAreas() {
+		return excludedAreas;
+	}
+
+	/**
+	 * Processes a quote (') character marking start of character area
+	 * 
+	 * @param data
+	 *            the search flags
+	 * @return the new area
+	 */
+	private SourceExcludedArea createCharArea(ExcludedAreaSearchData data) {
+		SourceExcludedArea area;
+		data.inChar = true;
+		area = new SourceExcludedArea(parser, data.index - 1,
+				SourceExcludedArea.CHARACTER);
+		return area;
+	}
+
+	/**
+	 * Processes a double quote (") character marking start of string area
+	 * 
+	 * @param data
+	 *            the search flags
+	 * @return the new area
+	 */
+	private SourceExcludedArea createStringArea(ExcludedAreaSearchData data) {
+		SourceExcludedArea area;
+		data.inString = true;
+		area = new SourceExcludedArea(parser, data.index - 1,
+				SourceExcludedArea.STRING);
+		return area;
+	}
+
+	/**
+	 * Processes a forward slash (/) character marking start of comment
+	 * 
+	 * @param data
+	 *            the search flags
+	 * @return the comment object
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private SourceExcludedArea createCommentArea(ExcludedAreaSearchData data)
+			throws SourceParserException {
+		SourceExcludedArea area;
+		char next = parser.getSource().getChar(data.index);
+		if (next == '/') {
+			data.inLineComment = true;
+			area = new SourceExcludedArea(parser, data.index - 1,
+					SourceExcludedArea.LINE_COMMENT);
+			data.index++;
+		} else if (next == '*') {
+			data.inComment = true;
+			area = new SourceExcludedArea(parser, data.index - 1,
+					SourceExcludedArea.MULTILINE_COMMENT);
+			data.index++;
+		} else {
+			area = null;
+		}
+		return area;
+	}
+
+	/**
+	 * Processes a preprocessor definition
+	 * 
+	 * @param data
+	 *            the search flags
+	 * @return the preprocessor area representation
+	 */
+	private SourceExcludedArea createPreprocessorArea(
+			ExcludedAreaSearchData data) {
+		SourceExcludedArea area = new SourceExcludedArea(parser,
+				data.index - 1, SourceExcludedArea.PREPROCESSOR_DEFINITION);
+		data.inPreprocessor = true;
+		return area;
+	}
+
+	/**
+	 * Processes a character that belongs to '' area
+	 * 
+	 * @param data
+	 *            the search flags
+	 * @param area
+	 *            the area under processing
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private void processInChar(ExcludedAreaSearchData data,
+			SourceExcludedArea area) throws SourceParserException {
+		// The check range is used to limit the effect of unterminated '
+		if ((data.value == '\'' && parser.getSource().getChar(data.index - 2) != '\\') // CodForChk_Dis_Magic
+				|| data.index - area.getOffset() > CHAR_CHECK_RANGE) {
+			data.inChar = false;
+			area.setLength(data.index - area.getOffset());
+			excludedAreas.add(area);
+		}
+	}
+
+	/**
+	 * Processes a character that belongs to "" area
+	 * 
+	 * @param data
+	 *            the search flags
+	 * @param area
+	 *            the area under processing
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private void processInString(ExcludedAreaSearchData data,
+			SourceExcludedArea area) throws SourceParserException {
+		// Strings end with " unless escaped with \" (except \\")
+		if (data.value == '\"') {
+			if (parser.getSource().getChar(data.index - 2) != '\\' // CodForChk_Dis_Magic
+					|| parser.getSource().getChar(data.index - 3) == '\\') { // CodForChk_Dis_Magic
+				data.inString = false;
+				area.setLength(data.index - area.getOffset());
+				excludedAreas.add(area);
+			}
+		}
+	}
+
+	/**
+	 * Processes a character that belongs to multi-line comment
+	 * 
+	 * @param data
+	 *            the search flags
+	 * @param area
+	 *            the area under processing
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private void processInComment(ExcludedAreaSearchData data,
+			SourceExcludedArea area) throws SourceParserException {
+		// Comments end with */
+		if (data.value == '*') {
+			if (data.index < parser.getSource().getLength()
+					&& parser.getSource().getChar(data.index) == '/') {
+				data.index++;
+				data.inComment = false;
+				area.setLength(data.index - area.getOffset());
+				excludedAreas.add(area);
+			}
+		}
+	}
+
+	/**
+	 * Processes a character that belongs to line comment
+	 * 
+	 * @param data
+	 *            the search flags
+	 * @param area
+	 *            the area under processing
+	 */
+	private void processInLineComment(ExcludedAreaSearchData data,
+			SourceExcludedArea area) {
+		if (data.value == '\n') {
+			data.inLineComment = false;
+			area.setLength(data.index - area.getOffset());
+			excludedAreas.add(area);
+		}
+	}
+
+	/**
+	 * Processes a character that belongs to preprocessor definition
+	 * 
+	 * @param data
+	 *            the search flags
+	 * @param area
+	 *            the area under processing
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private void processInPreprocessor(ExcludedAreaSearchData data,
+			SourceExcludedArea area) throws SourceParserException {
+		if (data.value == '\n') {
+			char prev = parser.getSource().getChar(data.index - 2); // CodForChk_Dis_Magic
+			char prev2 = parser.getSource().getChar(data.index - 3); // CodForChk_Dis_Magic
+			if (!((prev == '\\') || (prev == '\r' && prev2 == '\\'))) {
+				data.inPreprocessor = false;
+				area.setLength(data.index - area.getOffset());
+				excludedAreas.add(area);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/ExcludedAreaSearchData.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,61 @@
+/*
+* 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 search variables during SourceParser.findExcludedAreas call
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Contains search variables during SourceParser.findExcludedAreas call
+ * 
+ */
+final class ExcludedAreaSearchData {
+
+	/**
+	 * Data index
+	 */
+	int index;
+
+	/**
+	 * Current character
+	 */
+	char value;
+
+	/**
+	 * Within line comment flag
+	 */
+	boolean inLineComment;
+
+	/**
+	 * Within comment flag
+	 */
+	boolean inComment;
+
+	/**
+	 * Within string flag
+	 */
+	boolean inString;
+
+	/**
+	 * Within character flag
+	 */
+	boolean inChar;
+
+	/**
+	 * Within preprocessor definition flag
+	 */
+	boolean inPreprocessor;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/FormatMapping.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Format to parameter type mapping
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Type returned by {@link SourceUtils#mapFormatToParameterType(String)}
+ * 
+ */
+public final class FormatMapping {
+
+	/**
+	 * The type
+	 */
+	public String type;
+
+	/**
+	 * Array type flag
+	 */
+	public boolean isArray;
+
+	/**
+	 * Simple 32-bit type flag
+	 */
+	public boolean isSimple;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param type
+	 *            the type
+	 */
+	public FormatMapping(String type) {
+		this.type = type;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/FunctionReturnValueParser.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,317 @@
+/*
+* 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:
+*
+* Parser for function return values
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Parser for function return values
+ * 
+ */
+class FunctionReturnValueParser {
+
+	/**
+	 * Source parser
+	 */
+	private SourceParser parser;
+
+	/**
+	 * Comparator for source return values
+	 */
+	private PositionArrayComparator comparator = new PositionArrayComparator();
+
+	/**
+	 * Macros representing return statement
+	 */
+	private List<String> returnExtensions;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param parser
+	 *            the source parser
+	 */
+	FunctionReturnValueParser(SourceParser parser) {
+		this.parser = parser;
+	}
+
+	/**
+	 * Parses the return values of given source context
+	 * 
+	 * @param context
+	 *            the context to be parsed
+	 * @param list
+	 *            the list of return values
+	 */
+	void parseReturnValues(SourceContext context, List<SourceReturn> list) {
+		String statement = SourceConstants.RETURN;
+		try {
+			parseReturnValues(context, list, statement);
+		} catch (SourceParserException e) {
+		}
+		if (returnExtensions != null && returnExtensions.size() > 0) {
+			for (int i = 0; i < returnExtensions.size(); i++) {
+				try {
+					parseReturnValues(context, list, returnExtensions.get(i));
+				} catch (SourceParserException e) {
+				}
+			}
+			Collections.sort(list, comparator);
+		}
+		if (context.isVoid()) {
+			boolean addToEnd = true;
+			// If there were no return statements, the trace is added to end
+			// Otherwise the last return statement needs to be checked. If it is
+			// at the end of the function, the return trace is not added to
+			// the end
+			if (!list.isEmpty()) {
+				SourceReturn ret = list.get(list.size() - 1);
+				SourceIterator itr = parser.createIterator(ret.getOffset()
+						+ ret.getLength() + 1, SourceParser.SKIP_ALL);
+				try {
+					itr.next();
+					// If the next character after return statement is the end
+					// of function, the return is not added
+					if (itr.currentIndex() == context.getOffset()
+							+ context.getLength() - 1) {
+						addToEnd = false;
+					}
+				} catch (SourceParserException e) {
+					addToEnd = false;
+				}
+			}
+			if (addToEnd) {
+				list.add(new SourceReturn(parser, context.getOffset()
+						+ context.getLength() - 1, 0));
+			}
+		}
+	}
+
+	/**
+	 * Parses the return values of given source context that use the given
+	 * return statement
+	 * 
+	 * @param context
+	 *            the context to be parsed
+	 * @param list
+	 *            the list of return values
+	 * @param statement
+	 *            the return statement
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private void parseReturnValues(SourceContext context,
+			List<SourceReturn> list, String statement)
+			throws SourceParserException {
+		FunctionReturnValueSearchData data = new FunctionReturnValueSearchData();
+		int offset = context.getOffset();
+		int end = offset + context.getLength();
+		SourceSearch search = parser.startStringSearch(statement, offset, end,
+				SourceParser.MATCH_WHOLE_WORD | SourceParser.SKIP_ALL);
+		boolean looping = true;
+		do {
+			data.index = search.findNext();
+			if (data.index != -1) {
+				data.itr = parser.createIterator(data.index
+						+ statement.length(), SourceParser.SKIP_ALL);
+				locateReturnStatement(data);
+				if (data.endOffset != -1 && data.startOffset != -1) {
+					SourceReturn ret = createReturnStatement(data);
+					list.add(ret);
+				} else {
+					// End of return statement missing
+					looping = false;
+				}
+			} else {
+				looping = false;
+			}
+		} while (looping);
+	}
+
+	/**
+	 * Locates the start and end offsets for the return statement
+	 * 
+	 * @param data
+	 *            the search data
+	 * @throws SourceParserException
+	 *             if parser fails
+	 */
+	private void locateReturnStatement(FunctionReturnValueSearchData data)
+			throws SourceParserException {
+		data.startOffset = -1;
+		data.endOffset = -1;
+		boolean found = false;
+		boolean colonAllowed = false;
+		while (data.itr.hasNext() && !found) {
+			char c = data.itr.next();
+			if (c == ';') {
+				data.endOffset = data.itr.previousIndex() + 1;
+				found = true;
+			} else if (c == '}') {
+				found = true;
+			} else if (c == '?') {
+				colonAllowed = true;
+			} else if (c == ':') {
+				if (data.itr.hasNext() && data.itr.peek() == ':') {
+					// Skips over ::
+					c = data.itr.next();
+				} else {
+					if (colonAllowed) {
+						colonAllowed = false;
+					} else {
+						data.endOffset = data.itr.previousIndex() + 1;
+						found = true;
+					}
+				}
+			}
+			if (data.startOffset == -1) {
+				data.startOffset = data.itr.currentIndex();
+			}
+		}
+	}
+
+	/**
+	 * Creates a return statement
+	 * 
+	 * @param data
+	 *            the parser data
+	 * @return the new statement
+	 * @throws SourceParserException
+	 *             if parser fails
+	 */
+	private SourceReturn createReturnStatement(
+			FunctionReturnValueSearchData data) throws SourceParserException {
+		SourceReturn ret = new SourceReturn(parser, data.startOffset,
+				data.endOffset - data.startOffset);
+		if (checkTag(data.startOffset, data.endOffset - data.startOffset)) {
+			ret.setTagHazard();
+		}
+		if (checkPreviousChar(data.index - 1)) {
+			ret.setPreviousCharHazard();
+		}
+		return ret;
+	}
+
+	/**
+	 * Checks if the tag is hazardous
+	 * 
+	 * @param start
+	 *            start offset
+	 * @param length
+	 *            tag length
+	 * @return true if there is a problem
+	 */
+	private boolean checkTag(int start, int length) {
+		boolean hazard = false;
+		boolean previous = false;
+		// Function calls and increment / decrement operators are not safe
+		for (int i = start; i < start + length && !hazard; i++) {
+			char c = parser.getData(i);
+			if (c == '(') {
+				// If return statement is within brackets, it is not hazardous
+				if (i != start || parser.getData(start + length - 1) != ')') {
+					hazard = true;
+				}
+			} else if (c == '?') {
+				hazard = true;
+			} else if (c == '-' || c == '+') {
+				if (previous) {
+					hazard = true;
+				} else {
+					previous = true;
+				}
+			} else {
+				previous = false;
+			}
+		}
+		return hazard;
+	}
+
+	/**
+	 * Checks if previous character is hazardous
+	 * 
+	 * @param index
+	 *            the index
+	 * @return true if hazard, false if not
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private boolean checkPreviousChar(int index) throws SourceParserException {
+		boolean hazard = false;
+		SourceIterator previtr = parser.createIterator(index,
+				SourceParser.SKIP_ALL | SourceParser.BACKWARD_SEARCH);
+		char prevchar = previtr.next();
+		if (prevchar != ';' && prevchar != '{' && prevchar != '}') {
+			hazard = true;
+		}
+		return hazard;
+	}
+
+	/**
+	 * Finds the last return statement from the given context
+	 * 
+	 * @param context
+	 *            the context
+	 * @return the index to beginning of the return statement
+	 */
+	int findLast(SourceContext context) {
+		String statement = SourceConstants.RETURN;
+		int retval = findLast(context, statement);
+		if (returnExtensions != null && returnExtensions.size() > 0) {
+			int res;
+			for (int i = 0; i < returnExtensions.size(); i++) {
+				res = findLast(context, returnExtensions.get(i));
+				if (res > retval) {
+					retval = res;
+				}
+			}
+		}
+		if (retval == -1) {
+			retval = context.getOffset() + context.getLength();
+		}
+		return retval;
+	}
+
+	/**
+	 * Finds the last return statement from the given context
+	 * 
+	 * @param context
+	 *            the context
+	 * @param statement
+	 *            the statement to be searched
+	 * @return the index to beginning of the return statement
+	 */
+	private int findLast(SourceContext context, String statement) {
+		// TODO: Backwards string search
+		int start = context.getOffset();
+		int end = start + context.getLength();
+		SourceSearch search = parser.startStringSearch(statement, start, end,
+				SourceParser.MATCH_WHOLE_WORD | SourceParser.SKIP_ALL);
+		int index = 0;
+		int retval = -1;
+		do {
+			index = search.findNext();
+			if (index != -1) {
+				retval = index;
+			}
+		} while (index != -1);
+		return retval;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/FunctionReturnValueSearchData.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,47 @@
+/*
+* 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:
+*
+* Parser for function return values
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Parse data for function return value parser
+ * 
+ */
+final class FunctionReturnValueSearchData {
+
+	/**
+	 * Data index
+	 */
+	int index;
+
+	/**
+	 * Iterator
+	 */
+	SourceIterator itr;
+
+	/**
+	 * Return statement start offset
+	 */
+	int startOffset;
+
+	/**
+	 * Return statement end offset
+	 */
+	int endOffset;
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/OffsetLength.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Wrapper for offset and length
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Wrapper for offset and length
+ * 
+ */
+public final class OffsetLength {
+
+	/**
+	 * Offset
+	 */
+	public int offset;
+
+	/**
+	 * Length
+	 */
+	public int length;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/ParsedType.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Interface for types parsed from source files
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Interface for types parsed from source files
+ * 
+ */
+public interface ParsedType {
+
+	/**
+	 * Checks if parameter is pointer (*) or pointer reference (*&)
+	 * 
+	 * @return true if pointer, false if not
+	 */
+	public boolean isPointer();
+
+	/**
+	 * Checks if parameter type equals given type
+	 * 
+	 * @param type
+	 *            the type to be checked
+	 * @return true if types match
+	 */
+	public boolean typeEquals(String type);
+
+	/**
+	 * Checks if the type has the given qualifier
+	 * 
+	 * @param qualifier
+	 *            the qualifier to be checked
+	 * @return true if qualifier exists, false if not
+	 */
+	public boolean hasQualifier(String qualifier);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/PositionArrayComparator.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Comparator for position arrays
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import java.util.Comparator;
+
+/**
+ * Comparator for position arrays
+ * 
+ */
+public final class PositionArrayComparator implements
+		Comparator<SourceLocationBase> {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+	 */
+	public int compare(SourceLocationBase arrayElement, SourceLocationBase key) {
+		int retval;
+		if (key.getOffset() < arrayElement.getOffset()) {
+			// Start is inclusive
+			retval = 1;
+		} else if (key.getOffset() >= arrayElement.getOffset()
+				+ arrayElement.getLength()) {
+			// End is exclusive
+			retval = -1;
+		} else {
+			retval = 0;
+		}
+		return retval;
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceConstants.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,445 @@
+/*
+* Copyright (c) 2008-2010 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:
+*
+* Constants related to source files
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Constants related to source files
+ * 
+ */
+public interface SourceConstants {
+
+	/**
+	 * Space character as string
+	 */
+	final String SPACE = " "; //$NON-NLS-1$
+
+	/**
+	 * Quote character as string
+	 */
+	final String QUOTE = "\""; //$NON-NLS-1$
+
+	/**
+	 * '\' character as string
+	 */
+	final String BACKSLASH = "\\"; //$NON-NLS-1$
+
+	/**
+	 * '_' character as string
+	 */
+	final String UNDERSCORE = "_"; //$NON-NLS-1$
+
+	/**
+	 * Double underscore for header guards
+	 */
+	final String DOUBLE_UNDERSCORE = "__"; //$NON-NLS-1$
+
+	/**
+	 * Semicolon character as string
+	 */
+	final String SEMICOLON = ";"; //$NON-NLS-1$
+
+	/**
+	 * Colon character as string
+	 */
+	final String COLON = ":"; //$NON-NLS-1$
+
+	/**
+	 * Period character as string
+	 */
+	final String PERIOD = "."; //$NON-NLS-1$
+
+	/**
+	 * Tilde character as string
+	 */
+	final String TILDE = "~"; //$NON-NLS-1$
+
+	/**
+	 * Opening brace as string
+	 */
+	final String OPENING_BRACE = "{"; //$NON-NLS-1$
+
+	/**
+	 * Closing brace as string
+	 */
+	final String CLOSING_BRACE = "}"; //$NON-NLS-1$
+
+	/**
+	 * Asterisk character
+	 */
+	final String ASTERISK = "*"; //$NON-NLS-1$
+
+	/**
+	 * Space character
+	 */
+	final char SPACE_CHAR = ' ';
+
+	/**
+	 * Colon character
+	 */
+	final char COLON_CHAR = ':';
+	
+	/**
+	 * Quote character
+	 */
+	final char QUOTE_CHAR = '\"';
+
+	/**
+	 * '\' character
+	 */
+	final char BACKSLASH_CHAR = '\\';
+
+	/**
+	 * '/' character
+	 */
+	final char FORWARD_SLASH_CHAR = '/';
+
+	/**
+	 * '_' character
+	 */
+	final char UNDERSCORE_CHAR = '_';
+
+	/**
+	 * '.' character
+	 */
+	final char PERIOD_CHAR = '.';
+
+	/**
+	 * Line separator
+	 */
+	final String LINE_FEED = System.getProperty("line.separator"); //$NON-NLS-1$
+
+	/**
+	 * Header extension (.h)
+	 */
+	final String HEADER_EXTENSION = ".h"; //$NON-NLS-1$
+
+	/**
+	 * #define
+	 */
+	final String DEFINE = "#define"; //$NON-NLS-1$
+
+	/**
+	 * #undef
+	 */
+	final String UNDEF = "#undef"; //$NON-NLS-1$
+
+	/**
+	 * #include
+	 */
+	final String INCLUDE = "#include"; //$NON-NLS-1$
+
+	/**
+	 * #ifdef
+	 */
+	final String IFDEF = "#ifdef"; //$NON-NLS-1$
+
+	/**
+	 * #ifndef
+	 */
+	final String IFNDEF = "#ifndef"; //$NON-NLS-1$
+
+	/**
+	 * #if
+	 */
+	final String IF = "#if"; //$NON-NLS-1$
+
+	/**
+	 * defined
+	 */
+	final String DEFINED = "defined"; //$NON-NLS-1$
+
+	/**
+	 * #else
+	 */
+	final String ELSE = "#else"; //$NON-NLS-1$
+
+	/**
+	 * #endif
+	 */
+	final String ENDIF = "#endif"; //$NON-NLS-1$
+
+	/**
+	 * Or
+	 */
+	final String OR = "||"; //$NON-NLS-1$
+
+	/**
+	 * Return statement
+	 */
+	final String RETURN = "return"; //$NON-NLS-1$
+
+	/**
+	 * One step up in path ("../")
+	 */
+	final String PATH_UP = "../"; //$NON-NLS-1$
+
+	/**
+	 * This path ("./")
+	 */
+	final String THIS_PATH = "./"; //$NON-NLS-1$
+
+	/**
+	 * inline
+	 */
+	final String INLINE = "inline"; //$NON-NLS-1$
+
+	/**
+	 * void
+	 */
+	final String VOID = "void"; //$NON-NLS-1$
+
+	/**
+	 * char
+	 */
+	final String CHAR = "char"; //$NON-NLS-1$
+
+	/**
+	 * short
+	 */
+	final String SHORT = "short"; //$NON-NLS-1$
+
+	/**
+	 * int
+	 */
+	final String INT = "int"; //$NON-NLS-1$
+
+	/**
+	 * long
+	 */
+	final String LONG = "long"; //$NON-NLS-1$
+
+	/**
+	 * unsigned
+	 */
+	final String UNSIGNED = "unsigned"; //$NON-NLS-1$
+
+	/**
+	 * Parameter type qualifier list
+	 */
+	final String[] PARAMETER_QUALIFIERS = { "const", //$NON-NLS-1$
+			"volatile", UNSIGNED }; //$NON-NLS-1$
+
+	/**
+	 * No parameters
+	 */
+	final String NO_PARAMETERS = "()"; //$NON-NLS-1$
+
+	/**
+	 * Start of parameters
+	 */
+	final String START_PARAMETERS = "( "; //$NON-NLS-1$
+
+	/**
+	 * Start of parameters with quote
+	 */
+	final String START_PARAMETERS_QUOTE = "( \""; //$NON-NLS-1$
+
+	/**
+	 * Closing parenthesis with non-quoted last parameter
+	 */
+	final String END_PARAMETERS = " )"; //$NON-NLS-1$
+
+	/**
+	 * Closing parenthesis with quoted last parameter
+	 */
+	final String END_PARAMETERS_QUOTE = "\" )"; //$NON-NLS-1$
+
+	/**
+	 * Separator between end of quoted parameter and start of non-quoted
+	 * parameter
+	 */
+	final String QUOTE_PARAMETER_SEPARATOR = "\", "; //$NON-NLS-1$
+
+	/**
+	 * Separator between two parameters without quotes
+	 */
+	final String PARAMETER_SEPARATOR = ", "; //$NON-NLS-1$
+
+	/**
+	 * Separator within for
+	 */
+	final String FOR_SEPARATOR = "; "; //$NON-NLS-1$
+
+	/**
+	 * Separator between end of non-quoted parameter and start of quoted
+	 * parameter
+	 */
+	final String PARAMETER_SEPARATOR_QUOTE = ", \""; //$NON-NLS-1$
+
+	/**
+	 * if and the opening parenthesis
+	 */
+	final String START_IF = "if ( "; //$NON-NLS-1$
+
+	/**
+	 * Sizeof and the opening parenthesis
+	 */
+	final String START_SIZEOF = "sizeof ( "; //$NON-NLS-1$
+
+	/**
+	 * for and the opening parenthesis
+	 */
+	final String START_FOR = "for ( "; //$NON-NLS-1$
+
+	/**
+	 * Assignment operation with spaces
+	 */
+	final String ASSIGN_WITH_SPACES = " = "; //$NON-NLS-1$
+
+	/**
+	 * Assignment operation with out spaces
+	 */
+	final String ASSIGN_WITH_OUT_SPACES = "="; //$NON-NLS-1$
+	
+	/**
+	 * Less of equals for if-statements
+	 */
+	final String LESS_OR_EQUAL_THAN = " <= "; //$NON-NLS-1$
+
+	/**
+	 * Less for if statements
+	 */
+	final String LESS_THAN = " < "; //$NON-NLS-1$
+
+	/**
+	 * Starting bracket for array
+	 */
+	final String START_ARRAY = "[ "; //$NON-NLS-1$
+
+	/**
+	 * Ending bracket for array
+	 */
+	final String END_ARRAY = " ]"; //$NON-NLS-1$
+
+	/**
+	 * Pointer and space
+	 */
+	final String POINTER = "* "; //$NON-NLS-1$
+
+	/**
+	 * Add operation with spaces
+	 */
+	final String ADD = " + "; //$NON-NLS-1$
+
+	/**
+	 * Modulo operation with spaces
+	 */
+	final String MOD = " % "; //$NON-NLS-1$
+
+	/**
+	 * Subtract with assignment
+	 */
+	final String SUBTRACT_ASSIGN = " -= "; //$NON-NLS-1$
+
+	/**
+	 * Add with assignment
+	 */
+	final String ADD_ASSIGN = " += "; //$NON-NLS-1$
+
+	/**
+	 * Not equal check
+	 */
+	final String NOT_EQUALS = " != "; //$NON-NLS-1$
+
+	/**
+	 * Equal check
+	 */
+	final String EQUALS = " == "; //$NON-NLS-1$
+
+	/**
+	 * Increment operation
+	 */
+	final String INCREMENT = "++"; //$NON-NLS-1$
+
+	/**
+	 * Subtract operation with spaces
+	 */
+	final String SUBTRACT = " - "; //$NON-NLS-1$
+
+	/**
+	 * class
+	 */
+	final String CLASS = "class"; //$NON-NLS-1$
+
+	/**
+	 * public
+	 */
+	final String PUBLIC = "public"; //$NON-NLS-1$
+
+	/**
+	 * private
+	 */
+	final String PRIVATE = "private"; //$NON-NLS-1$
+
+	/**
+	 * Prefix for hex numbers
+	 */
+	final String HEX_PREFIX = "0x"; //$NON-NLS-1$
+
+	/**
+	 * Prefix for hex numbers, upper case
+	 */
+	final String HEX_PREFIX_U = "0X"; //$NON-NLS-1$
+
+	/**
+	 * Prefix for octal numbers
+	 */
+	final String OCTAL_PREFIX = "0"; //$NON-NLS-1$
+
+	/**
+	 * 64-bit integer postfix
+	 */
+	final String I64_POSTFIX = "i64"; //$NON-NLS-1$
+
+	/**
+	 * Size of long integer
+	 */
+	final int LONG_SIZE = 64; // CodForChk_Dis_Magic
+
+	/**
+	 * Size of integer
+	 */
+	final int INT_SIZE = 32; // CodForChk_Dis_Magic
+
+	/**
+	 * Size of short
+	 */
+	final int SHORT_SIZE = 16; // CodForChk_Dis_Magic
+
+	/**
+	 * Size of byte
+	 */
+	final int BYTE_SIZE = 8; // CodForChk_Dis_Magic
+
+	/**
+	 * Array type prefix
+	 */
+	final String OST_ARRAY_TYPE_PREFIX = "const TOstArray< "; //$NON-NLS-1$
+
+	/**
+	 * Array type postfix
+	 */
+	final String OST_ARRAY_TYPE_POSTFIX = " >&"; //$NON-NLS-1$
+	
+	/**
+	 * Variable argument list indicator
+	 */
+	final String VARIABLE_ARG_LIST_INDICATOR = "..."; //$NON-NLS-1$
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceContext.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,320 @@
+/*
+* 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:
+*
+* Source context is a representation of a range of source code
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Source context is a representation of a range of source code. For example a
+ * function in source code could be represented with a context that has the name
+ * of the function
+ * 
+ */
+public class SourceContext extends SourceLocationBase implements ParsedType {
+
+	/**
+	 * No proposal
+	 */
+	public static final int NONE = 0; // CodForChk_Dis_Magic
+
+	/**
+	 * Start of function proposal type
+	 */
+	public static final int START_OF_FUNCTION = 1; // CodForChk_Dis_Magic
+
+	/**
+	 * End of function proposal type
+	 */
+	public static final int END_OF_FUNCTION = 2; // CodForChk_Dis_Magic
+
+	/**
+	 * Full selection proposal type
+	 */
+	public static final int FULL_SELECTION = 3; // CodForChk_Dis_Magic
+
+	/**
+	 * Class name
+	 */
+	private String className;
+
+	/**
+	 * Function name
+	 */
+	private String functionName;
+
+	/**
+	 * Index to start of parameters
+	 */
+	private int parameterStart;
+
+	/**
+	 * List of return types
+	 */
+	private ArrayList<String> returnTypes;
+
+	/**
+	 * Creates a new SourceContext starting from given offset
+	 * 
+	 * @param parser
+	 *            the parser owning this context
+	 * @param offset
+	 *            the offset
+	 */
+	SourceContext(SourceParser parser, int offset) {
+		super(parser, offset);
+	}
+
+	/**
+	 * Gets the class name of this context
+	 * 
+	 * @return the class name
+	 */
+	public String getClassName() {
+		return className;
+	}
+
+	/**
+	 * Gets the function name of this context
+	 * 
+	 * @return the function name
+	 */
+	public String getFunctionName() {
+		return functionName;
+	}
+
+	/**
+	 * Sets the class name. If the class name contains pointer or reference
+	 * characters, they are added to the return statements list
+	 * 
+	 * @param name
+	 *            the new class name
+	 */
+	void setClassName(String name) {
+		className = removePtrAndRef(name);
+	}
+
+	/**
+	 * Sets the function name. If the function name contains pointer or
+	 * reference characters, they are added to the return statements list
+	 * 
+	 * @param name
+	 *            the new function name
+	 */
+	void setFunctionName(String name) {
+		functionName = removePtrAndRef(name);
+	}
+
+	/**
+	 * Removes the * and & characters from the given tag and adds them as return
+	 * modifiers
+	 * 
+	 * @param name
+	 *            the name
+	 * @return the name with * and & removed
+	 */
+	private String removePtrAndRef(String name) {
+		String retval = name;
+		if (name != null) {
+			int start = 0;
+			int end = name.length();
+			boolean found = true;
+			while (start < end && found) {
+				char c = name.charAt(start);
+				if (c == '*' || c == '&') {
+					addReturnModifier(c);
+					start++;
+				} else {
+					found = false;
+				}
+			}
+			found = true;
+			while (end > start && found) {
+				char c = name.charAt(end - 1);
+				if (c == '*' || c == '&') {
+					addReturnModifier(c);
+					end--;
+				} else {
+					found = false;
+				}
+			}
+			retval = name.substring(start, end);
+		}
+		return retval;
+	}
+
+	/**
+	 * Sets the index for start of parameters
+	 * 
+	 * @param index
+	 *            the index
+	 */
+	void setParametersStartIndex(int index) {
+		parameterStart = index;
+	}
+
+	/**
+	 * Adds a return type string to the context
+	 * 
+	 * @param type
+	 *            the return type
+	 */
+	void addReturnType(String type) {
+		// Constructors and destructor do not have return types
+		if (className != null && functionName!= null && !className.equals(functionName)
+				&& !functionName.equals(SourceConstants.TILDE + className)) {
+			type = removePtrAndRef(type);
+			if (type.length() > 0) {
+				if (returnTypes == null) {
+					returnTypes = new ArrayList<String>();
+				}
+				returnTypes.add(type);
+			}
+		}
+	}
+
+	/**
+	 * Adds a return type modifier to the list of return types
+	 * 
+	 * @param c
+	 *            the modifier
+	 */
+	private void addReturnModifier(char c) {
+		if (returnTypes == null) {
+			returnTypes = new ArrayList<String>();
+		}
+		returnTypes.add(String.valueOf(c));
+	}
+
+	/**
+	 * Gets the return types of this context
+	 * 
+	 * @return the return types
+	 */
+	Iterator<String> getReturnTypes() {
+		List<String> list;
+		if (returnTypes != null) {
+			list = returnTypes;
+		} else {
+			list = Collections.emptyList();
+		}
+		return list.iterator();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.ParsedType#hasQualifier(java.lang.String)
+	 */
+	public boolean hasQualifier(String type) {
+		// All types and qualifiers are in the returnTypes list
+		return typeEquals(type);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.ParsedType#typeEquals(java.lang.String)
+	 */
+	public boolean typeEquals(String type) {
+		return (returnTypes != null && returnTypes.contains(type));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.ParsedType#isPointer()
+	 */
+	public boolean isPointer() {
+		boolean retval = false;
+		if (returnTypes != null) {
+			for (int i = 0; i < returnTypes.size() && !retval; i++) {
+				if (returnTypes.get(i).equals(SourceConstants.ASTERISK)) {
+					retval = true;
+				}
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Checks if return types list contains "void"
+	 * 
+	 * @return true if void, false if not
+	 */
+	public boolean isVoid() {
+		return (returnTypes == null || returnTypes
+				.contains(SourceConstants.VOID));
+	}
+
+	/**
+	 * Parses the parameters of this source context
+	 * 
+	 * @param parameterList
+	 *            the list where the parameters are stored
+	 * @throws SourceParserException
+	 *             if parsing fails
+	 */
+	public void parseParameters(List<SourceParameter> parameterList)
+			throws SourceParserException {
+		if (getParser() != null) {
+			getParser().parseFunctionParameters(parameterStart, parameterList);
+		} else {
+			throw new SourceParserException(
+					SourceErrorCodes.CONTEXT_MISSING_OWNER);
+		}
+	}
+
+	/**
+	 * Parses the return statements of this source context
+	 * 
+	 * @param returnList
+	 *            the list where the return values are stored
+	 * @throws SourceParserException
+	 *             if parsing fails
+	 */
+	public void parseReturnValues(List<SourceReturn> returnList)
+			throws SourceParserException {
+		if (getParser() != null) {
+			getParser().parseReturnValues(this, returnList);
+		} else {
+			throw new SourceParserException(
+					SourceErrorCodes.CONTEXT_MISSING_OWNER);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		StringBuffer sb = new StringBuffer();
+		if (className != null) {
+			sb.append(getClassName());
+		}
+		sb.append("::"); //$NON-NLS-1$
+		sb.append(getFunctionName());
+		return sb.toString();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceDocumentFactory.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Interface to be implemented by document framework
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Interface to be implemented by document framework
+ * 
+ */
+public interface SourceDocumentFactory {
+
+	/**
+	 * Creates a new location
+	 * 
+	 * @param base
+	 *            the location which owns the position
+	 * @param offset
+	 *            the position offset
+	 * @param length
+	 *            the position length
+	 * @return the location
+	 */
+	public SourceLocationInterface createLocation(SourceLocationBase base,
+			int offset, int length);
+
+	/**
+	 * Creates a new document
+	 * 
+	 * @param sourceData
+	 *            the document data
+	 * @return the document
+	 */
+	public SourceDocumentInterface createDocument(String sourceData);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceDocumentInterface.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,123 @@
+/*
+* 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:
+*
+* Source document abstraction
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Source document abstraction
+ * 
+ */
+public interface SourceDocumentInterface {
+
+	/**
+	 * Gets the property provider interface. This can return null if the
+	 * document framework does not support source properties
+	 * 
+	 * @return the property provider
+	 */
+	public SourcePropertyProvider getPropertyProvider();
+
+	/**
+	 * Gets a subset of document data
+	 * 
+	 * @param start
+	 *            the start offset
+	 * @param length
+	 *            the data length
+	 * @return the data
+	 * @throws SourceParserException
+	 *             if parameters are not valid
+	 */
+	public String get(int start, int length) throws SourceParserException;
+
+	/**
+	 * Gets a character
+	 * 
+	 * @param offset
+	 *            the offset
+	 * @return the character
+	 * @throws SourceParserException
+	 *             if offset is not valid
+	 */
+	public char getChar(int offset) throws SourceParserException;
+
+	/**
+	 * Gets the data length
+	 * 
+	 * @return the length
+	 */
+	public int getLength();
+
+	/**
+	 * Maps an offset to line number
+	 * 
+	 * @param offset
+	 *            the offset
+	 * @return the line number
+	 * @throws SourceParserException
+	 *             if offset is not valid
+	 */
+	public int getLineOfOffset(int offset) throws SourceParserException;
+
+	/**
+	 * Replaces data from the document
+	 * 
+	 * @param offset
+	 *            offset to removed data
+	 * @param length
+	 *            length of removed data
+	 * @param newText
+	 *            new data
+	 * @throws SourceParserException
+	 *             if parameters are not valid
+	 */
+	public void replace(int offset, int length, String newText)
+			throws SourceParserException;
+
+	/**
+	 * Adds a location to this source.
+	 * 
+	 * @param location
+	 *            the location to be added
+	 */
+	public void addLocation(SourceLocationInterface location);
+
+	/**
+	 * Removes a location from this source.
+	 * 
+	 * @param location
+	 *            the location to be removed
+	 */
+	public void removeLocation(SourceLocationInterface location);
+
+	/**
+	 * Gets the owner of this source
+	 * 
+	 * @return the owner
+	 */
+	public Object getOwner();
+
+	/**
+	 * Sets the owner of this source
+	 * 
+	 * @param owner
+	 *            the owner
+	 */
+	public void setOwner(Object owner);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceDocumentMonitor.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Monitor for source files
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Monitor for source files
+ * 
+ */
+public interface SourceDocumentMonitor extends
+		Iterable<SourceDocumentInterface> {
+
+	/**
+	 * Gets a document factory, which is shared between all documents created
+	 * into this monitor
+	 * 
+	 * @return the factory
+	 */
+	public SourceDocumentFactory getFactory();
+
+	/**
+	 * Starts the monitor
+	 * 
+	 * @param processor
+	 *            document processor callback
+	 * @throws Exception 
+	 */
+	public void startMonitor(SourceDocumentProcessor processor) throws Exception;
+
+	/**
+	 * Stops the monitor
+	 */
+	public void stopMonitor();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceDocumentProcessor.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* Document processor interface
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import com.nokia.tracecompiler.model.TraceCompilerException;
+
+/**
+ * Document processor interface
+ * 
+ */
+public interface SourceDocumentProcessor {
+
+	/**
+	 * Notification about source opened
+	 * 
+	 * @param document
+	 *            the document
+	 * @throws TraceCompilerException 
+	 */
+	public void sourceOpened(SourceDocumentInterface document) throws TraceCompilerException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceErrorCodes.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* 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:
+*
+* Error codes for source parser
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Error codes for source parser
+ * 
+ */
+public interface SourceErrorCodes {
+
+	/**
+	 * Something unexpected happened while parsing source. This should be
+	 * asserted
+	 */
+	int UNEXPECTED_EXCEPTION = 0; // CodForChk_Dis_Magic
+
+	/**
+	 * Missing owner from source context. This should be asserted
+	 */
+	int CONTEXT_MISSING_OWNER = 1; // CodForChk_Dis_Magic
+
+	/**
+	 * Unexpected separator while parsing parameters
+	 */
+	int UNEXPECTED_PARAMETER_SEPARATOR = 2; // CodForChk_Dis_Magic
+
+	/**
+	 * Unexpected end of file while parsing
+	 */
+	int UNEXPECTED_END_OF_FILE = 3; // CodForChk_Dis_Magic
+
+	/**
+	 * Unexpected quote character was encountered
+	 */
+	int UNEXPECTED_QUOTE_CHARACTER = 4; // CodForChk_Dis_Magic
+
+	/**
+	 * Bracket mismatch
+	 */
+	int BRACKET_MISMATCH = 5; // CodForChk_Dis_Magic
+
+	/**
+	 * Offset / length was not valid
+	 */
+	int BAD_LOCATION = 6; // CodForChk_Dis_Magic
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceExcludedArea.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,81 @@
+/*
+* 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:
+*
+* Comment or string ares are added to the excluded list
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Comment or string ares are added to the excluded list
+ * 
+ */
+public class SourceExcludedArea extends SourceLocationBase {
+
+	/**
+	 * Line comment type
+	 */
+	public static final int LINE_COMMENT = 1; // CodForChk_Dis_Magic
+
+	/**
+	 * Multiline comment type
+	 */
+	public static final int MULTILINE_COMMENT = 2; // CodForChk_Dis_Magic
+
+	/**
+	 * String type
+	 */
+	public static final int STRING = 3; // CodForChk_Dis_Magic
+
+	/**
+	 * Character type
+	 */
+	public static final int CHARACTER = 4; // CodForChk_Dis_Magic
+
+	/**
+	 * Preprocessor definition area
+	 */
+	public static final int PREPROCESSOR_DEFINITION = 5; // CodForChk_Dis_Magic
+
+	/**
+	 * Type of area
+	 */
+	private int type;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param parser
+	 *            the parser where this area belongs
+	 * @param offset
+	 *            offset to the area
+	 * @param type
+	 *            type of area
+	 */
+	SourceExcludedArea(SourceParser parser, int offset, int type) {
+		super(parser, offset);
+		this.type = type;
+	}
+
+	/**
+	 * Gets the type of this area
+	 * 
+	 * @return the type
+	 */
+	public int getType() {
+		return type;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceIterator.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,352 @@
+/*
+* 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:
+*
+* SourceIterator can be used to traverse through the source file character at a time
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * SourceIterator can be used to traverse through the source file character at a
+ * time.
+ * 
+ */
+public class SourceIterator {
+
+	/**
+	 * The source parser
+	 */
+	private SourceParser parser;
+
+	/**
+	 * Index of next excluded area
+	 */
+	private int nextExcludedIndex;
+
+	/**
+	 * The type of next excluded area
+	 */
+	private int nextExcludedAreaType;
+
+	/**
+	 * Offset to the start of next excluded area
+	 */
+	private int nextExcludedStart;
+
+	/**
+	 * Offset to the end of next excluded area
+	 */
+	private int nextExcludedEnd;
+
+	/**
+	 * Index of next character to be fetched
+	 */
+	private int nextIndex;
+
+	/**
+	 * Index of character returned by latest call to next
+	 */
+	private int currentIndex;
+
+	/**
+	 * Index of character returned by previous call to next
+	 */
+	private int previousIndex;
+
+	/**
+	 * Search flags
+	 */
+	private int flags;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param parser
+	 *            source parser
+	 * @param startIndex
+	 *            the index where to start
+	 * @param flags
+	 *            the iterator flags
+	 */
+	SourceIterator(SourceParser parser, int startIndex, int flags) {
+		SourceDocumentInterface source = parser.getSource();
+		if (startIndex >= source.getLength()
+				&& ((flags & SourceParser.BACKWARD_SEARCH) != 0)) {
+			nextIndex = source.getLength() - 1;
+		} else {
+			nextIndex = startIndex;
+		}
+		this.parser = parser;
+		this.flags = flags;
+		if (hasNext()) {
+			boolean forward = (flags & SourceParser.BACKWARD_SEARCH) == 0;
+			nextExcludedIndex = parser.findExcludedAreaIndex(nextIndex);
+			if (nextExcludedIndex < 0) {
+				nextExcludedIndex = -1 - nextExcludedIndex;
+				if (forward) {
+					// Update increments the index, so it must be moved behind
+					// the start of search
+					nextExcludedIndex--;
+				}
+			}
+			// Increments / decrements the next excluded area according to
+			// search direction. If direction is backward, this decrements the
+			// index. In that case the above initialization has selected the
+			// index after the start of search index. If direction is forward,
+			// this increments the index.
+			updateExcludedIndex();
+			// After the excluded index has been set, the white spaces and
+			// comments are skipped
+			if (forward) {
+				forwardSeekNext();
+			} else {
+				backwardSeekNext();
+			}
+			previousIndex = startIndex;
+			currentIndex = startIndex;
+		}
+	}
+
+	/**
+	 * Determines if there are more characters to process
+	 * 
+	 * @return true if iterator has more characters
+	 */
+	public boolean hasNext() {
+		return (flags & SourceParser.BACKWARD_SEARCH) == 0 ? nextIndex < parser
+				.getSource().getLength() : nextIndex >= 0;
+	}
+
+	/**
+	 * Gets the next character from this iterator
+	 * 
+	 * @return the next character
+	 * @throws SourceParserException
+	 *             if there are no more characters
+	 */
+	public char next() throws SourceParserException {
+		char ret;
+		previousIndex = currentIndex;
+		currentIndex = nextIndex;
+		if ((flags & SourceParser.BACKWARD_SEARCH) == 0) {
+			ret = forwardNext();
+		} else {
+			ret = backwardNext();
+		}
+		return ret;
+	}
+
+	/**
+	 * Returns next character moving forward
+	 * 
+	 * @return the character
+	 * @throws SourceParserException
+	 *             if there are no more characters
+	 */
+	private char forwardNext() throws SourceParserException {
+		char c = parser.getSource().getChar(nextIndex);
+		nextIndex++;
+		forwardSeekNext();
+		return c;
+	}
+
+	/**
+	 * Skips to next index
+	 */
+	private void forwardSeekNext() {
+		// Skips over the excluded area if the index enters one
+		boolean didSkip;
+		SourceDocumentInterface source = parser.getSource();
+		try {
+			do {
+				didSkip = false;
+				if (nextIndex >= nextExcludedStart && nextExcludedStart != -1) {
+					// Skips if applicable. Otherwise just updates the next
+					// excluded
+					// area variables
+					if (isExcluded()) {
+						nextIndex = nextExcludedEnd;
+					}
+					updateExcludedIndex();
+				}
+				if ((flags & SourceParser.SKIP_WHITE_SPACES) != 0) {
+					// Skips over white spaces
+					boolean wspFound = true;
+					do {
+						// If a white space is skipped, the excluded area check
+						// needs to be done again. didSkip flag controls that
+						if (nextIndex < source.getLength()
+								&& Character.isWhitespace(source
+										.getChar(nextIndex))) {
+							nextIndex++;
+							didSkip = true;
+						} else {
+							wspFound = false;
+						}
+					} while (wspFound);
+				}
+			} while (didSkip);
+		} catch (SourceParserException e) {
+			// The exception must not be thrown out of this function
+		}
+	}
+
+	/**
+	 * Returns next character moving backward
+	 * 
+	 * @return the character
+	 * @throws SourceParserException
+	 *             if there are no more characters
+	 */
+	private char backwardNext() throws SourceParserException {
+		char c = parser.getSource().getChar(nextIndex);
+		nextIndex--;
+		backwardSeekNext();
+		return c;
+	}
+
+	/**
+	 * Skips to previous index
+	 */
+	private void backwardSeekNext() {
+		// Skips over the excluded area if the index enters one
+		boolean didSkip;
+		SourceDocumentInterface source = parser.getSource();
+		try {
+			do {
+				didSkip = false;
+				if (nextIndex <= nextExcludedEnd - 1) {
+					// Skips if applicable. Otherwise just updates the next
+					// excluded
+					// area variables
+					if (isExcluded()) {
+						nextIndex = nextExcludedStart - 1;
+					}
+					updateExcludedIndex();
+				}
+				if ((flags & SourceParser.SKIP_WHITE_SPACES) != 0) {
+					boolean wspFound = true;
+					do {
+						// If a white space is skipped, the excluded area check
+						// needs to be done again. didSkip flag controls that
+						if (nextIndex >= 0
+								&& Character.isWhitespace(source
+										.getChar(nextIndex))) {
+							nextIndex--;
+							didSkip = true;
+						} else {
+							wspFound = false;
+						}
+					} while (wspFound);
+				}
+			} while (didSkip);
+		} catch (SourceParserException e) {
+			// The exception must not be thrown out of this function
+		}
+	}
+
+	/**
+	 * Updates the excluded area index
+	 */
+	private void updateExcludedIndex() {
+		if ((flags & SourceParser.BACKWARD_SEARCH) == 0) {
+			nextExcludedIndex++;
+		} else {
+			nextExcludedIndex--;
+		}
+		// Updates the values using the next excluded area
+		if (nextExcludedIndex >= 0
+				&& nextExcludedIndex < parser.getExcludedAreas().size()) {
+			SourceExcludedArea p = parser.getExcludedAreas().get(
+					nextExcludedIndex);
+			nextExcludedStart = p.getOffset();
+			nextExcludedEnd = p.getOffset() + p.getLength();
+			nextExcludedAreaType = p.getType();
+		} else {
+			nextExcludedStart = -1;
+			nextExcludedEnd = -1;
+		}
+	}
+
+	/**
+	 * Returns the index where the next character will be fetched
+	 * 
+	 * @return the index
+	 */
+	public int nextIndex() {
+		return nextIndex;
+	}
+
+	/**
+	 * Gets the index of the character returned by last call to next
+	 * 
+	 * @return the index
+	 */
+	public int currentIndex() {
+		return currentIndex;
+	}
+
+	/**
+	 * Gets the index that preceeded the latest call to next
+	 * 
+	 * @return the index
+	 */
+	public int previousIndex() {
+		return previousIndex;
+	}
+
+	/**
+	 * Gets the next character but does not move the iterator
+	 * 
+	 * @return the next character
+	 * @throws SourceParserException
+	 *             if there are no more characters
+	 */
+	public char peek() throws SourceParserException {
+		return parser.getSource().getChar(nextIndex);
+	}
+
+	/**
+	 * Determines if the iterator skipped over characters during last call to
+	 * next
+	 * 
+	 * @return true if skipped, false otherwise
+	 */
+	public boolean hasSkipped() {
+		return (flags & SourceParser.BACKWARD_SEARCH) == 0 ? currentIndex > previousIndex + 1
+				: currentIndex < previousIndex - 1;
+	}
+
+	/**
+	 * Checks if the next area is skipped
+	 * 
+	 * @return true is skipped
+	 */
+	private boolean isExcluded() {
+		return isExcluded(nextExcludedAreaType);
+	}
+
+	/**
+	 * Checks if the given type is skipped
+	 * 
+	 * @param type
+	 *            the type
+	 * @return true is skipped
+	 */
+	private boolean isExcluded(int type) {
+		return SourceParser.isExcluded(type, flags);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceLocation.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Represents a location in source
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Represents a location in source
+ * 
+ */
+public class SourceLocation extends SourceLocationBase {
+
+	/**
+	 * Location listeners
+	 */
+	private ArrayList<SourceLocationListener> locationListeners;
+
+	/**
+	 * Temporary array for callback purposes. Prevents concurrent modifications
+	 * if listeners are removed during a callback
+	 */
+	private ArrayList<SourceLocationListener> tempListeners;
+
+	/**
+	 * Reference count
+	 */
+	private int refCount = 0;
+
+	/**
+	 * Listener change flag
+	 */
+	private boolean listenersChanged = true;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param parser
+	 *            the parser owning this location
+	 * @param offset
+	 *            offset of location
+	 * @param length
+	 *            length of location
+	 */
+	public SourceLocation(SourceParser parser, int offset, int length) {
+		super(parser, offset, length);
+		parser.addLocation(this);
+		refCount = 1;
+	}
+
+	/**
+	 * Gets the name of the class which owns this location
+	 * 
+	 * @return the class name
+	 */
+	public String getClassName() {
+		String retval = null;
+		if (getParser() != null) {
+			SourceContext context = getParser().getContext(getOffset());
+			if (context != null) {
+				retval = context.getClassName();
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets the name of function which owns this location
+	 * 
+	 * @return the function name
+	 */
+	public String getFunctionName() {
+		String retval = null;
+		if (getParser() != null) {
+			SourceContext context = getParser().getContext(getOffset());
+			if (context != null) {
+				retval = context.getFunctionName();
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Adds a location listener to this location
+	 * 
+	 * @param listener
+	 *            the location listener
+	 */
+	public void addLocationListener(SourceLocationListener listener) {
+		if (locationListeners == null) {
+			locationListeners = new ArrayList<SourceLocationListener>();
+		}
+		locationListeners.add(listener);
+		listenersChanged = true;
+	}
+
+	/**
+	 * Removes a location listener from this location
+	 * 
+	 * @param listener
+	 *            the location listener
+	 */
+	public void removeLocationListener(SourceLocationListener listener) {
+		if (locationListeners != null) {
+			if (locationListeners.remove(listener)) {
+				listenersChanged = true;
+			}
+		}
+	}
+
+	/**
+	 * Gets the listener interfaces
+	 * 
+	 * @return the listeners
+	 */
+	protected Iterator<SourceLocationListener> getListeners() {
+		List<SourceLocationListener> list;
+		if (locationListeners != null) {
+			if (listenersChanged) {
+				listenersChanged = false;
+				if (tempListeners == null) {
+					tempListeners = new ArrayList<SourceLocationListener>();
+				}
+				tempListeners.clear();
+				tempListeners.addAll(locationListeners);
+			}
+			list = tempListeners;
+		} else {
+			list = Collections.emptyList();
+		}
+		return list.iterator();
+	}
+
+	/**
+	 * Increases the reference count of this location.
+	 * 
+	 * @see #dereference()
+	 */
+	public void reference() {
+		refCount++;
+	}
+
+	/**
+	 * Decrements the reference count of this location. When reference count is
+	 * 0, this is removed from source. Note that a location can also be removed
+	 * from source even if it has outstanding references left. In that case it
+	 * can no longer be selected.
+	 */
+	public void dereference() {
+		if (--refCount <= 0) {
+			removeFromSource();
+		}
+	}
+
+	/**
+	 * Removes this location from the source
+	 */
+	private void removeFromSource() {
+		delete();
+		if (getParser() != null) {
+			getParser().removeLocation(this);
+			resetParser();
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceLocationBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,215 @@
+/*
+* 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:
+*
+* Base class for locations
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Base class for locations
+ * 
+ */
+public class SourceLocationBase {
+
+	/**
+	 * Source parser
+	 */
+	private SourceParser parser;
+
+	/**
+	 * Position abstraction
+	 */
+	private SourceLocationInterface position;
+
+	/**
+	 * Line number is cached and updated when changes occur
+	 */
+	private int currentLine = -1;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param parser
+	 *            the source parser
+	 * @param offset
+	 *            the offset to the location
+	 */
+	protected SourceLocationBase(SourceParser parser, int offset) {
+		this.parser = parser;
+		position = parser.getDocumentFramework()
+				.createLocation(this, offset, 0);
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param parser
+	 *            the source parser
+	 * @param offset
+	 *            the offset to the location
+	 * @param length
+	 *            the location length
+	 */
+	protected SourceLocationBase(SourceParser parser, int offset, int length) {
+		this.parser = parser;
+		position = parser.getDocumentFramework().createLocation(this, offset,
+				length);
+	}
+
+	/**
+	 * Gets the offset
+	 * 
+	 * @return offset
+	 */
+	public final int getOffset() {
+		return position.getOffset();
+	}
+
+	/**
+	 * Sets the offset
+	 * 
+	 * @param offset
+	 *            new offset
+	 */
+	public final void setOffset(int offset) {
+		position.setOffset(offset);
+	}
+
+	/**
+	 * Gets the length
+	 * 
+	 * @return length
+	 */
+	public final int getLength() {
+		return position.getLength();
+	}
+
+	/**
+	 * Sets the length
+	 * 
+	 * @param length
+	 *            the length
+	 */
+	public final void setLength(int length) {
+		position.setLength(length);
+	}
+
+	/**
+	 * Returns deleted flag
+	 * 
+	 * @return the flag
+	 */
+	public final boolean isDeleted() {
+		return position.isDeleted();
+	}
+
+	/**
+	 * Sets the deleted flag
+	 */
+	public final void delete() {
+		position.delete();
+	}
+
+	/**
+	 * Gets the location interface
+	 * 
+	 * @return the location interface
+	 */
+	final SourceLocationInterface getLocation() {
+		return position;
+	}
+
+	/**
+	 * Gets the source parser
+	 * 
+	 * @return the parser
+	 */
+	public SourceParser getParser() {
+		return parser;
+	}
+
+	/**
+	 * Resets the source parser
+	 */
+	protected void resetParser() {
+		parser = null;
+	}
+
+	/**
+	 * Gets the line number of this location
+	 * 
+	 * @return line number
+	 */
+	public int getLineNumber() {
+		// Line number is set to -1 when notifyUpdate is called
+		if (parser != null) {
+			if (currentLine == -1) {
+				currentLine = parser.getLineNumber(getOffset());
+			}
+		} else {
+			currentLine = -1;
+		}
+		return currentLine;
+	}
+
+	/**
+	 * Resets the line number
+	 */
+	protected void resetLineNumber() {
+		currentLine = -1;
+	}
+
+	/**
+	 * Gets the source file name
+	 * 
+	 * @return the file name
+	 */
+	public String getFileName() {
+		String retval = null;
+		if (parser != null) {
+			SourceDocumentInterface owner = parser.getSource();
+			if (owner != null) {
+				SourcePropertyProvider propertyProvider = owner
+						.getPropertyProvider();
+				if (propertyProvider != null) {
+					retval = propertyProvider.getFileName();
+				}
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets the source file path
+	 * 
+	 * @return the path
+	 */
+	public String getFilePath() {
+		String retval = null;
+		if (parser != null) {
+			SourceDocumentInterface owner = parser.getSource();
+			if (owner != null) {
+				SourcePropertyProvider propertyProvider = owner
+						.getPropertyProvider();
+				if (propertyProvider != null) {
+					retval = propertyProvider.getFilePath();
+				}
+			}
+		}
+		return retval;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceLocationInterface.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,69 @@
+/*
+* 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:
+*
+* Interface which abstracts the underlying position framework
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Interface which abstracts the underlying position framework
+ * 
+ */
+public interface SourceLocationInterface {
+
+	/**
+	 * Gets the offset of the location
+	 * 
+	 * @return the offset
+	 */
+	int getOffset();
+
+	/**
+	 * Sets the offset
+	 * 
+	 * @param offset
+	 *            the new offset
+	 */
+	void setOffset(int offset);
+
+	/**
+	 * Gets the length of the location
+	 * 
+	 * @return the length
+	 */
+	int getLength();
+
+	/**
+	 * Sets the length
+	 * 
+	 * @param length
+	 *            the length
+	 */
+	void setLength(int length);
+
+	/**
+	 * Checks if the location has been deleted
+	 * 
+	 * @return true if deleted
+	 */
+	boolean isDeleted();
+
+	/**
+	 * Marks the location as deleted
+	 */
+	void delete();
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceLocationListener.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Listener for source locations
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import com.nokia.tracecompiler.engine.TraceLocation;
+
+/**
+ * Listener for source locations
+ * 
+ */
+public interface SourceLocationListener {
+
+	/**
+	 * Notification that location validity has changed
+	 * 
+	 * @param location
+	 *            the location that changed
+	 */
+	public void locationValidityChanged(TraceLocation location);	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceParameter.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,238 @@
+/*
+* 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:
+*
+* Representation of a parameter parsed from source
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import java.util.ArrayList;
+
+/**
+ * Representation of a parameter parsed from source
+ * 
+ */
+public class SourceParameter implements ParsedType {
+
+	/**
+	 * Parameter qualifiers
+	 */
+	private ArrayList<String> qualifiers;
+
+	/**
+	 * Parameter type
+	 */
+	private String type;
+
+	/**
+	 * Parameter name
+	 */
+	private String name;
+
+	/**
+	 * Flag specifying if parameter is reference
+	 */
+	private boolean isReference;
+
+	/**
+	 * Number of pointers in parameter
+	 */
+	private int pointerCount;
+
+	/**
+	 * The location of this parameter in source
+	 */
+	private SourceLocation location;
+
+	/**
+	 * Gets the parameter type
+	 * 
+	 * @return the type
+	 */
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * Gets the parameter name or null if parameter does not have a name
+	 * 
+	 * @return the name
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Checks if parameter is pointer (*) or pointer reference (*&)
+	 * 
+	 * @return true if pointer, false if not
+	 */
+	public boolean isPointer() {
+		return pointerCount > 0;
+	}
+
+	/**
+	 * Gets the number of pointers
+	 * 
+	 * @return the number of pointers
+	 */
+	public int getPointerCount() {
+		return pointerCount;
+	}
+
+	/**
+	 * Checks if a parameter is referece (&) or pointer reference (*&)
+	 * 
+	 * @return true if reference, false if not
+	 */
+	public boolean isReference() {
+		return isReference;
+	}
+
+	/**
+	 * Checks if paraemter is pointer (*), but not pointer reference (*&). Equal
+	 * to isPointer() && !isReference()
+	 * 
+	 * @return true if pointer, but not reference
+	 */
+	public boolean isPlainPointer() {
+		return pointerCount > 0 && !isReference;
+	}
+
+	/**
+	 * Checks if parameter is reference (&), but not pointer reference (*&).
+	 * Equal to !isPointer() && isReference()
+	 * 
+	 * @return true if reference to value
+	 */
+	public boolean isPlainReference() {
+		return pointerCount == 0 && isReference;
+	}
+
+	/**
+	 * Checks if parameter is a reference to a pointer (*&). Equal to
+	 * isPointer() && isReference()
+	 * 
+	 * @return true if reference to a pointer
+	 */
+	public boolean isPointerReference() {
+		return pointerCount > 0 && isReference;
+	}
+
+	/**
+	 * Checks if parameter is pointer (*) or reference (&). Equal to isPointer() ||
+	 * isReference()
+	 * 
+	 * @return true if pointer or reference
+	 */
+	public boolean isPointerOrReference() {
+		return pointerCount > 0 || isReference;
+	}
+
+	/**
+	 * Checks if parameter type equals given type
+	 * 
+	 * @param type
+	 *            the type to be checked
+	 * @return true if types match
+	 */
+	public boolean typeEquals(String type) {
+		return this.type != null && type != null && this.type.equals(type);
+	}
+
+	/**
+	 * Returns the source reference of this parameter
+	 * 
+	 * @return the source reference
+	 */
+	public SourceLocation getSourceLocation() {
+		return location;
+	}
+
+	/**
+	 * Sets the parameter type
+	 * 
+	 * @param type
+	 *            the new type
+	 */
+	void setType(String type) {
+		this.type = type;
+	}
+
+	/**
+	 * Sets the parameter name
+	 * 
+	 * @param name
+	 *            the new name
+	 */
+	void setName(String name) {
+		this.name = name;
+	}
+
+	/**
+	 * Sets the reference flag
+	 */
+	void setReference() {
+		isReference = true;
+	}
+
+	/**
+	 * Increments the pointer count
+	 */
+	void addPointer() {
+		pointerCount++;
+	}
+
+	/**
+	 * Adds a qualifier to this parameter
+	 * 
+	 * @param type
+	 *            the qualifier type
+	 */
+	void addQualifier(String type) {
+		if (qualifiers == null) {
+			qualifiers = new ArrayList<String>();
+		}
+		qualifiers.add(type);
+	}
+
+	/**
+	 * Sets the source location of this parameter
+	 * 
+	 * @param location
+	 *            the location
+	 */
+	void setSourceLocation(SourceLocation location) {
+		this.location = location;
+	}
+
+	/**
+	 * Checks if a qualifier exists
+	 * 
+	 * @param qualifier
+	 *            the qualifier to be checked
+	 * @return true if it exists
+	 */
+	public boolean hasQualifier(String qualifier) {
+		boolean retval;
+		if (qualifiers != null) {
+			retval = qualifiers.contains(qualifier);
+		} else {
+			retval = false;
+		}
+		return retval;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceParameterTokenizer.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,440 @@
+/*
+* Copyright (c) 2010 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:
+*
+* Parameter tokenizer is used to parse function parameters lists
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import java.util.List;
+
+/**
+ * Parameter tokenizer is used to parse function parameters lists
+ * 
+ */
+public class SourceParameterTokenizer {
+
+	/**
+	 * The source parser
+	 */
+	private SourceParser parser;
+
+	/**
+	 * The offset where to start the tokenizer
+	 */
+	private int offset;
+
+	/**
+	 * Slip next whitespace
+	 */
+	private boolean skipNextWhiteSpace;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param parser
+	 *            the source parser
+	 * @param offset
+	 *            offset to the start of parameter
+	 */
+	public SourceParameterTokenizer(SourceParser parser, int offset) {
+		this.parser = parser;
+		this.offset = offset;
+	}
+
+	/**
+	 * Parses a list of parameters (a, b, c) and stores the values into the
+	 * given list.
+	 * 
+	 * @param list
+	 *            the list of parameters
+	 * @param findSeparator
+	 *            if true, the processing stops after ';' or '{' character. If
+	 *            false, processing stops after ')' at end of parameters
+	 * @return index at end of parameters
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	public int tokenize(List<String> list, boolean findSeparator)
+			throws SourceParserException {
+		TokenizerSearchData data = new TokenizerSearchData();
+		data.itr = parser.createIterator(offset, SourceParser.SKIP_WHITE_SPACES
+				| SourceParser.SKIP_COMMENTS);
+		boolean bracketsOpened = false;
+		boolean finished = false;
+		while (data.itr.hasNext() && !finished) {
+			data.value = data.itr.next();
+			if (!data.inQuotes && data.value == '\"') {
+				data.inQuotes = true;
+				data.hasData = true;
+			} else if (data.inQuotes) {
+				processInQuotesChar(data);
+			} else if (data.complete) {
+				processEndOfParametersChar(data);
+			} else if (data.value == '(') {
+				bracketsOpened = true;
+				processOpeningBracket(data);
+			} else if (data.value == ',' || data.value == ')') {
+				processCommaOrClosingBracket(list, data);
+			} else if (data.value == ';' && data.openBracketCount != 0 || data.value == '{'
+					|| data.value == '}' ) {
+				throw new SourceParserException(
+						SourceErrorCodes.UNEXPECTED_PARAMETER_SEPARATOR);
+			} else {
+				// Raises a flag that there is some data. processOpeningBracket
+				// no longer interprets the next bracket as opening bracket
+				if (data.openBracketCount > 0) {
+					data.hasData = true;
+				}
+			}
+			finished = ((data.complete && !findSeparator) || (data.endFound && findSeparator));
+			if (bracketsOpened && data.openBracketCount == 0) {
+				data.complete = true;
+				break;
+			}
+		}
+		if (!data.complete) {
+			throw new SourceParserException(
+					SourceErrorCodes.UNEXPECTED_END_OF_FILE);
+		}
+		if (data.openBracketCount != 0) {
+			throw new SourceParserException(SourceErrorCodes.BRACKET_MISMATCH);
+		}
+		
+		
+		return data.itr.currentIndex() + 1;
+	}
+
+	/**
+	 * Parses list of parameters with types (int a, int b, int c) and stores the
+	 * values into the given list.
+	 * 
+	 * @param list
+	 *            the list of parameters
+	 * @return index at end of parameters
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	public int tokenizeTyped(List<SourceParameter> list) 
+			throws SourceParserException {
+		TokenizerSearchData data = new TokenizerSearchData();
+
+		try {
+			data.itr = parser
+					.createIterator(offset, SourceParser.SKIP_WHITE_SPACES
+							| SourceParser.SKIP_COMMENTS);
+			data.sourceParameter = new SourceParameter();
+			while (data.itr.hasNext() && !data.complete) {
+				data.value = data.itr.next();
+
+				// Check if there was array start or end character and then
+				// space. It would mean that the parameter continues and more
+				// should be parsed.
+				if (skipNextWhiteSpace) {
+					skipNextWhiteSpace = false;
+					if (data.itr.hasSkipped()) {
+						data.value = data.itr.next();
+					}
+				}
+
+				if (data.value == '\"') {
+					throw new SourceParserException(
+							SourceErrorCodes.UNEXPECTED_QUOTE_CHARACTER);
+				} else if (data.value == '(') {
+					processOpeningBracket(data);
+				} else if (data.value == ',' || data.value == ')') {
+					processCommaOrClosingBracket(list, data);
+				} else if (data.value == ';' || data.value == '{'
+						|| data.value == '}') {
+					data.complete = true;
+					// Array start or end character.
+				} else if (data.value == '<' || data.value == '>') {
+					skipNextWhiteSpace = true;
+				} else if (data.itr.hasSkipped() && data.openBracketCount > 0) {
+					processNameValueSeparator(data);
+				}
+			}
+			if (!data.complete) {
+				throw new SourceParserException(
+						SourceErrorCodes.UNEXPECTED_END_OF_FILE);
+			}
+		} catch (SourceParserException e) {
+			// Resets all source locations if parser fails
+			for (int i = 0; i < list.size(); i++) {
+				list.get(i).getSourceLocation().dereference();
+			}
+			throw e;
+		}
+		return data.itr.currentIndex() + 1;
+	}
+
+	/**
+	 * Processes a separator character and updates the current SourceParameter
+	 * object in the search data
+	 * 
+	 * @param data
+	 *            the search data
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private void processNameValueSeparator(TokenizerSearchData data)
+			throws SourceParserException {
+		// If the parameter is empty, the previous index will point
+		// to index preceeding tagStartIndex
+		int previous = data.itr.previousIndex();
+		if (previous >= data.tagStartIndex) {
+			int endIndex = previous + 1;
+			if (data.sourceParameter.getType() == null) {
+				processNameValueSeparatorNoType(data, endIndex);
+			} else if (data.sourceParameter.getName() == null) {
+				processNameValueSeparatorNoName(data, endIndex);
+			}
+			data.tagStartIndex = data.itr.currentIndex();
+		}
+	}
+
+	/**
+	 * Processes a name-value separator when there is no name
+	 * 
+	 * @param data
+	 *            the search data
+	 * @param endIndex
+	 *            the end index of the parameters
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private void processNameValueSeparatorNoName(TokenizerSearchData data,
+			int endIndex) throws SourceParserException {
+		String name = parser.getSource().get(data.tagStartIndex,
+				endIndex - data.tagStartIndex);
+		boolean startFound = false;
+		int start = 0;
+		int end = name.length();
+		for (int i = 0; i < name.length(); i++) {
+			char c = name.charAt(i);
+			if (c == '&' || c == '*') {
+				if (c == '&') {
+					data.sourceParameter.setReference();
+				} else {
+					data.sourceParameter.addPointer();
+				}
+				if (!startFound) {
+					start++;
+				} else {
+					end--;
+				}
+			} else {
+				startFound = true;
+			}
+		}
+		name = name.substring(start, end);
+		if (name.length() > 0) {
+			if (isParameterTypeQualifier(name)) {
+				// Qualifiers between type and name are ignored
+				// For example TInt const* aValue
+			} else {
+				data.sourceParameter.setName(name);
+			}
+		}
+	}
+
+	/**
+	 * Processes a name-value separator when there is no value
+	 * 
+	 * @param data
+	 *            the search data
+	 * @param endIndex
+	 *            the end index of the parameters
+	 * @throws SourceParserException
+	 *             if processing fails
+	 */
+	private void processNameValueSeparatorNoType(TokenizerSearchData data,
+			int endIndex) throws SourceParserException {
+		String type = parser.getSource().get(data.tagStartIndex,
+				endIndex - data.tagStartIndex);
+		if (isParameterTypeQualifier(type)) {
+			data.sourceParameter.addQualifier(type);
+		} else {
+			for (int i = type.length() - 1; i >= 0; i--) {
+				if (type.charAt(i) == '&') {
+					data.sourceParameter.setReference();
+					if (i == 0) {
+						type = ""; //$NON-NLS-1$
+					}
+				} else if (type.charAt(i) == '*') {
+					data.sourceParameter.addPointer();
+					if (i == 0) {
+						type = ""; //$NON-NLS-1$
+					}
+				} else {
+					if (i != type.length() - 1) {
+						type = type.substring(0, i + 1);
+					}
+					i = -1;
+				}
+			}
+			if (type.length() > 0) {
+				// Remove spaces
+				type = type.replace(" ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+				data.sourceParameter.setType(type);
+			}
+		}
+	}
+
+	/**
+	 * Checks if parameter type if a qualifier or not
+	 * 
+	 * @param type
+	 *            the type to be checked
+	 * @return true if qualifier, false if not
+	 */
+	private boolean isParameterTypeQualifier(String type) {
+		boolean retval = false;
+		for (String element : SourceConstants.PARAMETER_QUALIFIERS) {
+			if (type.equals(element)) {
+				retval = true;
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Processes a parameter separator or closing bracket
+	 * 
+	 * @param list
+	 *            the list of existing parameters
+	 * @param data
+	 *            the search data
+	 * @throws SourceParserException
+	 *             if invalid character is encountered
+	 */
+	@SuppressWarnings("unchecked")
+	private void processCommaOrClosingBracket(List list,
+			TokenizerSearchData data) throws SourceParserException {
+		// This method is called from both tokenize functions. One uses
+		// List<String> and other List<SourceParameter>
+		// Thus this uses List and @SuppressWarnings
+		if (data.value == ')') {
+			data.openBracketCount--;
+		}
+		
+		if (data.value == ',') {
+			//we may have the case of OstTraceDef1( OST_TRACE_CATEGORY_ALL, TRACE_FATAL, TEST_OstTraceDef1, "EOstTraceDef1 - %u" , f(a,b));
+			//when processing the comma in f(a,b) that should not count as parameter separator
+			if (data.openBracketCount >1 ) {
+				return;
+			}
+		}
+		
+		if (data.value == ',' || data.openBracketCount == 0) {
+			//we have another parameter
+			if (data.sourceParameter != null) {
+				// If processing typed parameter list, the name and type are
+				// stored into a SourceParameter object, which is then added
+				// to list
+				processNameValueSeparator(data);
+				if (data.sourceParameter.getType() != null) {
+					SourceLocation location = new SourceLocation(parser,
+							data.paramStartIndex, data.itr.currentIndex()
+									- data.paramStartIndex);
+					data.sourceParameter.setSourceLocation(location);
+					list.add(data.sourceParameter);
+					data.sourceParameter = new SourceParameter();
+				}
+			} else {
+				// In this case the list contains strings.
+				int previous = data.itr.previousIndex();
+				String tracepoint = ""; //$NON-NLS-1$
+				if (previous >= data.tagStartIndex) {
+					int endIndex = data.itr.previousIndex() + 1;
+					tracepoint = parser.getSource().get(data.tagStartIndex,
+							endIndex - data.tagStartIndex);
+					list.add(tracepoint);
+				} else {
+					list.add(tracepoint);
+				}	
+			}
+			
+			// In case like below we have parsed all parameters and data is completed if next character after ')' is ':' 
+			// and open bracket count is 0:
+			// 		CNpeSendData::CNpeSendData(RMeDriver* aDriver, TUint16 aMaxMsgLength): CActive(EPriorityStandard),
+			//				iDriver(aDriver),
+			//				iMaxMsgLength(aMaxMsgLength)
+			if (data.itr.hasNext()){
+				char nextChar = data.itr.peek();
+				
+				if (data.value == ')' &&  nextChar == ':' && data.openBracketCount == 0) {
+					data.complete = true;
+				}
+			}
+			
+			if (data.value == ',') {
+				data.tagStartIndex = data.itr.nextIndex();
+				data.paramStartIndex = data.tagStartIndex;
+			}
+		}
+	}
+
+	/**
+	 * Processes an opening bracket
+	 * 
+	 * @param data
+	 *            the search data
+	 */
+	private void processOpeningBracket(TokenizerSearchData data) {
+		data.openBracketCount++;
+		if (!data.hasData && data.openBracketCount == 1 ) {
+			// The number of initial '(' characters is stored. The
+			// parameters are assumed to end when the corresponding ')'
+			// character is encountered
+			data.tagStartIndex = data.itr.nextIndex();
+			data.paramStartIndex = data.tagStartIndex;
+			data.initialBracketCount = data.openBracketCount;
+		}
+	}
+
+	/**
+	 * Process a character when in quotes
+	 * 
+	 * @param data
+	 *            the search data
+	 */
+	private void processInQuotesChar(TokenizerSearchData data) {
+		if (data.value == '\"' && data.previousValue != '\\') {
+			data.inQuotes = false;
+		}
+		data.previousValue = data.value;
+	}
+
+	/**
+	 * Processes a character found after the closing bracket
+	 * 
+	 * @param data
+	 *            the data
+	 * @throws SourceParserException
+	 *             if invalid characters are found
+	 */
+	private void processEndOfParametersChar(TokenizerSearchData data)
+			throws SourceParserException {
+		if (data.value == ';' || data.value == '{') {
+			data.endFound = true;
+		} else if (data.value == ')') {
+			data.openBracketCount--;
+		} else if (!Character.isWhitespace(data.value)) {
+			throw new SourceParserException(SourceErrorCodes.BRACKET_MISMATCH);
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceParser.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,485 @@
+/*
+* Copyright (c) 2008-2010 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:
+*
+* Parser for C++ source files
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Parser for C++ source files. Commented and quoted areas are located during
+ * the construction of this object and those areas are excluded from the
+ * searches.
+ * 
+ */
+public class SourceParser {
+
+	/**
+	 * Skip white spaces. Does not apply to string searches
+	 */
+	public final static int SKIP_WHITE_SPACES = 0x01; // CodForChk_Dis_Magic
+
+	/**
+	 * Skip string areas
+	 */
+	public final static int SKIP_STRINGS = 0x02; // CodForChk_Dis_Magic
+
+	/**
+	 * Search / iterate backwards
+	 */
+	public final static int BACKWARD_SEARCH = 0x04; // CodForChk_Dis_Magic
+
+	/**
+	 * Ignore character case in string searches
+	 */
+	public final static int IGNORE_CASE = 0x08; // CodForChk_Dis_Magic
+
+	/**
+	 * Skip commented areas
+	 */
+	public final static int SKIP_COMMENTS = 0x10; // CodForChk_Dis_Magic
+
+	/**
+	 * Skip preprocessor definitions
+	 */
+	public final static int SKIP_PREPROCESSOR = 0x80; // CodForChk_Dis_Magic
+
+	/**
+	 * Match beginning of word flag
+	 */
+	public final static int MATCH_WORD_BEGINNING = 0x20; // CodForChk_Dis_Magic
+
+	/**
+	 * Match end of word flag
+	 */
+	public final static int MATCH_WORD_END = 0x40; // CodForChk_Dis_Magic
+
+	/**
+	 * Match whole word flag
+	 */
+	public final static int MATCH_WHOLE_WORD = MATCH_WORD_BEGINNING
+			| MATCH_WORD_END;
+
+	/**
+	 * Ignore all special areas during search
+	 */
+	public final static int SKIP_ALL = SKIP_WHITE_SPACES | SKIP_STRINGS
+			| SKIP_COMMENTS | SKIP_PREPROCESSOR;
+
+	/**
+	 * Data to be searched.
+	 */
+	private SourceDocumentInterface source;
+
+	/**
+	 * List of source locations
+	 */
+	private ArrayList<SourceLocation> locations;
+
+	/**
+	 * Document factory for creating locations
+	 */
+	private SourceDocumentFactory documentFactory;
+
+	/**
+	 * Excluded area parser
+	 */
+	private ExcludedAreaParser excludedAreaParser;
+
+	/**
+	 * Context area parser
+	 */
+	private ContextAreaParser contextAreaParser;
+
+	/**
+	 * Function return value parser
+	 */
+	private FunctionReturnValueParser returnValueParser;
+
+	/**
+	 * Creates a new parser for given data
+	 * 
+	 * @param factory
+	 *            the document factory
+	 * @param sourceData
+	 *            the source data
+	 */
+	public SourceParser(SourceDocumentFactory factory, String sourceData) {
+		this(factory, factory.createDocument(sourceData));
+	}
+
+	/**
+	 * Creates a source parser from source document
+	 * 
+	 * @param factory
+	 *            the document factory
+	 * @param source
+	 *            the source document
+	 */
+	public SourceParser(SourceDocumentFactory factory,
+			SourceDocumentInterface source) {
+		this.documentFactory = factory;
+		this.source = source;
+		excludedAreaParser = new ExcludedAreaParser(this);
+		contextAreaParser = new ContextAreaParser(this);
+		returnValueParser = new FunctionReturnValueParser(this);
+		try {
+			findExcludedAreas();
+		} catch (SourceParserException e) {
+		}
+	}
+
+	/**
+	 * Gets the source document
+	 * 
+	 * @return the source
+	 */
+	public SourceDocumentInterface getSource() {
+		return source;
+	}
+
+	/**
+	 * Gets part of the source document data
+	 * 
+	 * @param start
+	 *            the start offset
+	 * @param length
+	 *            the data length
+	 * @return the data or null if offsets are not valid
+	 */
+	public String getData(int start, int length) {
+		String retval;
+		try {
+			retval = source.get(start, length);
+		} catch (SourceParserException e) {
+			retval = null;
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets a character at given offset
+	 * 
+	 * @param offset
+	 *            the offset
+	 * @return the character
+	 */
+	public char getData(int offset) {
+		char retval;
+		try {
+			retval = source.getChar(offset);
+		} catch (SourceParserException e) {
+			retval = '\0';
+		}
+		return retval;
+	}
+
+	/**
+	 * Gets the source document length
+	 * 
+	 * @return the source length
+	 */
+	public int getDataLength() {
+		return source.getLength();
+	}
+
+	/**
+	 * Gets the line number of given offset
+	 * 
+	 * @param offset
+	 *            the offset
+	 * @return the line number or -1 if offset is not valid
+	 */
+	public int getLineNumber(int offset) {
+		int retval;
+		try {
+			retval = source.getLineOfOffset(offset) + 1;
+		} catch (SourceParserException e) {
+			retval = -1;
+		}
+		return retval;
+	}
+
+	/**
+	 * Starts a new string search from given offset
+	 * 
+	 * @param searchString
+	 *            the string to be searched
+	 * @param startOffset
+	 *            the offset to start of search
+	 * @param endOffset
+	 *            the end of search or -1 to search the whole document
+	 * @param searchFlags
+	 *            the search flags
+	 * @return the search object
+	 */
+	public SourceStringSearch startStringSearch(String searchString,
+			int startOffset, int endOffset, int searchFlags) {
+		return new SourceStringSearch(this, searchString, startOffset,
+				endOffset, searchFlags);
+	}
+
+	/**
+	 * Tokenizes the parameter list starting from next bracket. White spaces are
+	 * discarded. For example (a, b , c ) returns { "a", "b", "c" }. This method
+	 * is independent of the current string search and thus can be used during
+	 * one.
+	 * 
+	 * @param startIndex
+	 *            the index where to start
+	 * @param list
+	 *            the list where the parameters are added
+	 * @param findSeparator
+	 *            if true, the processing stops after ';' or '{' character. If
+	 *            false, processing stops after ')' at end of parameters
+	 * @return the offset at end of the parameters
+	 * @throws SourceParserException
+	 *             if parameters are not valid
+	 */
+	public int tokenizeParameters(int startIndex, List<String> list,
+			boolean findSeparator) throws SourceParserException {
+		SourceParameterTokenizer tokenizer = new SourceParameterTokenizer(this,
+				startIndex);
+		return tokenizer.tokenize(list, findSeparator);
+	}
+
+	/**
+	 * Parses the parameter list of given source context. Each entry added into
+	 * the list will be an instance of SourceParameter class. This method is
+	 * independent of the current string search and thus can be used during one.
+	 * 
+	 * @param parameterIndex
+	 *            the index where to start
+	 * @param list
+	 *            the list where the parameters are added
+	 * @return the offset at end of the parameters
+	 * @throws SourceParserException
+	 *             if context is not valid
+	 */
+	public int parseFunctionParameters(int parameterIndex, List<SourceParameter> list)
+			throws SourceParserException {
+		SourceParameterTokenizer tokenizer = new SourceParameterTokenizer(this,
+				parameterIndex);
+		return tokenizer.tokenizeTyped(list);
+	}
+
+	/**
+	 * Parses the return values of given source context
+	 * 
+	 * @param context
+	 *            the context to be parsed
+	 * @param list
+	 *            the list of return values
+	 */
+	void parseReturnValues(SourceContext context, List<SourceReturn> list) {
+		returnValueParser.parseReturnValues(context, list);
+	}
+
+	/**
+	 * Checks if the offset if within an excluded area
+	 * 
+	 * @param offset
+	 *            the offset
+	 * @return true if in excluded area
+	 */
+	public boolean isInExcludedArea(int offset) {
+		return findExcludedAreaIndex(offset) >= 0;
+	}
+
+	/**
+	 * Gets an excluded area
+	 * 
+	 * @param offset
+	 *            the data offset
+	 * @return the area or null
+	 */
+	public SourceExcludedArea getExcludedArea(int offset) {
+		return excludedAreaParser.getArea(offset);
+	}
+
+	/**
+	 * Creates a new source iterator
+	 * 
+	 * @param offset
+	 *            the offset where to start
+	 * @param iteratorFlags
+	 *            the flags for the iterator
+	 * @return the new iterator
+	 */
+	public SourceIterator createIterator(int offset, int iteratorFlags) {
+		return new SourceIterator(this, offset, iteratorFlags);
+	}
+
+	/**
+	 * Returns the context at given offset. This parses the source if it has not
+	 * been parsed before.
+	 * 
+	 * @param offset
+	 *            the offset to the source data
+	 * @return the context at the offset or null if no context exists
+	 */
+	public SourceContext getContext(int offset) {
+		SourceContext retval;
+		try {
+			retval = contextAreaParser.parseAndGet(offset);
+		} catch (SourceParserException e) {
+			retval = null;
+		}
+		return retval;
+	}
+
+	/**
+	 * Locates the start-of-line starting from given offset
+	 * 
+	 * @param offset
+	 *            the offset
+	 * @param cancelIfNotWhitespace
+	 *            flag that tells to stop processing and return the original
+	 *            value if a non-whitespace is found before start of line
+	 * @param stayInContext
+	 *            flag that tells to stay within the context offset currently
+	 *            resides. If this would come out of the context, this locates
+	 *            the start of the next line following offset
+	 * @return the start-of-line
+	 * @throws SourceParserException
+	 *             if the offset is not valid
+	 */
+	public int findStartOfLine(int offset, boolean cancelIfNotWhitespace,
+			boolean stayInContext) throws SourceParserException {
+		int retval = offset == 0 ? offset : offset - 1;
+		for (int i = retval; i >= 0; i--) {
+			char c = source.getChar(i);
+			if (source.getChar(i) == '\n') {
+				retval = i + 1;
+				i = -1;
+			} else if (cancelIfNotWhitespace && !Character.isWhitespace(c)) {
+				retval = offset;
+				i = -1;
+			}
+		}
+		if (stayInContext) {
+			SourceContext context = getContext(offset);
+			if (context != null && retval < context.getOffset()) {
+				retval = context.getOffset();
+				int end = context.getOffset() + context.getLength();
+				for (int i = retval; i < end; i++) {
+					if (source.getChar(i) == '\n') {
+						retval = i + 1;
+						i = end;
+					}
+				}
+			}
+		}
+		return retval;
+	}
+
+	/**
+	 * Finds the array index of the excluded area which contains the offset. If
+	 * none of the areas contain the offset, returns negative integer indicating
+	 * the index of the excluded area following the offset
+	 * 
+	 * @param offset
+	 *            the offset to the data
+	 * @return the excluded area index
+	 */
+	int findExcludedAreaIndex(int offset) {
+		return excludedAreaParser.find(offset);
+	}
+
+	/**
+	 * Finds the excluded source file areas. Excluded areas include comments and
+	 * quoted strings. Overwrites possible old areas.
+	 * 
+	 * @throws SourceParserException
+	 *             if parser fails
+	 */
+	public void findExcludedAreas() throws SourceParserException {
+		excludedAreaParser.parseAll();
+	}
+
+	/**
+	 * Gets the list of excluded areas
+	 * 
+	 * @return the list
+	 */
+	public List<SourceExcludedArea> getExcludedAreas() {
+		return excludedAreaParser.getAreas();
+	}
+
+	/**
+	 * Checks if the area is excluded with given flags
+	 * 
+	 * @param type
+	 *            the area type
+	 * @param flags
+	 *            the flags
+	 * @return true if skipped
+	 */
+	static boolean isExcluded(int type, int flags) {
+		boolean string = ((flags & SKIP_STRINGS) != 0)
+				&& (type == SourceExcludedArea.STRING);
+		boolean comment = ((flags & SKIP_COMMENTS) != 0)
+				&& (type == SourceExcludedArea.MULTILINE_COMMENT);
+		boolean linecomment = ((flags & SKIP_COMMENTS) != 0)
+				&& (type == SourceExcludedArea.LINE_COMMENT);
+		boolean preProcessor = ((flags & SKIP_PREPROCESSOR) != 0)
+				&& (type == SourceExcludedArea.PREPROCESSOR_DEFINITION);
+		return string || comment || linecomment || preProcessor;
+	}
+
+	/**
+	 * Adds a location to this parser
+	 * 
+	 * @param location
+	 *            the location
+	 */
+	void addLocation(SourceLocation location) {
+		if (locations == null) {
+			locations = new ArrayList<SourceLocation>();
+		}
+		locations.add(location);
+		if (source != null) {
+			source.addLocation(location.getLocation());
+		}
+	}
+
+	/**
+	 * Removes a location from this parser
+	 * 
+	 * @param location
+	 *            the location to be removed
+	 */
+	void removeLocation(SourceLocation location) {
+		if (locations != null) {
+			locations.remove(location);
+		}
+		if (source != null) {
+			source.removeLocation(location.getLocation());
+		}
+	}
+
+	/**
+	 * Gets the document framework
+	 * 
+	 * @return the document framework
+	 */
+	public SourceDocumentFactory getDocumentFramework() {
+		return documentFactory;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceParserException.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,57 @@
+/*
+* 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:
+*
+* Exceptions thrown by source parser
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Exceptions thrown by source parser
+ * 
+ * @see SourceParser
+ */
+public class SourceParserException extends Exception {
+
+	/**
+	 * UID
+	 */
+	private static final long serialVersionUID = -2332983004093789880L; // CodForChk_Dis_Magic
+
+	/**
+	 * Error type
+	 */
+	private int errorType;
+
+	/**
+	 * Constructor with message and source object
+	 * 
+	 * @param errorType
+	 *            the error type
+	 */
+	public SourceParserException(int errorType) {
+		this.errorType = errorType;
+	}
+
+	/**
+	 * Gets the error type
+	 * 
+	 * @return the type
+	 */
+	public int getErrorType() {
+		return errorType;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourcePropertyProvider.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,42 @@
+/*
+* 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:
+*
+* Property provider for SourceLocation objects
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Property provider for SourceLocation objects
+ * 
+ */
+public interface SourcePropertyProvider {
+
+	/**
+	 * Gets a file name that can be shown in the UI when viewing a
+	 * SourceLocation
+	 * 
+	 * @return the source file name
+	 */
+	public String getFileName();
+
+	/**
+	 * Gets the path to the source file including the ending separator.
+	 * 
+	 * @return the path
+	 */
+	public String getFilePath();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceReturn.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,102 @@
+/*
+* 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:
+*
+* Properties of function return statement
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Properties of function return statement
+ * 
+ */
+public class SourceReturn extends SourceLocationBase {
+
+	/**
+	 * Previous character might cause a problem
+	 */
+	private boolean charHazard;
+
+	/**
+	 * The return statement itself might cause a problem
+	 */
+	private boolean tagHazard;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param parser
+	 *            the parser owning this location
+	 * @param offset
+	 *            the offset to the beginning of return statement
+	 * @param length
+	 *            the return statement length
+	 */
+	SourceReturn(SourceParser parser, int offset, int length) {
+		super(parser, offset, length);
+	}
+
+	/**
+	 * Gets the return statement
+	 * 
+	 * @return the statement
+	 */
+	public String getReturnStatement() {
+		String retval = ""; //$NON-NLS-1$
+		if (getParser() != null) {
+			retval = getParser().getData(getOffset(), getLength());
+		}
+		return retval;
+	}
+
+	/**
+	 * Sets a flag which indicates that the character preceeding the return
+	 * statement might cause problems when a trace is added prior to the return
+	 * statement
+	 */
+	void setPreviousCharHazard() {
+		this.charHazard = true;
+	}
+
+	/**
+	 * Gets the flag which indicates if the character preceeding the return
+	 * statement might cause problems when a trace is added prior to the return
+	 * statement
+	 * 
+	 * @return the flag
+	 */
+	public boolean hasPreviousCharHazard() {
+		return charHazard;
+	}
+
+	/**
+	 * Sets a flag which indicates that the return statement might cause
+	 * problems when duplicated to a trace
+	 */
+	void setTagHazard() {
+		tagHazard = true;
+	}
+
+	/**
+	 * Gets the flag which indicates if the return statement might cause
+	 * problems when duplicated to a trace
+	 * 
+	 * @return the flag
+	 */
+	public boolean hasTagHazard() {
+		return tagHazard;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceSearch.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Base class for source search classes
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import java.util.List;
+
+/**
+ * Base class for source search classes.
+ * 
+ */
+public abstract class SourceSearch {
+
+	/**
+	 * Source parser
+	 */
+	protected final SourceParser parser;
+
+	/**
+	 * Current index within data during search
+	 */
+	protected int searchIndex;
+
+	/**
+	 * End index for search
+	 */
+	protected int searchEnd;
+
+	/**
+	 * Index of the next excluded area during search.
+	 */
+	protected int searchExcludedIndex;
+
+	/**
+	 * Search flags
+	 */
+	protected int flags;
+
+	/**
+	 * Creates a new search
+	 * 
+	 * @param parser
+	 *            the parser containing the source
+	 * @param startOffset
+	 *            offset to the start of search
+	 * @param endOffset
+	 *            offset to end of search or -1 for rest of the document
+	 * @param flags
+	 *            search flags
+	 */
+	protected SourceSearch(SourceParser parser, int startOffset, int endOffset,
+			int flags) {
+		this.parser = parser;
+		this.flags = flags;
+		resetSearch(startOffset, endOffset);
+	}
+
+	/**
+	 * Resets the current search with a new offset
+	 * 
+	 * @param startOffset
+	 *            the offset to the start of search
+	 * @param endOffset
+	 *            offset to end of search or -1 for rest of the document
+	 */
+	public void resetSearch(int startOffset, int endOffset) {
+		searchIndex = startOffset;
+		searchEnd = endOffset == -1 ? parser.getDataLength() : endOffset;
+		// Calculates the starting position for the search based on the
+		// offset and excluded areas
+		int excluded = parser.findExcludedAreaIndex(startOffset);
+		if (excluded >= 0) {
+			SourceExcludedArea area = parser.getExcludedAreas().get(excluded);
+			searchIndex = area.getOffset() + area.getLength();
+			if (excluded < parser.getExcludedAreas().size() - 1) {
+				searchExcludedIndex = excluded + 1;
+			} else {
+				searchExcludedIndex = -1;
+			}
+		} else {
+			// If binarySearch returns < 0, startIndex was between some
+			// excluded areas.
+			searchExcludedIndex = -1 - excluded;
+			if (searchExcludedIndex > parser.getExcludedAreas().size()) {
+				searchExcludedIndex = -1;
+			}
+		}
+		skipNonExcludedAreas();
+	}
+
+	/**
+	 * Changes the index to point behind an excluded area if current index is
+	 * within one.
+	 */
+	protected void skipExcludedArea() {
+		// If data index is within an excluded area, it is moved to end of
+		// it and the next excluded area is selected
+		boolean changedExcludedArea;
+		do {
+			// If the excluded area changes, the flag is set and the next
+			// excluded area is also checked. Otherwise the excluded area index
+			// gets left behind if the search index jumps past multiple excluded
+			// areas
+			changedExcludedArea = false;
+			if (searchExcludedIndex >= 0
+					&& searchExcludedIndex < parser.getExcludedAreas().size()) {
+				SourceExcludedArea area = parser.getExcludedAreas().get(
+						searchExcludedIndex);
+				if (area.getOffset() <= searchIndex) {
+					// If the search offset has skipped past an excluded area,
+					// the index is not changed
+					if (area.getOffset() + area.getLength() > searchIndex) {
+						searchIndex = area.getOffset() + area.getLength();
+					}
+					searchExcludedIndex++;
+					skipNonExcludedAreas();
+					changedExcludedArea = true;
+				}
+			}
+		} while (changedExcludedArea);
+	}
+
+	/**
+	 * Skips past excluded areas which are not actually excluded due to flags
+	 */
+	private void skipNonExcludedAreas() {
+		if (searchExcludedIndex >= 0
+				&& searchExcludedIndex < parser.getExcludedAreas().size()) {
+			boolean notExcluded = true;
+			do {
+				// If an excluded area is not excluded due to flags,
+				// the excluded area index is moved past that area
+				SourceExcludedArea area = parser.getExcludedAreas().get(
+						searchExcludedIndex);
+				if (!SourceParser.isExcluded(area.getType(), flags)) {
+					searchExcludedIndex++;
+				} else {
+					notExcluded = false;
+				}
+			} while (notExcluded
+					&& searchExcludedIndex < parser.getExcludedAreas().size());
+		}
+	}
+
+	/**
+	 * Returns the next occurence
+	 * 
+	 * @return the index or -1
+	 */
+	public abstract int findNext();
+
+	/**
+	 * Finds all occurences
+	 * 
+	 * @param list
+	 *            the list where the data is stored
+	 * @throws SourceParserException
+	 *             if search fails
+	 */
+	public abstract void findAll(List<Integer> list)
+			throws SourceParserException;
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceSelector.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+* Selects an area from a source
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Selects an area from a source
+ * 
+ */
+public interface SourceSelector {
+
+	/**
+	 * Selects an area defined by given offset and length
+	 * 
+	 * @param offset
+	 *            the offset
+	 * @param length
+	 *            the length
+	 */
+	public void setSelection(int offset, int length);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceStringSearch.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,267 @@
+/*
+* 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:
+*
+* String search algorithm
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import java.util.List;
+
+/**
+ * String search algorithm
+ * 
+ */
+public class SourceStringSearch extends SourceSearch {
+
+	/**
+	 * String to be searched from the source.
+	 */
+	private String searchString;
+
+	/**
+	 * Number of different characters in source file alphabet. Assumes that
+	 * 8-bit encoding is used
+	 */
+	private final static int CHARACTER_COUNT = 256; // CodForChk_Dis_Magic
+
+	/**
+	 * Mask for bad character shifts (0xFF)
+	 */
+	private static final int BAD_CHARACTER_MASK = 0xFF; // CodForChk_Dis_Magic
+
+	/**
+	 * String search shifts.
+	 */
+	private int[] badCharacterShifts = new int[CHARACTER_COUNT];
+
+	/**
+	 * User data associated with search
+	 */
+	private Object searchData;
+
+	/**
+	 * Creates a new string search
+	 * 
+	 * @param parser
+	 *            the parser containing the source to be searched
+	 * @param searchString
+	 *            the string to be searched
+	 * @param startOffset
+	 *            offset to the start of search
+	 * @param endOffset
+	 *            offset to end of search or -1 for rest of the document
+	 * @param flags
+	 *            the search flags
+	 */
+	public SourceStringSearch(SourceParser parser, String searchString,
+			int startOffset, int endOffset, int flags) {
+		super(parser, startOffset, endOffset, flags);
+		setSearchString(searchString);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceSearch#findNext()
+	 */
+	@Override
+	public int findNext() {
+		try {
+			SourceDocumentInterface source = parser.getSource();
+			int stringIndex = searchString.length() - 1;
+			boolean found = false;
+			while (!found && searchIndex + stringIndex < searchEnd) {
+				char dataChar;
+				char searchChar;
+				boolean match = false;
+				do {
+					dataChar = source.getChar(searchIndex + stringIndex);
+					searchChar = searchString.charAt(stringIndex);
+					if ((flags & SourceParser.IGNORE_CASE) != 0) {
+						searchChar = Character.toLowerCase(searchChar);
+						dataChar = Character.toLowerCase(dataChar);
+					}
+					if (searchChar == '?' || searchChar == dataChar) {
+						match = true;
+						stringIndex--;
+					} else {
+						match = false;
+					}
+				} while (match && stringIndex >= 0);
+				// If string was not found, resets index and skips according
+				// to the shift table
+				if (stringIndex < 0) {
+					found = true;
+					// Checks the previous character if match beginning is set
+					if ((flags & SourceParser.MATCH_WORD_BEGINNING) != 0) {
+						if ((searchIndex > 0)
+								&& isPartOfWord(source.getChar(searchIndex - 1))) {
+							found = false;
+						}
+					}
+					// Checks the character after data if match end is set
+					if (found && ((flags & SourceParser.MATCH_WORD_END) != 0)) {
+						if (((searchIndex + searchString.length()) < source
+								.getLength())
+								&& isPartOfWord(source.getChar(searchIndex
+										+ searchString.length()))) {
+							found = false;
+						}
+					}
+				}
+				if (!found) {
+					int diff = searchString.length() - 1 - stringIndex;
+					stringIndex = searchString.length() - 1;
+					int skip;
+
+					if (dataChar > badCharacterShifts.length - 1) {
+						skip = 1;
+					} else {
+						skip = badCharacterShifts[dataChar] - diff;
+						if (skip <= 0) {
+							skip = 1;
+						}
+					}
+
+					searchIndex += skip;
+					skipExcludedArea();
+				}
+			}
+			if (!found) {
+				searchIndex = -1;
+			}
+		} catch (SourceParserException e) {
+			searchIndex = -1;
+		}
+		int ret = searchIndex;
+		if (searchIndex != -1) {
+			searchIndex += searchString.length();
+		}
+		return ret;
+	}
+
+	/**
+	 * Checks if the character is part of a word
+	 * 
+	 * @param c
+	 *            the character to be checked
+	 * @return true if part of word
+	 */
+	private boolean isPartOfWord(char c) {
+		return Character.isLetterOrDigit(c) || c == '_';
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceSearch#findAll(java.util.List)
+	 */
+	@Override
+	public void findAll(List<Integer> list) throws SourceParserException {
+		resetSearch(0, -1);
+		int index;
+		do {
+			index = findNext();
+			if (index > 0) {
+				list.add(new Integer(index));
+			}
+		} while (index > 0);
+	}
+
+	/**
+	 * Changes the search string
+	 * 
+	 * @param searchString
+	 *            the string to be searched
+	 */
+	public void setSearchString(String searchString) {
+		this.searchString = searchString;
+		int length = searchString.length();
+		// Elements not found in the string get the maximum shift distance
+		for (int i = 0; i < badCharacterShifts.length; i++) {
+			badCharacterShifts[i] = searchString.length();
+		}
+		// Characters of the search string are mapped into the
+		// shift distances array. If a character is found multiple
+		// times, the smallest shitft distance is stored
+		for (int i = 0; i < searchString.length() - 1; i++) {
+			if ((flags & SourceParser.IGNORE_CASE) != 0) {
+				badCharacterShifts[Character
+						.toLowerCase(searchString.charAt(i))
+						& BAD_CHARACTER_MASK] = length - i - 1;
+
+			} else {
+				badCharacterShifts[searchString.charAt(i) & BAD_CHARACTER_MASK] = length
+						- i - 1;
+			}
+		}
+	}
+
+	/**
+	 * Returns the search string
+	 * 
+	 * @return the string
+	 */
+	public String getSearchString() {
+		return searchString;
+	}
+
+	/**
+	 * Checks if the given string matches the search string
+	 * 
+	 * @param string
+	 *            the string
+	 * @return true if they match
+	 */
+	public boolean isSearchStringMatch(String string) {
+		int index = 0;
+		boolean match = true;
+		while (index < string.length() && match) {
+			char dataChar = string.charAt(index);
+			char searchChar = searchString.charAt(index);
+			if ((flags & SourceParser.IGNORE_CASE) != 0) {
+				searchChar = Character.toLowerCase(searchChar);
+				dataChar = Character.toLowerCase(dataChar);
+			}
+			if (searchChar == '?' || searchChar == dataChar) {
+				index++;
+			} else {
+				match = false;
+			}
+		}
+		return match;
+	}
+
+	/**
+	 * Sets the user variable associated with this searcher
+	 * 
+	 * @param data
+	 *            the variable
+	 */
+	public void setSearchData(Object data) {
+		searchData = data;
+	}
+
+	/**
+	 * Gets the user variable associated with this searcher
+	 * 
+	 * @return the variable
+	 */
+	public Object getSearchData() {
+		return searchData;
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceUtils.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,1146 @@
+/*
+* 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:
+*
+* Static utility functions related to source files
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.StringErrorParameters;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceConstantTable;
+import com.nokia.tracecompiler.model.TraceParameter;
+import com.nokia.tracecompiler.rules.ArrayParameterRule;
+
+/**
+ * Static utility functions related to source files
+ * 
+ */
+public class SourceUtils {
+
+	/**
+	 * Tag for array types
+	 */
+	private static final String ARRAY_TAG = "[]"; //$NON-NLS-1$
+
+	/**
+	 * Start tag for printf format specifier
+	 */
+	private static final String START_TAG = "%"; //$NON-NLS-1$
+
+	/**
+	 * Regular expression optional element tag
+	 */
+	private static final String OPTIONAL_TAG = "?"; //$NON-NLS-1$
+
+	/**
+	 * Optional parameter pattern. Quoted from Wikipedia:
+	 * 
+	 * <strong> Parameter can be omitted or can be: 'n$' Where n is the number
+	 * of the parameter to display using this format specifier, allowing the
+	 * parameters provided to be output multiple times, using varying format
+	 * specifiers or in different orders. This is a POSIX extension and not in
+	 * C99.</strong>
+	 * 
+	 * This has not been implemented -> Currently format specifier count must
+	 * match parameter count
+	 */
+	private final static String PARAMETER_PATTERN = "(\\d+\\$)"; //$NON-NLS-1$
+
+	/**
+	 * Optional flags pattern. Quoted from Wikipedia:
+	 * 
+	 * <strong> Flags can be zero or more (in any order) of:
+	 * <ul>
+	 * <li>'+' : Causes printf to always denote the sign '+' or '-' of a number
+	 * (the default is to omit the sign for positive numbers). Only applicable
+	 * to numeric types.
+	 * <li>'-' : Causes printf to left-align the output of this placeholder (the
+	 * default is to right-align the output).
+	 * <li>'#' : Alternate form. For 'g' and 'G', trailing zeros are not
+	 * removed. For 'f', 'F', 'e', 'E', 'g', 'G', the output always contains a
+	 * decimal point. For 'o', 'x', and 'X', a 0, 0x, and 0X, respectively, is
+	 * prepended to non-zero numbers.
+	 * <li>' ' : Causes printf to left-pad the output with spaces until the
+	 * required length of output is attained. If combined with '0' (see below),
+	 * it will cause the sign to become a space when positive, but the remaining
+	 * characters will be zero-padded
+	 * <li>'0' : Causes printf to use '0' (instead of spaces) to left fill a
+	 * fixed length field. For example (assume i = 3) printf("%2d", i) results
+	 * in " 3", while printf("%02d", i) results in "03"
+	 * </ul>
+	 * </strong>
+	 */
+	private final static String FLAGS_PATTERN = "([-+# 0])"; //$NON-NLS-1$
+
+	/**
+	 * Optional width pattern. Quoted from Wikipedia:
+	 * 
+	 * <strong>Width can be omitted or be any of:
+	 * <ul>
+	 * <li>a number : Causes printf to pad the output of this placeholder with
+	 * spaces until it is at least number characters wide. If number has a
+	 * leading '0', then padding is done with '0' characters.
+	 * <li>'*' : Causes printf to pad the output until it is n characters wide,
+	 * where n is an integer value stored in the a function argument just
+	 * preceding that represented by the modified type. For example
+	 * printf("%*d", 5, 10) will result in "10" being printed with a width of
+	 * 5.</strong>
+	 * </ul>
+	 * </strong>
+	 * 
+	 * '*' has not been implemented -> Currently format specifier count must
+	 * match parameter count
+	 */
+	private final static String WIDTH_PATTERN = "(\\d+|\\*)"; //$NON-NLS-1$
+
+	/**
+	 * Optional precision pattern. Quoted from Wikipedia:
+	 * 
+	 * Precision can be omitted or be any of: <strong>
+	 * <ul>
+	 * <li>a number : For non-integral numeric types, causes the decimal portion
+	 * of the output to be expressed in at least number digits. For the string
+	 * type, causes the output to be truncated at number characters.
+	 * <li>'*' : Same as the above, but uses an integer value in the intaken
+	 * argument to determine the number of decimal places or maximum string
+	 * length. For example, printf("%.*s", 3, "abcdef") will result in "abc"
+	 * being printed.
+	 * </ul>
+	 * </strong> If the precision is zero, nothing is printed for the
+	 * corresponding argument.
+	 * 
+	 * '*' has not been implemented -> Currently format specifier count must
+	 * match parameter count
+	 */
+	private final static String PRECISION_PATTERN = "(\\.(\\d+|\\*))"; //$NON-NLS-1$
+
+	/**
+	 * Optional length pattern. Quoted from Wikipedia:
+	 * 
+	 * Length can be omitted or be any of: <strong>
+	 * <ul>
+	 * <li>'hh' : For integer types, causes printf to expect an int sized
+	 * integer argument which was promoted from a char.
+	 * <li>'h' : For integer types, causes printf to expect a int sized integer
+	 * argument which was promoted from a short.
+	 * <li>'l' : (ell) For integer types, causes printf to expect a long sized
+	 * integer argument.
+	 * <li>'ll' : (ell ell) For integer types, causes printf to expect a long
+	 * long sized integer argument.
+	 * <li>'L' : For floating point types, causes printf to expect a long double
+	 * argument.
+	 * <li>'z' : For integer types, causes printf to expect a size_t sized
+	 * integer argument.
+	 * <li>'j' : For integer types, causes printf to expect a intmax_t sized
+	 * integer argument.
+	 * <li>'t' : For integer types, causes printf to expect a ptrdiff_t sized
+	 * integer argument.
+	 * </ul>
+	 * </strong>
+	 */
+	private final static String LENGTH_PATTERN = "([lh]?[hHlLZjt])"; //$NON-NLS-1$
+
+	/**
+	 * Type pattern. Quoted from Wikipedia:
+	 * 
+	 * <strong> type can be any of:
+	 * <ul>
+	 * <li>'d', 'i' : Print an int as a signed decimal number. '%d' and '%i' are
+	 * synonymous for output, but are different when used with scanf() for
+	 * input.
+	 * <li>'u' : Print decimal unsigned int.
+	 * <li>'f', 'F' : Print a double in normal (fixed-point) notation.
+	 * <li>'e', 'E' : Print a double value in standard form ([-]d.ddd
+	 * e[+/-]ddd).
+	 * <li>'g', 'G' : Print a double in either normal or exponential notation,
+	 * whichever is more appropriate for its magnitude. 'g' uses lower-case
+	 * letters, 'G' uses upper-case letters. This type differs slightly from
+	 * fixed-point notation in that insignificant zeroes to the right of the
+	 * decimal point are not included. Also, the decimal point is not included
+	 * on whole numbers.
+	 * <li>'x', 'X' : Print an unsigned int as a hexadecimal number. 'x' uses
+	 * lower-case letters and 'X' uses upper-case.
+	 * <li>'o' : Print an unsigned int in octal.
+	 * <li>'s' : Print a character string.
+	 * <li>'c' : Print a char (character).
+	 * <li>'p' : Print a void * (pointer to void) in an implementation-defined
+	 * format.
+	 * <li>'n' : Write number of characters successfully written so far into an
+	 * integer pointer parameter.
+	 * <li>'%' : Print a literal '%' character (this type doesn't accept any
+	 * flags, width, precision or length).
+	 * </ul>
+	 * </strong>
+	 * 
+	 * The pattern itself accepts all characters and the validity check is done
+	 * in {@link #mapFormatToParameterType mapFormatToType}
+	 */
+	private final static String TYPE_PATTERN = "([a-zA-Z%])"; //$NON-NLS-1$
+
+	/**
+	 * Regular expression pattern for printf
+	 * 
+	 * %[parameter][flags][width][.precision][length]type
+	 */
+	private static final String STANDARD_PRINTF_PATTERN = PARAMETER_PATTERN
+			+ OPTIONAL_TAG + FLAGS_PATTERN + OPTIONAL_TAG + WIDTH_PATTERN
+			+ OPTIONAL_TAG + PRECISION_PATTERN + OPTIONAL_TAG + LENGTH_PATTERN
+			+ OPTIONAL_TAG + TYPE_PATTERN;
+
+	/**
+	 * Regular expression pattern for Open System Trace printf extensions
+	 * %{Type}, %{Array[]}
+	 */
+	private static final String EXTENSION_PRINTF_PATTERN = "\\{[\\w_]+(\\[\\])?\\}"; //$NON-NLS-1$
+
+	/**
+	 * Regular expression pattern for printf
+	 */
+	public static final String PRINTF_PATTERN = START_TAG + "((" //$NON-NLS-1$
+			+ STANDARD_PRINTF_PATTERN + ")|(" //$NON-NLS-1$
+			+ EXTENSION_PRINTF_PATTERN + "))"; //$NON-NLS-1$
+
+	/**
+	 * The pattern for printf-formatted trace text
+	 */
+	public final static Pattern traceTextPattern = Pattern
+			.compile(PRINTF_PATTERN);
+
+	/**
+	 * The pattern for parameter length in printf specifier
+	 */
+	public final static Pattern lengthPattern = Pattern.compile(LENGTH_PATTERN);
+
+	/**
+	 * Hidden constructor
+	 */
+	private SourceUtils() {
+	}
+
+	/**
+	 * Creates a header guard
+	 * 
+	 * @param fileName
+	 *            the name of the file
+	 * @return the header guard
+	 */
+	public static String createHeaderGuard(String fileName) {
+		StringBuffer sb = new StringBuffer();
+		String uname = fileName.replace(SourceConstants.PERIOD_CHAR,
+				SourceConstants.UNDERSCORE_CHAR).toUpperCase();
+		sb.append(SourceConstants.IFNDEF);
+		sb.append(SourceConstants.SPACE);
+		sb.append(SourceConstants.DOUBLE_UNDERSCORE);
+		sb.append(uname);
+		sb.append(SourceConstants.DOUBLE_UNDERSCORE);
+		sb.append(SourceConstants.LINE_FEED);
+		sb.append(SourceConstants.DEFINE);
+		sb.append(SourceConstants.SPACE);
+		sb.append(SourceConstants.DOUBLE_UNDERSCORE);
+		sb.append(uname);
+		sb.append(SourceConstants.DOUBLE_UNDERSCORE);
+		return sb.toString();
+	}
+
+	/**
+	 * Checks the validity of name
+	 * 
+	 * @param name
+	 *            the name
+	 * @return true if valid
+	 */
+	public static boolean isValidName(String name) {
+		boolean retval;
+		if (name != null && name.length() > 0) {
+			retval = true;
+			if (!isValidNameStartChar(name.charAt(0))) {
+				retval = false;
+			} else {
+				for (int i = 1; i < name.length() && retval; i++) {
+					retval = isValidNameChar(name.charAt(i));
+				}
+			}
+		} else {
+			retval = false;
+		}
+		return retval;
+	}
+
+	/**
+	 * Checks the validity of parameter name
+	 * 
+	 * @param name
+	 *            the name
+	 * @return true if valid
+	 */
+	public static boolean isValidParameterName(String name) {
+		boolean retval;
+		if (name != null && name.length() > 0) {
+			retval = true;
+			if (!isValidNameStartChar(name.charAt(0))) {
+				retval = false;
+			} else {
+				for (int i = 1; i < name.length() && retval; i++) {
+
+					// Check validity of the character
+					char c = name.charAt(i);
+					retval = (isValidNameChar(c) || isValidSpecialChar(c));
+				}
+			}
+		} else {
+			retval = false;
+		}
+		return retval;
+	}
+
+	/**
+	 * Checks special character validity
+	 * 
+	 * @param c
+	 *            character
+	 * @return true if valid
+	 */
+	private static boolean isValidSpecialChar(char c) {
+		boolean retval = false;
+		// Check if the character is allowed
+		if (c == '.' || c == '-' || c == '>' || c == '(' || c == ')'
+				|| c == '[' || c == ']' || c == ' ' || c == '&' || c == '*') {
+			retval = true;
+		}
+		return retval;
+	}
+
+	/**
+	 * Checks start-of-name character validity
+	 * 
+	 * @param c
+	 *            character
+	 * @return true if valid
+	 */
+	private static boolean isValidNameStartChar(char c) {
+		// Ascii characters and underscore are allowed
+		return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A) // CodForChk_Dis_Magic
+				|| c == 0x5F; // CodForChk_Dis_Magic
+	}
+
+	/**
+	 * Checks name character validity
+	 * 
+	 * @param c
+	 *            character
+	 * @return true if valid
+	 */
+	private static boolean isValidNameChar(char c) {
+		// Numbers are allowed in addition to start characters
+		return isValidNameStartChar(c) || (c >= 0x30 && c <= 0x39); // CodForChk_Dis_Magic
+	}
+
+	/**
+	 * Maps a Symbian type to one of the TraceParameter types
+	 * 
+	 * @param parsedType
+	 *            the type parsed from source
+	 * @return the parameter type
+	 */
+	public static TypeMapping mapSymbianTypeToParameterType(
+			ParsedType parsedType) {
+		String type = null;
+		// The type map contains Symbian types
+		for (int i = 0; i < SymbianConstants.PARAMETER_TYPE_MAP.length
+				&& type == null; i++) {
+			if (parsedType
+					.typeEquals(SymbianConstants.PARAMETER_TYPE_MAP[i][0])) {
+				type = SymbianConstants.PARAMETER_TYPE_MAP[i][1];
+			}
+		}
+		if (type != null) {
+			if (parsedType.hasQualifier(SourceConstants.UNSIGNED)) {
+				type = convertToUnsigned(type);
+			}
+		}
+		TypeMapping retval = new TypeMapping(type);
+		if (type != null) {
+			// Value or a reference can be added to source as is
+			// Points needs to be cast to HEX32
+			if (parsedType.isPointer()) {
+				retval.type = TraceParameter.HEX32;
+				retval.needsCasting = true;
+			} else {
+				// TUint32 needs to be cast to TUint and TInt32 to TInt.
+				// Otherwise there will be some problems with extension
+				// headers
+				if (parsedType.typeEquals(SymbianConstants.TUINT32)
+						|| parsedType.typeEquals(SymbianConstants.TINT32)) {
+					retval.needsCasting = true;
+				}
+			}
+		} else if (parsedType.isPointer()) {
+			// Unrecognized pointer types are cast to Hex32
+			retval.type = TraceParameter.HEX32;
+			retval.needsCasting = true;
+		} else {
+			// Unrecognized value types are passed as pointer and cast to Hex32
+			retval.type = TraceParameter.HEX32;
+			retval.valueToPointer = true;
+			retval.needsCasting = true;
+		}
+		return retval;
+	}
+
+	/**
+	 * Maps the type of a parameter to a Symbian type
+	 * 
+	 * @param parameter
+	 *            the parameter
+	 * @return the parameter type as string
+	 */
+	public static String mapParameterTypeToSymbianType(TraceParameter parameter) {
+		String retval;
+		ArrayParameterRule rule = parameter
+				.getExtension(ArrayParameterRule.class);
+		String type = parameter.getType();
+		TraceConstantTable table = parameter.getModel()
+				.findConstantTableByName(type);
+		if (table != null) {
+			type = table.getType();
+		}
+		if (rule != null) {
+			retval = mapArrayTypeToSymbianType(type);
+		} else {
+			retval = mapBasicTypeToSymbianType(type);
+		}
+		return retval;
+	}
+
+	/**
+	 * Maps a basic parameter type to Symbian type
+	 * 
+	 * @param type
+	 *            the parameter type
+	 * @return the Symbian type
+	 */
+	public static String mapBasicTypeToSymbianType(String type) {
+		String retval;
+		// Unsigned and hex both use TUint types
+		// Signed uses TInt types
+		if (type.equals(TraceParameter.POINTER)) {
+			retval = SymbianConstants.CONST_TANY_PTR;
+		} else if (type.equals(TraceParameter.SDEC32)) {
+			retval = SymbianConstants.TINT;
+		} else if (type.equals(TraceParameter.UDEC32)
+				|| type.equals(TraceParameter.OCT32)
+				|| type.equals(TraceParameter.HEX32)) {
+			retval = SymbianConstants.TUINT;
+		} else if (type.equals(TraceParameter.SDEC16)) {
+			retval = SymbianConstants.TINT16;
+		} else if (type.equals(TraceParameter.UDEC16)
+				|| type.equals(TraceParameter.OCT16)
+				|| type.equals(TraceParameter.HEX16)) {
+			retval = SymbianConstants.TUINT16;
+		} else if (type.equals(TraceParameter.SDEC8)) {
+			retval = SymbianConstants.TINT8;
+		} else if (type.equals(TraceParameter.UDEC8)
+				|| type.equals(TraceParameter.OCT8)
+				|| type.equals(TraceParameter.HEX8)) {
+			retval = SymbianConstants.TUINT8;
+		} else if (type.equals(TraceParameter.SDEC64)
+				|| type.equals(TraceParameter.TIME)) {
+			retval = SymbianConstants.TINT64;
+		} else if (type.equals(TraceParameter.UDEC64)
+				|| type.equals(TraceParameter.OCT64)
+				|| type.equals(TraceParameter.HEX64)) {
+			retval = SymbianConstants.TUINT64;
+		} else if (type.equals(TraceParameter.ASCII)) {
+			retval = SymbianConstants.CONST_TDESC8_REF;
+		} else if (type.equals(TraceParameter.UNICODE)) {
+			retval = SymbianConstants.CONST_TDESC16_REF;
+		} else if (type.equals(TraceParameter.FLOAT_EXP)
+				|| type.equals(TraceParameter.FLOAT_FIX)
+				|| type.equals(TraceParameter.FLOAT_OPT)) {
+			retval = SymbianConstants.TREAL;
+		} else {
+			retval = SymbianConstants.TANY_PTR;
+		}
+		return retval;
+	}
+
+	/**
+	 * Maps an array parameter type to Symbian type
+	 * 
+	 * @param type
+	 *            the parameter type
+	 * @return the Symbian type
+	 */
+	public static String mapArrayTypeToSymbianType(String type) {
+		String basic = mapBasicTypeToSymbianType(type);
+		String retval = SourceConstants.OST_ARRAY_TYPE_PREFIX + basic
+				+ SourceConstants.OST_ARRAY_TYPE_POSTFIX;
+		return retval;
+	}
+
+	/**
+	 * Maps a format specifier into parameter type
+	 * 
+	 * @param formatSpecifier
+	 *            the format specifier
+	 * @return the parameter type or null if not recognized. If the type is one
+	 *         of the supported TraceParameter types, the string contains the
+	 *         integer value of the type
+	 * @throws TraceCompilerException
+	 *             if format specifier is not valid
+	 */
+	public static FormatMapping mapFormatToParameterType(String formatSpecifier)
+			throws TraceCompilerException {
+		String type;
+		boolean array = false;
+		boolean basic = false;
+		boolean extended = false;
+		int len = formatSpecifier.length();
+		// Extension format is checked first: %{x}
+		if (len > 3 && formatSpecifier.charAt(1) == '{' // CodForChk_Dis_Magic
+				&& formatSpecifier.charAt(len - 1) == '}') {
+			// Extension format can be an array: %{x[]}
+			// In that case it could also be a basic type
+			if (len > 3 + ARRAY_TAG.length() // CodForChk_Dis_Magic
+					&& formatSpecifier.charAt(len - 3) == '[' // CodForChk_Dis_Magic
+					&& formatSpecifier.charAt(len - 2) == ']') { // CodForChk_Dis_Magic
+				type = formatSpecifier.substring(2, len - 1 // CodForChk_Dis_Magic
+						- ARRAY_TAG.length());
+				array = true;
+				if (isStringType(type)) {
+					StringErrorParameters param = new StringErrorParameters();
+					param.string = type;
+					throw new TraceCompilerException(
+							TraceCompilerErrorCode.PARAMETER_FORMAT_NOT_SUPPORTED_IN_ARRAY,
+							param, null);
+				}
+			} else {
+				type = formatSpecifier.substring(2, len - 1); // CodForChk_Dis_Magic
+			}
+			extended = !isBasicType(type);
+		} else {
+			basic = true;
+			type = formatSpecifier;
+		}
+				
+		if (basic) {
+			type = mapBasicFormatToType(formatSpecifier);
+		}
+		if (type == null) {
+			StringErrorParameters params = new StringErrorParameters();
+			params.string = formatSpecifier;
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.PARAMETER_FORMAT_NOT_SUPPORTED,
+					params, null);
+		}
+		FormatMapping retval = new FormatMapping(type);
+		retval.isArray = array;
+		if (extended) {
+			// In case of extended types, a constant table can still be
+			// represented with normal trace macros.
+			TraceConstantTable table = TraceCompilerEngineGlobals.getTraceModel()
+					.findConstantTableByName(retval.type);
+			if (table != null) {
+				if (!array && isSimpleType(table.getType())) {
+					retval.isSimple = true;
+				}
+			} else {
+				// Extended type must be found from the property file
+				StringErrorParameters params = new StringErrorParameters();
+				params.string = formatSpecifier;
+				throw new TraceCompilerException(
+						TraceCompilerErrorCode.PARAMETER_FORMAT_NOT_SUPPORTED,
+						params, null);
+			}
+		} else if (!retval.isArray) {
+			retval.isSimple = isSimpleType(type);
+		}
+				
+		return retval;
+	}
+
+	/**
+	 * Maps basic format specifies to parameter type
+	 * 
+	 * @param formatSpecifier
+	 *            the format specifies
+	 * @return the type
+	 * @throws TraceCompilerException
+	 *             if mapping cannot be done
+	 */
+	private static String mapBasicFormatToType(String formatSpecifier)
+			throws TraceCompilerException { // CodForChk_Dis_ComplexFunc
+		String type;
+		int paramLength = SourceUtils
+				.mapFormatToParameterLength(formatSpecifier);
+		char formatChar = formatSpecifier.charAt(formatSpecifier.length() - 1);
+		switch (formatChar) {
+		case 'd':
+			type = SourceUtils.mapSignedToParameterType(paramLength);
+			break;
+		case 'x':
+		case 'X':
+			type = SourceUtils.mapHexToParameterType(paramLength);
+			break;
+		case 'u':
+			type = SourceUtils.mapUnsignedToParameterType(paramLength);
+			break;
+		case 'o':
+			type = SourceUtils.mapOctalToParameterType(paramLength);
+			break;
+		case 's':
+			type = TraceParameter.ASCII;
+			break;
+		case 'S': // Symbian extension
+			type = TraceParameter.UNICODE;
+			break;
+		case 'c':
+			type = TraceParameter.SDEC8;
+			break;
+		case 'p':
+			type = TraceParameter.POINTER;
+			break;
+		case 'f':
+		case 'F':
+			type = TraceParameter.FLOAT_FIX;
+			break;
+		case 'e':
+		case 'E':
+			type = TraceParameter.FLOAT_EXP;
+			break;
+		case 'g':
+		case 'G':
+			type = TraceParameter.FLOAT_OPT;
+			break;
+		default:
+			type = null;
+		}
+
+		return type;
+	}
+
+	/**
+	 * Maps a parameter type to format string
+	 * 
+	 * @param parameter
+	 *            the parameter
+	 * @return the format string
+	 */
+	public static String mapParameterTypeToFormat(TraceParameter parameter) {
+		String tag;
+		if (parameter.getExtension(ArrayParameterRule.class) != null) {
+			tag = mapArrayTypeToFormat(parameter.getType());
+		} else {
+			tag = mapNormalTypeToFormat(parameter.getType());
+		}
+		return tag;
+	}
+
+	/**
+	 * Maps an array type to basic type
+	 * 
+	 * @param arrayType
+	 *            the array type
+	 * @return the basic type or null if original type is not array type
+	 */
+	public static String mapArrayTypeToBasicType(String arrayType) {
+		String retval;
+		if (arrayType.endsWith(ARRAY_TAG)) {
+			retval = arrayType.substring(0, arrayType.length()
+					- ARRAY_TAG.length());
+		} else {
+			retval = null;
+		}
+		return retval;
+	}
+
+	/**
+	 * Parses a numeric value from source
+	 * 
+	 * @param number
+	 *            the number as string
+	 * @return the value
+	 */
+	public static int parseNumberFromSource(String number) {
+		int ret;
+		String low = number.toLowerCase();
+		int radix;
+		if (low.startsWith(SourceConstants.HEX_PREFIX)) {
+			radix = 16; // CodForChk_Dis_Magic
+			low = low.substring(SourceConstants.HEX_PREFIX.length());
+		} else if (low.startsWith(SourceConstants.OCTAL_PREFIX)
+				&& low.length() > SourceConstants.OCTAL_PREFIX.length()
+				&& Character.isDigit(low.charAt(SourceConstants.OCTAL_PREFIX
+						.length()))) {
+			radix = 8; // CodForChk_Dis_Magic
+			low = low.substring(SourceConstants.OCTAL_PREFIX.length());
+		} else {
+			radix = 10; // CodForChk_Dis_Magic
+		}
+		if (low.endsWith(SourceConstants.I64_POSTFIX)) {
+			low = low.substring(0, low.length()
+					- SourceConstants.I64_POSTFIX.length());
+		}
+		if (low.length() > 0) {
+			// Removes U / L characters from the end of value
+			int index = low.length() - 1;
+			boolean complete = false;
+			do {
+				char c = low.charAt(index);
+				if (c == 'u' || c == 'l') {
+					index--;
+				} else {
+					complete = true;
+				}
+			} while (!complete && index >= 0);
+			if (index < low.length() - 1 && index > 0) {
+				low = low.substring(0, index + 1);
+			}
+			ret = Integer.parseInt(low, radix);
+		} else {
+			ret = 0;
+		}
+		return ret;
+	}
+
+	/**
+	 * Calculates the size of parameter
+	 * 
+	 * @param parameter
+	 *            the parameter
+	 * @return the parameter size or 0 if the size is not known at compile time
+	 */
+	public static int mapParameterTypeToSize(TraceParameter parameter) {
+		int retval;
+		ArrayParameterRule rule = parameter
+				.getExtension(ArrayParameterRule.class);
+		if (rule != null) {
+			// Array parameters are dynamic
+			retval = 0;
+		} else {
+			String type = parameter.getType();
+			TraceConstantTable table = parameter.getModel()
+					.findConstantTableByName(type);
+			if (table != null) {
+				type = table.getType();
+			}
+			retval = mapParameterTypeToSize(type);
+		}
+		return retval;
+	}
+
+	/**
+	 * Calculates the size of parameter type
+	 * 
+	 * @param type
+	 *            the parameter type
+	 * @return the parameter size or 0 if size is not known at compile time
+	 */
+	public static int mapParameterTypeToSize(String type) {
+		int retval;
+		if (type.equals(TraceParameter.HEX32)
+				|| type.equals(TraceParameter.UDEC32)
+				|| type.equals(TraceParameter.SDEC32)
+				|| type.equals(TraceParameter.OCT32)
+				|| type.equals(TraceParameter.POINTER)) {
+			retval = 4; // CodForChk_Dis_Magic
+		} else if (type.equals(TraceParameter.HEX16)
+				|| type.equals(TraceParameter.UDEC16)
+				|| type.equals(TraceParameter.SDEC16)
+				|| type.equals(TraceParameter.OCT16)) {
+			retval = 2; // CodForChk_Dis_Magic
+		} else if (type.equals(TraceParameter.HEX8)
+				|| type.equals(TraceParameter.UDEC8)
+				|| type.equals(TraceParameter.SDEC8)
+				|| type.equals(TraceParameter.OCT8)) {
+			retval = 1;
+		} else if (type.equals(TraceParameter.HEX64)
+				|| type.equals(TraceParameter.UDEC64)
+				|| type.equals(TraceParameter.SDEC64)
+				|| type.equals(TraceParameter.OCT64)
+				|| type.equals(TraceParameter.FLOAT_EXP)
+				|| type.equals(TraceParameter.FLOAT_FIX)
+				|| type.equals(TraceParameter.FLOAT_OPT)) {
+			retval = 8; // CodForChk_Dis_Magic
+		} else {
+			retval = 0;
+		}
+		return retval;
+	}
+
+	/**
+	 * Removes printf formatting from trace text
+	 * 
+	 * @param text
+	 *            the text to be converted
+	 * @return the new text
+	 */
+	public static String removePrintfFormatting(String text) {
+		Matcher matcher = traceTextPattern.matcher(text);
+		return matcher.replaceAll(""); //$NON-NLS-1$
+	}
+
+	/**
+	 * Converts the given type to unsigned type
+	 * 
+	 * @param type
+	 *            the type
+	 * @return unsigned type
+	 */
+	private static String convertToUnsigned(String type) {
+		if (type.equals(TraceParameter.SDEC32)) {
+			type = TraceParameter.UDEC32;
+		} else if (type.equals(TraceParameter.SDEC16)) {
+			type = TraceParameter.UDEC16;
+		} else if (type.equals(TraceParameter.SDEC8)) {
+			type = TraceParameter.UDEC8;
+		} else if (type.equals(TraceParameter.SDEC64)) {
+			type = TraceParameter.UDEC64;
+		}
+		return type;
+	}
+
+	/**
+	 * Maps a normal parameter type for format character
+	 * 
+	 * @param type
+	 *            the parameter type
+	 * @return the format character
+	 */
+	public static String mapNormalTypeToFormat(String type) { // CodForChk_Dis_ComplexFunc
+		String tag;
+		if (type.equals(TraceParameter.SDEC32)) {
+			tag = "%d"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.POINTER)) {
+			tag = "%p"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.HEX32)) {
+			tag = "%x"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.UDEC32)) {
+			tag = "%u"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.OCT32)) {
+			tag = "%o"; //$NON-NLS-1$			
+		} else if (type.equals(TraceParameter.SDEC16)) {
+			tag = "%hd"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.HEX16)) {
+			tag = "%hx"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.UDEC16)) {
+			tag = "%hu"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.OCT16)) {
+			tag = "%ho"; //$NON-NLS-1$			
+		} else if (type.equals(TraceParameter.SDEC8)) {
+			tag = "%hhd"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.HEX8)) {
+			tag = "%hhx"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.UDEC8)) {
+			tag = "%hhu"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.OCT8)) {
+			tag = "%hho"; //$NON-NLS-1$			
+		} else if (type.equals(TraceParameter.SDEC64)) {
+			tag = "%Ld"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.HEX64)) {
+			tag = "%Lx"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.UDEC64)) {
+			tag = "%Lu"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.OCT64)) {
+			tag = "%Lo"; //$NON-NLS-1$			
+		} else if (type.equals(TraceParameter.ASCII)) {
+			tag = "%s"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.UNICODE)) {
+			tag = "%S"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.FLOAT_FIX)) {
+			tag = "%f"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.FLOAT_EXP)) {
+			tag = "%e"; //$NON-NLS-1$
+		} else if (type.equals(TraceParameter.FLOAT_OPT)) {
+			tag = "%g"; //$NON-NLS-1$
+		} else {
+			tag = "%{" //$NON-NLS-1$
+					+ type + "}"; //$NON-NLS-1$
+		}
+		return tag;
+	}
+
+	/**
+	 * Maps an array parameter type to format string
+	 * 
+	 * @param type
+	 *            the parameter type
+	 * @return the format string
+	 */
+	public static String mapArrayTypeToFormat(String type) {
+		String tag = "%{" //$NON-NLS-1$
+				+ type + "[]}"; //$NON-NLS-1$
+		return tag;
+	}
+
+	/**
+	 * Maps format specifier to parameter length
+	 * 
+	 * @param formatSpecifier
+	 *            the specifier
+	 * @return the length
+	 * @throws TraceCompilerException
+	 *             if length is not valid
+	 */
+	public static int mapFormatToParameterLength(String formatSpecifier)
+			throws TraceCompilerException {
+		Matcher matcher = SourceUtils.lengthPattern.matcher(formatSpecifier);
+		int paramLength = 0;
+		if (matcher.find()) {
+			String length = matcher.group();
+
+			if (length.length() == 2) { // CodForChk_Dis_Magic
+				if (length.charAt(0) == 'h' && length.charAt(1) == 'h') {
+					paramLength = SourceConstants.BYTE_SIZE;
+				} else if (length.charAt(0) == 'l' && length.charAt(1) == 'l') {
+					paramLength = SourceConstants.LONG_SIZE;
+				} else {
+					StringErrorParameters params = new StringErrorParameters();
+					params.string = formatSpecifier;
+					throw new TraceCompilerException(
+							TraceCompilerErrorCode.PARAMETER_FORMAT_NOT_SUPPORTED,
+							params, null);
+				}
+			} else if (length.length() == 1) {
+				switch (length.charAt(0)) {
+				case 'h':
+					paramLength = SourceConstants.SHORT_SIZE;
+					break;
+				case 'l':
+					paramLength = SourceConstants.INT_SIZE;
+					break;
+				case 'L':
+					paramLength = SourceConstants.LONG_SIZE;
+					break;
+				default:
+					StringErrorParameters params = new StringErrorParameters();
+					params.string = formatSpecifier;
+					throw new TraceCompilerException(
+							TraceCompilerErrorCode.PARAMETER_FORMAT_NOT_SUPPORTED,
+							params, null);
+				}
+			} else {
+				throw new TraceCompilerException(
+						TraceCompilerErrorCode.INVALID_TRACE_TEXT_FORMAT, null,
+						formatSpecifier);
+			}
+		}
+
+		return paramLength;
+	}
+
+	/**
+	 * Maps signed parameter length to type
+	 * 
+	 * @param paramLength
+	 *            the length
+	 * @return the type
+	 */
+	private static String mapSignedToParameterType(int paramLength) {
+		String retval;
+		if (paramLength == SourceConstants.BYTE_SIZE) {
+			retval = TraceParameter.SDEC8;
+		} else if (paramLength == SourceConstants.SHORT_SIZE) {
+			retval = TraceParameter.SDEC16;
+		} else if (paramLength == SourceConstants.LONG_SIZE) {
+			retval = TraceParameter.SDEC64;
+		} else {
+			retval = TraceParameter.SDEC32;
+		}
+		return retval;
+	}
+
+	/**
+	 * Maps unsigned parameter length to type
+	 * 
+	 * @param paramLength
+	 *            the length
+	 * @return the type
+	 */
+	public static String mapUnsignedToParameterType(int paramLength) {
+		String retval;
+		if (paramLength == SourceConstants.BYTE_SIZE) {
+			retval = TraceParameter.UDEC8;
+		} else if (paramLength == SourceConstants.SHORT_SIZE) {
+			retval = TraceParameter.UDEC16;
+		} else if (paramLength == SourceConstants.LONG_SIZE) {
+			retval = TraceParameter.UDEC64;
+		} else {
+			retval = TraceParameter.UDEC32;
+		}
+		return retval;
+	}
+
+	/**
+	 * Maps hex parameter length to type
+	 * 
+	 * @param paramLength
+	 *            the length
+	 * @return the type
+	 */
+	public static String mapHexToParameterType(int paramLength) {
+		String retval;
+		if (paramLength == SourceConstants.BYTE_SIZE) {
+			retval = TraceParameter.HEX8;
+		} else if (paramLength == SourceConstants.SHORT_SIZE) {
+			retval = TraceParameter.HEX16;
+		} else if (paramLength == SourceConstants.LONG_SIZE) {
+			retval = TraceParameter.HEX64;
+		} else {
+			retval = TraceParameter.HEX32;
+		}
+		return retval;
+	}
+
+	/**
+	 * Maps octal parameter length to type
+	 * 
+	 * @param paramLength
+	 *            the length
+	 * @return the type
+	 */
+	public static String mapOctalToParameterType(int paramLength) {
+		String retval;
+		if (paramLength == SourceConstants.BYTE_SIZE) {
+			retval = TraceParameter.OCT8;
+		} else if (paramLength == SourceConstants.SHORT_SIZE) {
+			retval = TraceParameter.OCT16;
+		} else if (paramLength == SourceConstants.LONG_SIZE) {
+			retval = TraceParameter.OCT64;
+		} else {
+			retval = TraceParameter.OCT32;
+		}
+
+		return retval;
+	}
+
+	/**
+	 * Checks if the parameter can be represented with default trace macros
+	 * 
+	 * @param parameter
+	 *            the parameter
+	 * @return true if parameter can be represented with default trace macros
+	 */
+	public static boolean isSimpleType(TraceParameter parameter) {
+		boolean retval;
+		if (parameter.getExtension(ArrayParameterRule.class) != null) {
+			// Arrays are always complex types
+			retval = false;
+		} else {
+			String type = parameter.getType();
+			TraceConstantTable table = parameter.getModel()
+					.findConstantTableByName(type);
+			if (table != null) {
+				type = table.getType();
+			}
+			retval = isSimpleType(type);
+		}
+		return retval;
+	}
+
+	/**
+	 * Simple type is 32-bit integer
+	 * 
+	 * @param type
+	 *            the type
+	 * @return true if simple, false if not
+	 */
+	private static boolean isSimpleType(String type) {
+		return type.equals(TraceParameter.SDEC32)
+				|| type.equals(TraceParameter.UDEC32)
+				|| type.equals(TraceParameter.OCT32)
+				|| type.equals(TraceParameter.HEX32);
+	}
+
+	/**
+	 * String type is either ascii or unicode
+	 * 
+	 * @param type
+	 *            the type
+	 * @return true if string, false if not
+	 */
+	private static boolean isStringType(String type) {
+		return type.equals(TraceParameter.ASCII)
+				|| type.equals(TraceParameter.UNICODE);
+	}
+
+	/**
+	 * Basic type is any of the built-in TraceParameter types
+	 * 
+	 * @param type
+	 *            the type
+	 * @return true if basic, false if not
+	 */
+	private static boolean isBasicType(String type) {
+		return isSimpleType(type) || type.equals(TraceParameter.SDEC8)
+				|| type.equals(TraceParameter.SDEC16)
+				|| type.equals(TraceParameter.UDEC8)
+				|| type.equals(TraceParameter.UDEC16)
+				|| type.equals(TraceParameter.OCT16)
+				|| type.equals(TraceParameter.HEX8)
+				|| type.equals(TraceParameter.HEX16)
+				|| type.equals(TraceParameter.SDEC64)
+				|| type.equals(TraceParameter.UDEC64)
+				|| type.equals(TraceParameter.OCT64)
+				|| type.equals(TraceParameter.HEX64)
+				|| type.equals(TraceParameter.ASCII)
+				|| type.equals(TraceParameter.UNICODE)
+				|| type.equals(TraceParameter.FLOAT_EXP)
+				|| type.equals(TraceParameter.FLOAT_FIX)
+				|| type.equals(TraceParameter.FLOAT_OPT)
+				|| type.equals(TraceParameter.POINTER);
+	}
+
+	/**
+	 * Checks if parameter size is dynamic
+	 * 
+	 * @param parameter
+	 *            the parameter to be checked
+	 * @return true if dynamic size
+	 */
+	public static boolean isParameterSizeDynamic(TraceParameter parameter) {
+		String type = parameter.getType();
+		ArrayParameterRule rule = parameter
+				.getExtension(ArrayParameterRule.class);
+		return rule != null || type.equals(TraceParameter.ASCII)
+				|| type.equals(TraceParameter.UNICODE);
+	}
+
+	/**
+	 * Checks if alignment is needed
+	 * 
+	 * @param type
+	 *            the parameter type
+	 * @return true if alignment is needed
+	 */
+	public static boolean isParameterAlignementNeeded(String type) {
+		int size = SourceUtils.mapParameterTypeToSize(type);
+		boolean retval = false;
+		if (size == 1 || size == 2) { // CodForChk_Dis_Magic
+			// 8 and 16-bit parameters need alignment
+			retval = true;
+		} else if (isStringType(type)) {
+			retval = true;
+		}
+		return retval;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SymbianConstants.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,241 @@
+/*
+* 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:
+*
+* Constants related to Symbian sources
+*
+*/
+package com.nokia.tracecompiler.source;
+
+import com.nokia.tracecompiler.model.TraceParameter;
+
+/**
+ * Constants related to Symbian sources
+ * 
+ */
+public interface SymbianConstants {
+
+	/**
+	 * Include directory
+	 */
+	final String INCLUDE_DIRECTORY = "inc"; //$NON-NLS-1$
+
+	/**
+	 * Source directory
+	 */
+	final String SOURCE_DIRECTORY = "src"; //$NON-NLS-1$
+
+	/**
+	 * Group directory
+	 */
+	final String GROUP_DIRECTORY = "group"; //$NON-NLS-1$
+
+	/**
+	 * Mmpfiles directory
+	 */
+	final String MMPFILES_DIRECTORY = "mmpfiles"; //$NON-NLS-1$
+	
+	/**
+	 * ETrue
+	 */
+	final String ETRUE = "ETrue"; //$NON-NLS-1$
+
+	/**
+	 * EFalse
+	 */
+	final String EFALSE = "EFalse"; //$NON-NLS-1$
+
+	/**
+	 * TBool
+	 */
+	final String TBOOL = "TBool"; //$NON-NLS-1$
+
+	/**
+	 * TInt
+	 */
+	final String TINT = "TInt"; //$NON-NLS-1$
+
+	/**
+	 * TUint
+	 */
+	final String TUINT = "TUint"; //$NON-NLS-1$
+
+	/**
+	 * TInt64
+	 */
+	final String TINT64 = "TInt64"; //$NON-NLS-1$
+
+	/**
+	 * TUint64
+	 */
+	final String TUINT64 = "TUint64"; //$NON-NLS-1$
+
+	/**
+	 * TTime
+	 */
+	final String TTIME = "TTime"; //$NON-NLS-1$
+
+	/**
+	 * TInt32
+	 */
+	final String TINT32 = "TInt32"; //$NON-NLS-1$
+
+	/**
+	 * TUint32
+	 */
+	final String TUINT32 = "TUint32"; //$NON-NLS-1$
+
+	/**
+	 * TInt16
+	 */
+	final String TINT16 = "TInt16"; //$NON-NLS-1$
+
+	/**
+	 * TUint16
+	 */
+	final String TUINT16 = "TUint16"; //$NON-NLS-1$
+
+	/**
+	 * TInt8
+	 */
+	final String TINT8 = "TInt8"; //$NON-NLS-1$
+
+	/**
+	 * TUint8
+	 */
+	final String TUINT8 = "TUint8"; //$NON-NLS-1$
+
+	/**
+	 * TAny
+	 */
+	final String TANY = "TAny"; //$NON-NLS-1$
+
+	/**
+	 * TAny*
+	 */
+	final String TANY_PTR = "TAny*"; //$NON-NLS-1$
+	
+	/**
+	 * const TAny*
+	 */
+	final String CONST_TANY_PTR = "const TAny*"; //$NON-NLS-1$
+
+	/**
+	 * TDes8
+	 */
+	final String TDES8 = "TDes8"; //$NON-NLS-1$
+
+	/**
+	 * TDesC8
+	 */
+	final String TDESC8 = "TDesC8"; //$NON-NLS-1$
+
+	/**
+	 * TDes16
+	 */
+	final String TDES16 = "TDes16"; //$NON-NLS-1$
+
+	/**
+	 * TDesC16
+	 */
+	final String TDESC16 = "TDesC16"; //$NON-NLS-1$
+
+	/**
+	 * TDes
+	 */
+	final String TDES = "TDes"; //$NON-NLS-1$
+
+	/**
+	 * TDesC
+	 */
+	final String TDESC = "TDesC"; //$NON-NLS-1$
+
+	/**
+	 * TPtr8
+	 */
+	final String TPTR8 = "TPtr8"; //$NON-NLS-1$
+
+	/**
+	 * TPtrC8
+	 */
+	final String TPTRC8 = "TPtrC8"; //$NON-NLS-1$
+
+	/**
+	 * TPtr16
+	 */
+	final String TPTR16 = "TPtr16"; //$NON-NLS-1$
+
+	/**
+	 * TPtrC16
+	 */
+	final String TPTRC16 = "TPtrC16"; //$NON-NLS-1$
+
+	/**
+	 * TPtr
+	 */
+	final String TPTR = "TPtr"; //$NON-NLS-1$
+
+	/**
+	 * TPtrC
+	 */
+	final String TPTRC = "TPtrC"; //$NON-NLS-1$
+
+	/**
+	 * TReal
+	 */
+	final String TREAL = "TReal"; //$NON-NLS-1$
+
+	/**
+	 * const TDesC8&
+	 */
+	final String CONST_TDESC8_REF = "const TDesC8&"; //$NON-NLS-1$
+
+	/**
+	 * const TDesC8&
+	 */
+	final String CONST_TDESC16_REF = "const TDesC16&"; //$NON-NLS-1$
+
+	/**
+	 * Prefix for all parameters generated into header files
+	 */
+	final String PARAMETER_DECLARATION_PREFIX = "aParam"; //$NON-NLS-1$
+
+	/**
+	 * __KERNEL_MODE__
+	 */
+	final String KERNEL_MODE = "__KERNEL_MODE__"; //$NON-NLS-1$
+
+	/**
+	 * Symbian parameter types mapped to TraceParameter types
+	 */
+	final String PARAMETER_TYPE_MAP[][] = { { TANY, null },
+			{ SourceConstants.VOID, null }, { TINT, TraceParameter.SDEC32 },
+			{ TINT32, TraceParameter.SDEC32 },
+			{ TBOOL, TraceParameter.SDEC32 },
+			{ SourceConstants.INT, TraceParameter.SDEC32 },
+			{ SourceConstants.LONG, TraceParameter.SDEC32 },
+			{ TUINT, TraceParameter.UDEC32 },
+			{ TUINT32, TraceParameter.UDEC32 },
+			{ TINT16, TraceParameter.SDEC16 },
+			{ SourceConstants.SHORT, TraceParameter.SDEC16 },
+			{ TUINT16, TraceParameter.UDEC16 },
+			{ TINT8, TraceParameter.SDEC8 },
+			{ SourceConstants.CHAR, TraceParameter.SDEC8 },
+			{ TUINT8, TraceParameter.UDEC8 },
+			{ TINT64, TraceParameter.SDEC64 },
+			{ TTIME, TraceParameter.TIME },
+			{ TUINT64, TraceParameter.UDEC64 },
+			{ TREAL, TraceParameter.FLOAT_FIX } };
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/TokenizerSearchData.java	Tue Aug 31 16:45:49 2010 +0300
@@ -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:
+*
+* Contains search variables during SourceParameterTokenizer.tokenizeParameters call
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Contains search variables during SourceParameterTokenizer.tokenizeParameters
+ * call
+ * 
+ */
+final class TokenizerSearchData {
+
+	/**
+	 * Iterator over source characters
+	 */
+	SourceIterator itr;
+
+	/**
+	 * Current character
+	 */
+	char value;
+
+	/**
+	 * Previous character
+	 */
+	char previousValue = ' ';
+
+	/**
+	 * Number of '(' encountered without matching ')' character
+	 */
+	int openBracketCount;
+
+	/**
+	 * Index for start of parameter
+	 */
+	int tagStartIndex;
+
+	/**
+	 * Index for start of parameter
+	 */
+	int paramStartIndex;
+
+	/**
+	 * Initial count of '(' characters at beginning of parameter
+	 */
+	int initialBracketCount;
+
+	/**
+	 * Closing ')' character has been found.
+	 */
+	boolean complete;
+
+	/**
+	 * Ending ';' or '{' character has been found
+	 */
+	boolean endFound;
+
+	/**
+	 * Within quotes flag
+	 */
+	boolean inQuotes;
+
+	/**
+	 * Parameter definition object
+	 */
+	SourceParameter sourceParameter;
+
+	/**
+	 * Data flag
+	 */
+	boolean hasData;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/TypeMapping.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,62 @@
+/*
+* 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:
+*
+* Source to parameter type mapping
+*
+*/
+package com.nokia.tracecompiler.source;
+
+/**
+ * Type returned by
+ * {@link SourceUtils#mapSymbianTypeToParameterType(ParsedType)}
+ * 
+ */
+public final class TypeMapping {
+
+	/**
+	 * Parameter type
+	 */
+	public String type;
+
+	/**
+	 * Explicit casting needs to be used when calling trace function
+	 */
+	public boolean needsCasting;
+
+	/**
+	 * Value is changed to pointer before passing to trace function
+	 */
+	public boolean valueToPointer;
+
+	/**
+	 * Contructor
+	 * 
+	 * @param type
+	 *            the parameter type
+	 */
+	public TypeMapping(String type) {
+		this.type = type;
+	}
+
+	/**
+	 * Checks if type is void
+	 * 
+	 * @return true if type is void
+	 */
+	public boolean isVoid() {
+		return type == null;
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+Contains parsers for source code
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/DocumentAdapter.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,130 @@
+/*
+* 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:
+*
+* Adapter for document interface
+*
+*/
+package com.nokia.tracecompiler.utils;
+
+import com.nokia.tracecompiler.source.SourceDocumentInterface;
+import com.nokia.tracecompiler.source.SourceLocationInterface;
+import com.nokia.tracecompiler.source.SourceParserException;
+import com.nokia.tracecompiler.source.SourcePropertyProvider;
+
+/**
+ * Adapter for document interface
+ * 
+ */
+public class DocumentAdapter implements SourceDocumentInterface {
+
+	/**
+	 * Document owner
+	 */
+	private Object owner;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentInterface#
+	 *      addLocation(com.nokia.tracecompiler.source.SourceLocationInterface)
+	 */
+	public void addLocation(SourceLocationInterface location) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentInterface#get(int, int)
+	 */
+	public String get(int start, int length) throws SourceParserException {
+		return ""; //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentInterface#getChar(int)
+	 */
+	public char getChar(int offset) throws SourceParserException {
+		return '\0';
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentInterface#getLength()
+	 */
+	public int getLength() {
+		return 0;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentInterface#
+	 *      getLineOfOffset(int)
+	 */
+	public int getLineOfOffset(int offset) throws SourceParserException {
+		return -1;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentInterface#getOwner()
+	 */
+	public Object getOwner() {
+		return owner;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentInterface#
+	 *      removeLocation(com.nokia.tracecompiler.source.SourceLocationInterface)
+	 */
+	public void removeLocation(SourceLocationInterface location) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentInterface#replace(int,
+	 *      int, java.lang.String)
+	 */
+	public void replace(int offset, int length, String newText)
+			throws SourceParserException {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentInterface#
+	 *      setOwner(java.lang.Object)
+	 */
+	public void setOwner(Object owner) {
+		this.owner = owner;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentInterface#getPropertyProvider()
+	 */
+	public SourcePropertyProvider getPropertyProvider() {
+		return null;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/DocumentFactory.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,57 @@
+/*
+* 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:
+*
+* Factory class to create document interfaces
+*
+*/
+package com.nokia.tracecompiler.utils;
+
+import com.nokia.tracecompiler.source.SourceDocumentFactory;
+import com.nokia.tracecompiler.source.SourceDocumentMonitor;
+
+/**
+ * Factory class to create document interfaces
+ * 
+ */
+public final class DocumentFactory {
+
+	/**
+	 * Document monitor
+	 */
+	private static SourceDocumentMonitor monitor;
+
+
+	/**
+	 * Registers a document framework to be used by the engine
+	 * 
+	 * @param monitor
+	 *            the document monitor
+	 * @param factoryClass
+	 *            the document factory class
+	 */
+	public static void registerDocumentFramework(SourceDocumentMonitor monitor,
+			Class<? extends SourceDocumentFactory> factoryClass) {
+		DocumentFactory.monitor = monitor;
+	}
+
+	/**
+	 * Gets the document monitor
+	 * 
+	 * @return the monitor
+	 */
+	public static final SourceDocumentMonitor getDocumentMonitor() {
+		return monitor;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/DocumentFactoryBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,54 @@
+/*
+* 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:
+*
+* Base class for document factories
+*
+*/
+package com.nokia.tracecompiler.utils;
+
+import com.nokia.tracecompiler.source.SourceDocumentFactory;
+import com.nokia.tracecompiler.source.SourceDocumentInterface;
+import com.nokia.tracecompiler.source.SourceLocationBase;
+import com.nokia.tracecompiler.source.SourceLocationInterface;
+
+/**
+ * Base class for document factories
+ * 
+ */
+public class DocumentFactoryBase implements SourceDocumentFactory {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentFactory#
+	 *      createDocument(java.lang.String)
+	 */
+	public SourceDocumentInterface createDocument(String sourceData) {
+		return new DocumentAdapter();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentFactory#
+	 *      createLocation(com.nokia.tracecompiler.source.SourceLocationBase,
+	 *      int, int)
+	 */
+	public SourceLocationInterface createLocation(SourceLocationBase base,
+			int offset, int length) {
+		return new SimpleLocation(offset, length);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/DocumentMonitorBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,84 @@
+/*
+* 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:
+*
+* Base class for document monitors
+*
+*/
+package com.nokia.tracecompiler.utils;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.nokia.tracecompiler.source.SourceDocumentFactory;
+import com.nokia.tracecompiler.source.SourceDocumentInterface;
+import com.nokia.tracecompiler.source.SourceDocumentMonitor;
+import com.nokia.tracecompiler.source.SourceDocumentProcessor;
+
+/**
+ * Base class for document monitors.
+ * 
+ */
+public class DocumentMonitorBase implements SourceDocumentMonitor {
+
+	/**
+	 * Document factory adapter
+	 */
+	private DocumentFactoryBase factory;
+
+	/**
+	 * List of sources
+	 */
+	private ArrayList<SourceDocumentInterface> sources = new ArrayList<SourceDocumentInterface>();
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentMonitor#getFactory()
+	 */
+	public SourceDocumentFactory getFactory() {
+		if (factory == null) {
+			factory = new DocumentFactoryBase();
+		}
+		return factory;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Iterable#iterator()
+	 */
+	public Iterator<SourceDocumentInterface> iterator() {
+		return sources.iterator();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentMonitor#
+	 *      startMonitor(com.nokia.tracecompiler.source.SourceDocumentProcessor)
+	 */
+	public void startMonitor(SourceDocumentProcessor processor) throws Exception {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceDocumentMonitor#stopMonitor()
+	 */
+	public void stopMonitor() {
+		sources.clear();
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/SimpleLocation.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,111 @@
+/*
+* 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:
+*
+* Adapter for location interface
+*
+*/
+package com.nokia.tracecompiler.utils;
+
+import com.nokia.tracecompiler.source.SourceLocationInterface;
+
+/**
+ * Location interface implementation
+ * 
+ */
+class SimpleLocation implements SourceLocationInterface {
+
+	/**
+	 * Location offset
+	 */
+	private int offset;
+
+	/**
+	 * Location length
+	 */
+	private int length;
+
+	/**
+	 * Deleted flag
+	 */
+	private boolean deleted;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param offset
+	 *            location offset
+	 * @param length
+	 *            location length
+	 */
+	SimpleLocation(int offset, int length) {
+		this.offset = offset;
+		this.length = length;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceLocationInterface#delete()
+	 */
+	public void delete() {
+		deleted = true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceLocationInterface#getLength()
+	 */
+	public int getLength() {
+		return length;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceLocationInterface#getOffset()
+	 */
+	public int getOffset() {
+		return offset;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceLocationInterface#isDeleted()
+	 */
+	public boolean isDeleted() {
+		return deleted;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceLocationInterface#setLength(int)
+	 */
+	public void setLength(int length) {
+		this.length = length;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.source.SourceLocationInterface#setOffset(int)
+	 */
+	public void setOffset(int offset) {
+		this.offset = offset;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/TraceCompilerVersion.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2010 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:
+*
+* Version number abstraction
+*
+*/
+package com.nokia.tracecompiler.utils;
+
+/**
+ * Version number abstraction
+ * 
+ */
+public abstract class TraceCompilerVersion {
+
+	/**
+	 * Sub-class, which implements getVersion
+	 */
+	private static TraceCompilerVersion versionImpl;
+
+	/**
+	 * Gets TraceCompiler version number
+	 * 
+	 * @return version number
+	 */
+	public static String getVersion() {
+		String version = null;
+		if (versionImpl != null) {
+			version = versionImpl.getTraceCompilerVersion();
+		} else {
+			// TODO: This is used in console builds -> Maintenance needed
+			version = "2.3.0"; //$NON-NLS-1$
+		}
+		return version;
+	}
+
+	/**
+	 * Gets the version number as x.y.z
+	 * 
+	 * @return the version string
+	 */
+	protected abstract String getTraceCompilerVersion();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/utils/package.html	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+<html><body>
+Exported utility classes
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_1.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,22 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]GROUP1=0xde
+[GROUP]GROUP2=0xdf
+[TRACE]GROUP1[0xDE]_TRACE0=0x1
+[TRACE]GROUP2[0xDF]_TRACE1=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_2.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]GROUP1=0xde
+[GROUP]GROUP2=0xdf
+[TRACE]GROUP1[0xDE]_TRACE0=0x1
+[TRACE]GROUP2[0xDF]_TRACE1=0x1
+[TRACE]GROUP2[0xDF]_TRACE2=0x2
+[TRACE]GROUP2[0xDF]_TRACE3=0x3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_3.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]GROUP2=0xdf
+[TRACE]GROUP2[0xDF]_TRACE2=0x2
+[TRACE]GROUP2[0xDF]_TRACE3=0x3
+[[OBSOLETE]][GROUP]GROUP1=0xde
+[[OBSOLETE]][TRACE]GROUP1[0xDE]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE1=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_4.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,29 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]GROUP1=0xe0
+[GROUP]GROUP2=0xdf
+[GROUP]TRACE_FATAL=0x81
+[TRACE]GROUP1[0xE0]_TRACE0=0x1
+[TRACE]GROUP2[0xDF]_TRACE1=0x4
+[TRACE]GROUP2[0xDF]_TRACE2=0x2
+[TRACE]TRACE_FATAL[0x81]_TRACE3=0x1
+[[OBSOLETE]][GROUP]GROUP1=0xde
+[[OBSOLETE]][TRACE]GROUP1[0xDE]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE1=0x1
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE3=0x3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_5.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,28 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]GROUP1=0xe0
+[GROUP]GROUP2=0xdf
+[TRACE]GROUP1[0xE0]_TRACE0=0x1
+[TRACE]GROUP2[0xDF]_TRACE1=0x4
+[TRACE]GROUP2[0xDF]_TRACE2=0x2
+[[OBSOLETE]][GROUP]GROUP1=0xde
+[[OBSOLETE]][TRACE]GROUP1[0xDE]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE1=0x1
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE3=0x3
+[[OBSOLETE]][TRACE]TRACE_FATAL[0x81]_TRACE3=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_6_0.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]GROUP1=0xe0
+[GROUP]GROUP2=0xdf
+[TRACE]GROUP1[0xE0]_TRACE0=0x1
+[TRACE]GROUP2[0xDF]_TRACE2=0x2
+[[OBSOLETE]][GROUP]GROUP1=0xde
+[[OBSOLETE]][TRACE]GROUP1[0xDE]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE1=0x4
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE3=0x3
+[[OBSOLETE]][TRACE]TRACE_FATAL[0x81]_TRACE3=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_6_1.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,28 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]GROUP1=0xe0
+[GROUP]GROUP2=0xdf
+[TRACE]GROUP1[0xE0]_TRACE0=0x1
+[TRACE]GROUP2[0xDF]_TRACE1=0x5
+[TRACE]GROUP2[0xDF]_TRACE2=0x2
+[[OBSOLETE]][GROUP]GROUP1=0xde
+[[OBSOLETE]][TRACE]GROUP1[0xDE]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE1=0x4
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE3=0x3
+[[OBSOLETE]][TRACE]TRACE_FATAL[0x81]_TRACE3=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_6_2.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]GROUP1=0xe0
+[GROUP]GROUP2=0xdf
+[TRACE]GROUP1[0xE0]_TRACE0=0x1
+[TRACE]GROUP2[0xDF]_TRACE2=0x2
+[[OBSOLETE]][GROUP]GROUP1=0xde
+[[OBSOLETE]][TRACE]GROUP1[0xDE]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE1=0x5
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE3=0x3
+[[OBSOLETE]][TRACE]TRACE_FATAL[0x81]_TRACE3=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_6_3.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,28 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]GROUP1=0xe0
+[GROUP]GROUP2=0xdf
+[TRACE]GROUP1[0xE0]_TRACE0=0x1
+[TRACE]GROUP2[0xDF]_TRACE1=0x6
+[TRACE]GROUP2[0xDF]_TRACE2=0x2
+[[OBSOLETE]][GROUP]GROUP1=0xde
+[[OBSOLETE]][TRACE]GROUP1[0xDE]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE1=0x5
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE3=0x3
+[[OBSOLETE]][TRACE]TRACE_FATAL[0x81]_TRACE3=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_7_0.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,28 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]GROUP2=0xdf
+[TRACE]GROUP2[0xDF]_TRACE0=0x7
+[TRACE]GROUP2[0xDF]_TRACE1=0x6
+[TRACE]GROUP2[0xDF]_TRACE2=0x2
+[[OBSOLETE]][GROUP]GROUP1=0xe0
+[[OBSOLETE]][TRACE]GROUP1[0xDE]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP1[0xE0]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE1=0x5
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE3=0x3
+[[OBSOLETE]][TRACE]TRACE_FATAL[0x81]_TRACE3=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_7_1.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,30 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]GROUP2=0xdf
+[GROUP]TRACE_NORMAL=0x86
+[TRACE]GROUP2[0xDF]_TRACE1=0x6
+[TRACE]GROUP2[0xDF]_TRACE2=0x2
+[TRACE]TRACE_NORMAL[0x86]_TRACE0=0x1
+[[OBSOLETE]][GROUP]GROUP1=0xe0
+[[OBSOLETE]][TRACE]GROUP1[0xDE]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP1[0xE0]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE0=0x7
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE1=0x5
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE3=0x3
+[[OBSOLETE]][TRACE]TRACE_FATAL[0x81]_TRACE3=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_7_2.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,31 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]GROUP1=0xe1
+[GROUP]GROUP2=0xdf
+[TRACE]GROUP1[0xE1]_TRACE0=0x1
+[TRACE]GROUP2[0xDF]_TRACE1=0x6
+[TRACE]GROUP2[0xDF]_TRACE2=0x2
+[[OBSOLETE]][GROUP]GROUP1=0xe0
+[[OBSOLETE]][TRACE]GROUP1[0xDE]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP1[0xE0]_TRACE0=0x1
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE0=0x7
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE1=0x5
+[[OBSOLETE]][TRACE]GROUP2[0xDF]_TRACE3=0x3
+[[OBSOLETE]][TRACE]TRACE_FATAL[0x81]_TRACE3=0x1
+[[OBSOLETE]][TRACE]TRACE_NORMAL[0x86]_TRACE0=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_8.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,20 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TRACE_FLOW=0x8a
+[TRACE]TRACE_FLOW[0x8A]_TRACE1=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_fid_file_9.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,20 @@
+##
+# This is Default Licence added by TraceCompiler
+# Copyright (c) 2010 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]MY_GROUP=0xde
+[TRACE]MY_GROUP[0xDE]_TRACE1=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_tc_output_8.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+warning: TC has detected a fixed_id.defintions using different Group Id values. This file will be regenerated with the correct values.
+FixedIdDefinitionsTestApp took
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/data/reference_tc_output_9.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,3 @@
+warning: TC has detected a fixed_id.defintions using different Group Id values. This file will be regenerated with the correct values.
+FixedIdDefinitionsTestApp took
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/group/FixedIdDefinitionsTestApp.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  FixedIdDefinitionsTestApp.exe
+TARGETTYPE	  exe
+UID			 0 0xE9FBE6EE
+
+OS_LAYER_SYSTEMINCLUDE
+
+USERINCLUDE	 ..\inc 
+USERINCLUDE  ..\traces
+
+SOURCEPATH	  ..\src
+SOURCE		  FixedIdDefinitionsTestApp.cpp
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+  DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+FixedIdDefinitionsTestApp.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/inc/FixedIdDefinitionsTestApp.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2010 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 __FIXEDIDDEFINITIONSTESTAPP_H__
+#define __FIXEDIDDEFINITIONSTESTAPP_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+
+#endif  // __FIXEDIDDEFINITIONSTESTAPP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/FixedIdDefinitionsTestApp/src/FixedIdDefinitionsTestApp.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,126 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+//  Include Files  
+#include "FixedIdDefinitionsTestApp.h"
+#include <e32base.h>
+#include <e32debug.h>
+#include <e32std.h>
+#include <e32cons.h>
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "FixedIdDefinitionsTestAppTraces.h"
+#endif
+// Console
+//  Constants
+_LIT(KTextConsoleTitle, "Console");
+_LIT(KTextFailed, " failed, leave code = %d");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+//  Global Variables
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+
+//  Local Functions
+
+LOCAL_C void MainL()
+    {
+//     OstTrace0(GROUP1, TRACE0, "trace 0"); // TRACE_USED_IN_TEST_CASE_1
+//     OstTrace0(GROUP2, TRACE1, "trace 1"); // TRACE_USED_IN_TEST_CASE_1
+ 
+//     OstTrace0(GROUP1, TRACE0, "trace 0"); // TRACE_USED_IN_TEST_CASE_2
+//     OstTrace0(GROUP2, TRACE2, "trace 2"); // TRACE_USED_IN_TEST_CASE_2 
+//     OstTrace0(GROUP2, TRACE1, "trace 1"); // TRACE_USED_IN_TEST_CASE_2
+//     OstTrace0(GROUP2, TRACE3, "trace 3"); // TRACE_USED_IN_TEST_CASE_2 
+    
+//     OstTrace0(GROUP2, TRACE2, "trace 2"); // TRACE_USED_IN_TEST_CASE_3 
+//     OstTrace0(GROUP2, TRACE3, "trace 3"); // TRACE_USED_IN_TEST_CASE_3
+    
+//     OstTrace0(GROUP1, TRACE0, "trace 0"); // TRACE_USED_IN_TEST_CASE_4
+//     OstTrace0(GROUP2, TRACE2, "trace 2"); // TRACE_USED_IN_TEST_CASE_4 
+//     OstTrace0(GROUP2, TRACE1, "trace 1"); // TRACE_USED_IN_TEST_CASE_4
+//     OstTrace0(TRACE_FATAL, TRACE3, "trace 3"); // TRACE_USED_IN_TEST_CASE_4
+
+//     OstTrace0(GROUP1, TRACE0, "trace 0"); // TRACE_USED_IN_TEST_CASE_5
+//     OstTrace0(GROUP2, TRACE2, "trace 2"); // TRACE_USED_IN_TEST_CASE_5 
+//     OstTrace0(GROUP2, TRACE1, "trace 1"); // TRACE_USED_IN_TEST_CASE_5
+
+//     OstTrace0(GROUP1, TRACE0, "trace 0"); // TRACE_USED_IN_TEST_CASE_6_0
+//     OstTrace0(GROUP2, TRACE2, "trace 2"); // TRACE_USED_IN_TEST_CASE_6_0 
+//     OstTrace0(GROUP1, TRACE0, "trace 0"); // TRACE_USED_IN_TEST_CASE_6_1 
+//     OstTrace0(GROUP2, TRACE2, "trace 2"); // TRACE_USED_IN_TEST_CASE_6_1 
+//     OstTrace0(GROUP2, TRACE1, "trace 1"); // TRACE_USED_IN_TEST_CASE_6_1
+//     OstTrace0(GROUP1, TRACE0, "trace 0"); // TRACE_USED_IN_TEST_CASE_6_2
+//     OstTrace0(GROUP2, TRACE2, "trace 2"); // TRACE_USED_IN_TEST_CASE_6_2 
+//     OstTrace0(GROUP1, TRACE0, "trace 0"); // TRACE_USED_IN_TEST_CASE_6_3
+//     OstTrace0(GROUP2, TRACE2, "trace 2"); // TRACE_USED_IN_TEST_CASE_6_3 
+//     OstTrace0(GROUP2, TRACE1, "trace 1"); // TRACE_USED_IN_TEST_CASE_6_3
+
+//     OstTrace0(GROUP2, TRACE0, "trace 0"); // TRACE_USED_IN_TEST_CASE_7_0
+//     OstTrace0(GROUP2, TRACE2, "trace 2"); // TRACE_USED_IN_TEST_CASE_7_0 
+//     OstTrace0(GROUP2, TRACE1, "trace 1"); // TRACE_USED_IN_TEST_CASE_7_0
+//     OstTrace0(TRACE_NORMAL, TRACE0, "trace 0"); // TRACE_USED_IN_TEST_CASE_7_1
+//     OstTrace0(GROUP2, TRACE2, "trace 2"); // TRACE_USED_IN_TEST_CASE_7_1
+//     OstTrace0(GROUP2, TRACE1, "trace 1"); // TRACE_USED_IN_TEST_CASE_7_1
+//     OstTrace0(GROUP1, TRACE0, "trace 0"); // TRACE_USED_IN_TEST_CASE_7_2
+//     OstTrace0(GROUP2, TRACE2, "trace 2"); // TRACE_USED_IN_TEST_CASE_7_2 
+//     OstTrace0(GROUP2, TRACE1, "trace 1"); // TRACE_USED_IN_TEST_CASE_7_2   
+   
+//     OstTrace0(TRACE_FLOW, TRACE1, "trace 1"); // TRACE_USED_IN_TEST_CASE_8      
+
+//     OstTrace0(MY_GROUP, TRACE1, "trace 1"); // TRACE_USED_IN_TEST_CASE_9                
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    MainL();
+
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+    // Create output console
+    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(
+                            KConsFullScreen, KConsFullScreen)));
+    if (createError)
+        return createError;
+    // Run application code inside TRAP harness, wait keypress when terminated
+    TRAPD(mainError, DoStartL());
+    if (mainError)
+        console->Printf(KTextFailed, mainError);
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleCppTraceErrorApp/data/referencelog.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,13 @@
+error: ExtraCppFile.cpp, line 37: Trace does not need to use extension macro
+error: ExtraCppFile.cpp, line 38: Trace does not need to use extension macro
+error: ExtraCppFile.cpp, line 42: Parameter count does not match the format specification
+error: You have exceeded the number of Group IDs you have allocated.
+warning: Deprecated group TRACE_API detected. Updating to TRACE_BORDER in dictionary. Please update source code!
+warning: Deprecated group TRACE_DETAILED detected. Updating to TRACE_INTERNALS in dictionary. Please update source code!
+warning: Deprecated group TRACE_DEBUG detected. Updating to TRACE_DUMP in dictionary. Please update source code!
+error: MultipleCppTraceErrorApp.cpp, line 52: Trace does not need to use extension macro
+error: MultipleCppTraceErrorApp.cpp, line 53: Trace does not need to use extension macro
+error: MultipleCppTraceErrorApp.cpp, line 57: Trace is used from multiple places
+error: MultipleCppTraceErrorApp.cpp, line 58: Trace is used from multiple places
+error: MultipleCppTraceErrorApp.cpp, line 65: Parameter count does not match the format specification
+error: MultipleCppTraceErrorApp.cpp, line 101: Run out of Group IDs. You can try to reuse unused group ids by deleting fixed id definition file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleCppTraceErrorApp/group/MultipleCppTraceErrorApp.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  MultipleCppTraceErrorApp.exe
+TARGETTYPE	  exe
+UID			 0 0xE8576D94
+
+APP_LAYER_SYSTEMINCLUDE
+
+USERINCLUDE	 ../inc
+USERINCLUDE  ../traces
+
+SOURCEPATH	  ../src
+SOURCE		  MultipleCppTraceErrorApp.cpp 
+SOURCE		  ExtraCppFile.cpp
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleCppTraceErrorApp/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+MultipleCppTraceErrorApp.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleCppTraceErrorApp/inc/MultipleCppTraceErrorApp.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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 __TRACEERRORAPP_H__
+#define __TRACEERRORAPP_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+void CallSomeMoreTraceStatements();
+
+#endif  // __TRACEERRORAPP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleCppTraceErrorApp/sis/TraceErrorApp_EKA2.pkg	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+;
+; Copyright (c) 2010 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: 
+;
+; Installation file for Symbian OS 9.x for generic console application
+; Installation file for TraceErrorApp EXE
+;
+; This is an auto-generated PKG file by Carbide.
+; This file uses variables specific to Carbide builds that will not work
+; on command-line builds. If you want to use this generated PKG file from the
+; command-line tools you will need to modify the variables with the appropriate
+; values: $(EPOCROOT), $(PLATFORM), $(TARGET)
+;
+
+;
+; UID is the exe's UID
+;
+#{"TraceErrorApp EXE"},(0xE8576D92),1,0,0
+
+
+;Localised Vendor name
+%{"Vendor-EN"}
+
+;Unique Vendor name
+:"Vendor"
+
+"$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\TraceErrorApp.exe"		  -"!:\sys\bin\TraceErrorApp.exe"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleCppTraceErrorApp/src/ExtraCppFile.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleCppTraceErrorApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFileTraces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+    
+    //In these two cases Trace Compiler should give a error that an extension macro isn't necessary:
+    //"TraceErrorApp.cpp, line xx: Trace does not need to use extension macro"
+    OstTraceExt1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTraceExt1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    
+    //Wrong API i.e more parameters than it takes
+    //"TraceErrorApp.cpp, line xx: Parameter count does not match the format specification"
+    OstTrace0( TRACE_FLOW, TEST3_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" ,x);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleCppTraceErrorApp/src/MultipleCppTraceErrorApp.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,158 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleCppTraceErrorApp.h"
+#include <e32base.h>
+#include <e32std.h>
+#include <e32cons.h>			// Console
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleCppTraceErrorAppTraces.h"
+#endif
+
+//  Constants
+
+_LIT(KTextConsoleTitle, "Console");
+_LIT(KTextFailed, " failed, leave code = %d");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+//  Global Variables
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+
+//  Local Functions
+
+LOCAL_C void MainL()
+    {
+    /****************************SHOULD GIVE ERRORS*******************************/
+    _LIT8(KTestDes,"Test Descriptor");
+    TInt32 x = 555;
+    TUint32 y = 666;
+    
+    //In these two cases Trace Compiler should give a error that an extension macro isn't necessary:
+    //"TraceErrorApp.cpp, line xx: Trace does not need to use extension macro"
+    OstTraceExt1( TRACE_FLOW, TEST1_MAINL, "MainL(): x=%d" , x );
+    OstTraceExt1( TRACE_FLOW, TEST2_MAINL, "MainL(): y=%u" , y );
+    
+    //This should give an error stating that the trace name is duplicated
+    //"TraceErrorApp.cpp, line xx: Trace is used from multiple places"
+    OstTrace0( TRACE_FLOW, TEST3_MAINL, "MainL()" );
+    OstTrace0( TRACE_FLOW, TEST3_MAINL, "MainL()" );
+    
+    //This should NOT give an error stating that the arguments don't match format spec
+    //OstTraceExt2( TRACE_FLOW, TEST4_MAINL, "MainL(): x=%d;KTestDes=%d", x, KTestDes );
+
+    //Wrong API i.e more parameters than it takes
+    //"TraceErrorApp.cpp, line xx: Parameter count does not match the format specification"
+    OstTrace0( TRACE_FLOW, TEST5_MAINL, "MainL(): x=%d" ,x);
+    
+    //Too many User-defined group ids should be max of 32 but there are 33 here), should get an error
+    //"You have exceeded the number of Group IDs you have allocated."
+    OstTrace0( MY_GROUP_ID1, TEST_MAINL6, "MainL()" );
+    OstTrace0( MY_GROUP_ID2, TEST_MAINL7, "MainL()" );
+    OstTrace0( MY_GROUP_ID3, TEST_MAINL8, "MainL()" );
+    OstTrace0( MY_GROUP_ID4, TEST_MAINL9, "MainL()" );
+    OstTrace0( MY_GROUP_ID5, TEST_MAINL10, "MainL()" );
+    OstTrace0( MY_GROUP_ID6, TEST_MAINL11, "MainL()" );
+    OstTrace0( MY_GROUP_ID7, TEST_MAINL12, "MainL()" );
+    OstTrace0( MY_GROUP_ID8, TEST_MAINL13, "MainL()" );
+    OstTrace0( MY_GROUP_ID9, TEST_MAINL14, "MainL()" );
+    OstTrace0( MY_GROUP_ID10, TEST_MAINL15, "MainL()" );
+    OstTrace0( MY_GROUP_ID11, TEST_MAINL16, "MainL()" );
+    OstTrace0( MY_GROUP_ID12, TEST_MAINL17, "MainL()" );
+    OstTrace0( MY_GROUP_ID13, TEST_MAINL18, "MainL()" );
+    OstTrace0( MY_GROUP_ID14, TEST_MAINL19, "MainL()" );
+    OstTrace0( MY_GROUP_ID15, TEST_MAINL20, "MainL()" );
+    OstTrace0( MY_GROUP_ID16, TEST_MAINL21, "MainL()" );
+    OstTrace0( MY_GROUP_ID17, TEST_MAINL22, "MainL()" );
+    OstTrace0( MY_GROUP_ID18, TEST_MAINL23, "MainL()" );
+    OstTrace0( MY_GROUP_ID19, TEST_MAINL24, "MainL()" );
+    OstTrace0( MY_GROUP_ID20, TEST_MAINL25, "MainL()" );
+    OstTrace0( MY_GROUP_ID21, TEST_MAINL26, "MainL()" );
+    OstTrace0( MY_GROUP_ID22, TEST_MAINL27, "MainL()" );
+    OstTrace0( MY_GROUP_ID23, TEST_MAINL28, "MainL()" );
+    OstTrace0( MY_GROUP_ID24, TEST_MAINL29, "MainL()" );
+    OstTrace0( MY_GROUP_ID25, TEST_MAINL30, "MainL()" );
+    OstTrace0( MY_GROUP_ID26, TEST_MAINL31, "MainL()" );
+    OstTrace0( MY_GROUP_ID27, TEST_MAINL32, "MainL()" );
+    OstTrace0( MY_GROUP_ID28, TEST_MAINL33, "MainL()" );
+    OstTrace0( MY_GROUP_ID29, TEST_MAINL34, "MainL()" );
+    OstTrace0( MY_GROUP_ID30, TEST_MAINL35, "MainL()" );
+    OstTrace0( MY_GROUP_ID31, TEST_MAINL36, "MainL()" );
+    OstTrace0( MY_GROUP_ID32, TEST_MAINL37, "MainL()" );
+    OstTrace0( MY_GROUP_ID33, TEST_MAINL38, "MainL()" );    
+    /*****************************************************************************/
+    
+    
+    /******************************SHOULD GIVE WARNINGS***************************/
+    //Should get warnings from using deprecated GIDs
+    //e.g. "Deprecated group TRACE_API detected. Updating to TRACE_BORDER in dictionary. Please update source code!"
+    OstTrace0( TRACE_API, TEST_MAINL39, "MainL()" );  
+    OstTrace0( TRACE_IMPORTANT, TEST_MAINL40, "MainL()" );  
+    OstTrace0( TRACE_DETAILED, TEST_MAINL41, "MainL()" );
+    OstTrace0( TRACE_DEBUG, TEST_MAINL42, "MainL()" );  
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    console->Write(_L("Hello, world!\n"));
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    MainL();
+
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(
+            KConsFullScreen, KConsFullScreen)));
+    if (createError)
+        return createError;
+
+    // Run application code inside TRAP harness, wait keypress when terminated
+    TRAPD(mainError, DoStartL());
+    if (mainError)
+        console->Printf(KTextFailed, mainError);
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleCppTraceErrorApp/traces/OstTraceDefinitions.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2010 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/tracefw/tracecompiler/test/MultipleCppTraceErrorApp/traces/fixed_id.definitions	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,9 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TRACE_BORDER=0x84
+[GROUP]TRACE_DUMP=0x89
+[GROUP]TRACE_IMPORTANT=0x85
+[GROUP]TRACE_INTERNALS=0x88
+[TRACE]TRACE_BORDER[0x84]_TEST_MAINL39=0x1
+[TRACE]TRACE_DUMP[0x89]_TEST_MAINL42=0x1
+[TRACE]TRACE_IMPORTANT[0x85]_TEST_MAINL40=0x1
+[TRACE]TRACE_INTERNALS[0x88]_TEST_MAINL41=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/data/referencelog.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,13 @@
+error: ExtraCppFile2.cpp, line 37: Trace does not need to use extension macro
+error: ExtraCppFile2.cpp, line 38: Trace does not need to use extension macro
+error: ExtraCppFile2.cpp, line 42: Parameter count does not match the format specification
+error: You have exceeded the number of Group IDs you have allocated.
+warning: Deprecated group TRACE_API detected. Updating to TRACE_BORDER in dictionary. Please update source code!
+warning: Deprecated group TRACE_DETAILED detected. Updating to TRACE_INTERNALS in dictionary. Please update source code!
+warning: Deprecated group TRACE_DEBUG detected. Updating to TRACE_DUMP in dictionary. Please update source code!
+error: MultipleMmpTraceErrorApp2.cpp, line 52: Trace does not need to use extension macro
+error: MultipleMmpTraceErrorApp2.cpp, line 53: Trace does not need to use extension macro
+error: MultipleMmpTraceErrorApp2.cpp, line 57: Trace is used from multiple places
+error: MultipleMmpTraceErrorApp2.cpp, line 58: Trace is used from multiple places
+error: MultipleMmpTraceErrorApp2.cpp, line 65: Parameter count does not match the format specification
+error: MultipleMmpTraceErrorApp2.cpp, line 101: Run out of Group IDs. You can try to reuse unused group ids by deleting fixed id definition file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/group/MultipleMmpTraceErrorApp1.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  MultipleCppTraceErrorApp1.exe
+TARGETTYPE	  exe
+UID			 0 0xE8576D96
+
+APP_LAYER_SYSTEMINCLUDE
+
+USERINCLUDE	 ../inc
+USERINCLUDE  ../traces
+
+SOURCEPATH	  ../src
+SOURCE		  MultipleMmpTraceErrorApp1.cpp 
+SOURCE 		  ExtraCppFile1.cpp
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/group/MultipleMmpTraceErrorApp2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  MultipleCppTraceErrorApp2.exe
+TARGETTYPE	  exe
+UID			 0 0xE8576D95
+
+APP_LAYER_SYSTEMINCLUDE
+
+USERINCLUDE	 ..\inc
+USERINCLUDE  ..\traces
+
+SOURCEPATH	  ..\src
+SOURCE		  MultipleMmpTraceErrorApp2.cpp 
+SOURCE		  ExtraCppFile2.cpp
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+MultipleMmpTraceErrorApp1.mmp
+MultipleMmpTraceErrorApp2.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/inc/MultipleMmpTraceErrorApp.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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 __TRACEERRORAPP_H__
+#define __TRACEERRORAPP_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+void CallSomeMoreTraceStatements();
+
+#endif  // __TRACEERRORAPP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/sis/TraceErrorApp_EKA2.pkg	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+;
+; Copyright (c) 2010 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: 
+;
+; Installation file for Symbian OS 9.x for generic console application
+; Installation file for TraceErrorApp EXE
+;
+; This is an auto-generated PKG file by Carbide.
+; This file uses variables specific to Carbide builds that will not work
+; on command-line builds. If you want to use this generated PKG file from the
+; command-line tools you will need to modify the variables with the appropriate
+; values: $(EPOCROOT), $(PLATFORM), $(TARGET)
+;
+
+;
+; UID is the exe's UID
+;
+#{"TraceErrorApp EXE"},(0xE8576D92),1,0,0
+
+
+;Localised Vendor name
+%{"Vendor-EN"}
+
+;Unique Vendor name
+:"Vendor"
+
+"$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\TraceErrorApp.exe"		  -"!:\sys\bin\TraceErrorApp.exe"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/src/ExtraCppFile1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpTraceErrorApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile1Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+    
+    //In these two cases Trace Compiler should give a error that an extension macro isn't necessary:
+    //"TraceErrorApp.cpp, line xx: Trace does not need to use extension macro"
+    OstTraceExt1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTraceExt1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    
+    //Wrong API i.e more parameters than it takes
+    //"TraceErrorApp.cpp, line xx: Parameter count does not match the format specification"
+    OstTrace0( TRACE_FLOW, TEST3_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" ,x);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/src/ExtraCppFile2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpTraceErrorApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile2Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+    
+    //In these two cases Trace Compiler should give a error that an extension macro isn't necessary:
+    //"TraceErrorApp.cpp, line xx: Trace does not need to use extension macro"
+    OstTraceExt1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTraceExt1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    
+    //Wrong API i.e more parameters than it takes
+    //"TraceErrorApp.cpp, line xx: Parameter count does not match the format specification"
+    OstTrace0( TRACE_FLOW, TEST3_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" ,x);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/src/MultipleMmpTraceErrorApp1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,158 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleMmpTraceErrorApp.h"
+#include <e32base.h>
+#include <e32std.h>
+#include <e32cons.h>			// Console
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpTraceErrorApp1Traces.h"
+#endif
+
+//  Constants
+
+_LIT(KTextConsoleTitle, "Console");
+_LIT(KTextFailed, " failed, leave code = %d");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+//  Global Variables
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+
+//  Local Functions
+
+LOCAL_C void MainL()
+    {
+    /****************************SHOULD GIVE ERRORS*******************************/
+    _LIT8(KTestDes,"Test Descriptor");
+    TInt32 x = 555;
+    TUint32 y = 666;
+    
+    //In these two cases Trace Compiler should give a error that an extension macro isn't necessary:
+    //"TraceErrorApp.cpp, line xx: Trace does not need to use extension macro"
+    OstTraceExt1( TRACE_FLOW, TEST1_MAINL, "MainL(): x=%d" , x );
+    OstTraceExt1( TRACE_FLOW, TEST2_MAINL, "MainL(): y=%u" , y );
+    
+    //This should give an error stating that the trace name is duplicated
+    //"TraceErrorApp.cpp, line xx: Trace is used from multiple places"
+    OstTrace0( TRACE_FLOW, TEST3_MAINL, "MainL()" );
+    OstTrace0( TRACE_FLOW, TEST3_MAINL, "MainL()" );
+    
+    //This should NOT give an error stating that the arguments don't match format spec
+    //OstTraceExt2( TRACE_FLOW, TEST4_MAINL, "MainL(): x=%d;KTestDes=%d", x, KTestDes );
+
+    //Wrong API i.e more parameters than it takes
+    //"TraceErrorApp.cpp, line xx: Parameter count does not match the format specification"
+    OstTrace0( TRACE_FLOW, TEST5_MAINL, "MainL(): x=%d" ,x);
+    
+    //Too many User-defined group ids should be max of 32 but there are 33 here), should get an error
+    //"You have exceeded the number of Group IDs you have allocated."
+    OstTrace0( MY_GROUP_ID1, TEST_MAINL6, "MainL()" );
+    OstTrace0( MY_GROUP_ID2, TEST_MAINL7, "MainL()" );
+    OstTrace0( MY_GROUP_ID3, TEST_MAINL8, "MainL()" );
+    OstTrace0( MY_GROUP_ID4, TEST_MAINL9, "MainL()" );
+    OstTrace0( MY_GROUP_ID5, TEST_MAINL10, "MainL()" );
+    OstTrace0( MY_GROUP_ID6, TEST_MAINL11, "MainL()" );
+    OstTrace0( MY_GROUP_ID7, TEST_MAINL12, "MainL()" );
+    OstTrace0( MY_GROUP_ID8, TEST_MAINL13, "MainL()" );
+    OstTrace0( MY_GROUP_ID9, TEST_MAINL14, "MainL()" );
+    OstTrace0( MY_GROUP_ID10, TEST_MAINL15, "MainL()" );
+    OstTrace0( MY_GROUP_ID11, TEST_MAINL16, "MainL()" );
+    OstTrace0( MY_GROUP_ID12, TEST_MAINL17, "MainL()" );
+    OstTrace0( MY_GROUP_ID13, TEST_MAINL18, "MainL()" );
+    OstTrace0( MY_GROUP_ID14, TEST_MAINL19, "MainL()" );
+    OstTrace0( MY_GROUP_ID15, TEST_MAINL20, "MainL()" );
+    OstTrace0( MY_GROUP_ID16, TEST_MAINL21, "MainL()" );
+    OstTrace0( MY_GROUP_ID17, TEST_MAINL22, "MainL()" );
+    OstTrace0( MY_GROUP_ID18, TEST_MAINL23, "MainL()" );
+    OstTrace0( MY_GROUP_ID19, TEST_MAINL24, "MainL()" );
+    OstTrace0( MY_GROUP_ID20, TEST_MAINL25, "MainL()" );
+    OstTrace0( MY_GROUP_ID21, TEST_MAINL26, "MainL()" );
+    OstTrace0( MY_GROUP_ID22, TEST_MAINL27, "MainL()" );
+    OstTrace0( MY_GROUP_ID23, TEST_MAINL28, "MainL()" );
+    OstTrace0( MY_GROUP_ID24, TEST_MAINL29, "MainL()" );
+    OstTrace0( MY_GROUP_ID25, TEST_MAINL30, "MainL()" );
+    OstTrace0( MY_GROUP_ID26, TEST_MAINL31, "MainL()" );
+    OstTrace0( MY_GROUP_ID27, TEST_MAINL32, "MainL()" );
+    OstTrace0( MY_GROUP_ID28, TEST_MAINL33, "MainL()" );
+    OstTrace0( MY_GROUP_ID29, TEST_MAINL34, "MainL()" );
+    OstTrace0( MY_GROUP_ID30, TEST_MAINL35, "MainL()" );
+    OstTrace0( MY_GROUP_ID31, TEST_MAINL36, "MainL()" );
+    OstTrace0( MY_GROUP_ID32, TEST_MAINL37, "MainL()" );
+    OstTrace0( MY_GROUP_ID33, TEST_MAINL38, "MainL()" );    
+    /*****************************************************************************/
+    
+    
+    /******************************SHOULD GIVE WARNINGS***************************/
+    //Should get warnings from using deprecated GIDs
+    //e.g. "Deprecated group TRACE_API detected. Updating to TRACE_BORDER in dictionary. Please update source code!"
+    OstTrace0( TRACE_API, TEST_MAINL39, "MainL()" );  
+    OstTrace0( TRACE_IMPORTANT, TEST_MAINL40, "MainL()" );  
+    OstTrace0( TRACE_DETAILED, TEST_MAINL41, "MainL()" );
+    OstTrace0( TRACE_DEBUG, TEST_MAINL42, "MainL()" );  
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    console->Write(_L("Hello, world!\n"));
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    MainL();
+
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(
+            KConsFullScreen, KConsFullScreen)));
+    if (createError)
+        return createError;
+
+    // Run application code inside TRAP harness, wait keypress when terminated
+    TRAPD(mainError, DoStartL());
+    if (mainError)
+        console->Printf(KTextFailed, mainError);
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/src/MultipleMmpTraceErrorApp2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,158 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleMmpTraceErrorApp.h"
+#include <e32base.h>
+#include <e32std.h>
+#include <e32cons.h>			// Console
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpTraceErrorApp2Traces.h"
+#endif
+
+//  Constants
+
+_LIT(KTextConsoleTitle, "Console");
+_LIT(KTextFailed, " failed, leave code = %d");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+//  Global Variables
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+
+//  Local Functions
+
+LOCAL_C void MainL()
+    {
+    /****************************SHOULD GIVE ERRORS*******************************/
+    _LIT8(KTestDes,"Test Descriptor");
+    TInt32 x = 555;
+    TUint32 y = 666;
+    
+    //In these two cases Trace Compiler should give a error that an extension macro isn't necessary:
+    //"TraceErrorApp.cpp, line xx: Trace does not need to use extension macro"
+    OstTraceExt1( TRACE_FLOW, TEST1_MAINL, "MainL(): x=%d" , x );
+    OstTraceExt1( TRACE_FLOW, TEST2_MAINL, "MainL(): y=%u" , y );
+    
+    //This should give an error stating that the trace name is duplicated
+    //"TraceErrorApp.cpp, line xx: Trace is used from multiple places"
+    OstTrace0( TRACE_FLOW, TEST3_MAINL, "MainL()" );
+    OstTrace0( TRACE_FLOW, TEST3_MAINL, "MainL()" );
+    
+    //This should NOT give an error stating that the arguments don't match format spec
+    //OstTraceExt2( TRACE_FLOW, TEST4_MAINL, "MainL(): x=%d;KTestDes=%d", x, KTestDes );
+
+    //Wrong API i.e more parameters than it takes
+    //"TraceErrorApp.cpp, line xx: Parameter count does not match the format specification"
+    OstTrace0( TRACE_FLOW, TEST5_MAINL, "MainL(): x=%d" ,x);
+    
+    //Too many User-defined group ids should be max of 32 but there are 33 here), should get an error
+    //"You have exceeded the number of Group IDs you have allocated."
+    OstTrace0( MY_GROUP_ID1, TEST_MAINL6, "MainL()" );
+    OstTrace0( MY_GROUP_ID2, TEST_MAINL7, "MainL()" );
+    OstTrace0( MY_GROUP_ID3, TEST_MAINL8, "MainL()" );
+    OstTrace0( MY_GROUP_ID4, TEST_MAINL9, "MainL()" );
+    OstTrace0( MY_GROUP_ID5, TEST_MAINL10, "MainL()" );
+    OstTrace0( MY_GROUP_ID6, TEST_MAINL11, "MainL()" );
+    OstTrace0( MY_GROUP_ID7, TEST_MAINL12, "MainL()" );
+    OstTrace0( MY_GROUP_ID8, TEST_MAINL13, "MainL()" );
+    OstTrace0( MY_GROUP_ID9, TEST_MAINL14, "MainL()" );
+    OstTrace0( MY_GROUP_ID10, TEST_MAINL15, "MainL()" );
+    OstTrace0( MY_GROUP_ID11, TEST_MAINL16, "MainL()" );
+    OstTrace0( MY_GROUP_ID12, TEST_MAINL17, "MainL()" );
+    OstTrace0( MY_GROUP_ID13, TEST_MAINL18, "MainL()" );
+    OstTrace0( MY_GROUP_ID14, TEST_MAINL19, "MainL()" );
+    OstTrace0( MY_GROUP_ID15, TEST_MAINL20, "MainL()" );
+    OstTrace0( MY_GROUP_ID16, TEST_MAINL21, "MainL()" );
+    OstTrace0( MY_GROUP_ID17, TEST_MAINL22, "MainL()" );
+    OstTrace0( MY_GROUP_ID18, TEST_MAINL23, "MainL()" );
+    OstTrace0( MY_GROUP_ID19, TEST_MAINL24, "MainL()" );
+    OstTrace0( MY_GROUP_ID20, TEST_MAINL25, "MainL()" );
+    OstTrace0( MY_GROUP_ID21, TEST_MAINL26, "MainL()" );
+    OstTrace0( MY_GROUP_ID22, TEST_MAINL27, "MainL()" );
+    OstTrace0( MY_GROUP_ID23, TEST_MAINL28, "MainL()" );
+    OstTrace0( MY_GROUP_ID24, TEST_MAINL29, "MainL()" );
+    OstTrace0( MY_GROUP_ID25, TEST_MAINL30, "MainL()" );
+    OstTrace0( MY_GROUP_ID26, TEST_MAINL31, "MainL()" );
+    OstTrace0( MY_GROUP_ID27, TEST_MAINL32, "MainL()" );
+    OstTrace0( MY_GROUP_ID28, TEST_MAINL33, "MainL()" );
+    OstTrace0( MY_GROUP_ID29, TEST_MAINL34, "MainL()" );
+    OstTrace0( MY_GROUP_ID30, TEST_MAINL35, "MainL()" );
+    OstTrace0( MY_GROUP_ID31, TEST_MAINL36, "MainL()" );
+    OstTrace0( MY_GROUP_ID32, TEST_MAINL37, "MainL()" );
+    OstTrace0( MY_GROUP_ID33, TEST_MAINL38, "MainL()" );    
+    /*****************************************************************************/
+    
+    
+    /******************************SHOULD GIVE WARNINGS***************************/
+    //Should get warnings from using deprecated GIDs
+    //e.g. "Deprecated group TRACE_API detected. Updating to TRACE_BORDER in dictionary. Please update source code!"
+    OstTrace0( TRACE_API, TEST_MAINL39, "MainL()" );  
+    OstTrace0( TRACE_IMPORTANT, TEST_MAINL40, "MainL()" );  
+    OstTrace0( TRACE_DETAILED, TEST_MAINL41, "MainL()" );
+    OstTrace0( TRACE_DEBUG, TEST_MAINL42, "MainL()" );  
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    console->Write(_L("Hello, world!\n"));
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    MainL();
+
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(
+            KConsFullScreen, KConsFullScreen)));
+    if (createError)
+        return createError;
+
+    // Run application code inside TRAP harness, wait keypress when terminated
+    TRAPD(mainError, DoStartL());
+    if (mainError)
+        console->Printf(KTextFailed, mainError);
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/traces/OstTraceDefinitions.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2010 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/tracefw/tracecompiler/test/MultipleMmpTraceErrorApps/traces/fixed_id.definitions	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,9 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TRACE_BORDER=0x84
+[GROUP]TRACE_DUMP=0x89
+[GROUP]TRACE_IMPORTANT=0x85
+[GROUP]TRACE_INTERNALS=0x88
+[TRACE]TRACE_BORDER[0x84]_TEST_MAINL39=0x1
+[TRACE]TRACE_DUMP[0x89]_TEST_MAINL42=0x1
+[TRACE]TRACE_IMPORTANT[0x85]_TEST_MAINL40=0x1
+[TRACE]TRACE_INTERNALS[0x88]_TEST_MAINL41=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TraceErrorApp/data/referencelog.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,10 @@
+error: You have exceeded the number of Group IDs you have allocated.
+warning: Deprecated group TRACE_API detected. Updating to TRACE_BORDER in dictionary. Please update source code!
+warning: Deprecated group TRACE_DETAILED detected. Updating to TRACE_INTERNALS in dictionary. Please update source code!
+warning: Deprecated group TRACE_DEBUG detected. Updating to TRACE_DUMP in dictionary. Please update source code!
+error: TraceErrorApp.cpp, line 52: Trace does not need to use extension macro
+error: TraceErrorApp.cpp, line 53: Trace does not need to use extension macro
+error: TraceErrorApp.cpp, line 57: Trace is used from multiple places
+error: TraceErrorApp.cpp, line 58: Trace is used from multiple places
+error: TraceErrorApp.cpp, line 65: Parameter count does not match the format specification
+error: TraceErrorApp.cpp, line 101: Run out of Group IDs. You can try to reuse unused group ids by deleting fixed id definition file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TraceErrorApp/group/TraceErrorApp.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  TraceErrorApp.exe
+TARGETTYPE	  exe
+UID			 0 0xE8576D92
+
+APP_LAYER_SYSTEMINCLUDE
+
+USERINCLUDE	 ../inc
+USERINCLUDE  ../traces
+
+SOURCEPATH	  ../src
+SOURCE		  TraceErrorApp.cpp
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+  DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TraceErrorApp/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+TraceErrorApp.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TraceErrorApp/inc/TraceErrorApp.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2010 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 __TRACEERRORAPP_H__
+#define __TRACEERRORAPP_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+
+#endif  // __TRACEERRORAPP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TraceErrorApp/sis/TraceErrorApp_EKA2.pkg	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+;
+; Copyright (c) 2010 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: 
+;
+; Installation file for Symbian OS 9.x for generic console application
+; Installation file for TraceErrorApp EXE
+;
+; This is an auto-generated PKG file by Carbide.
+; This file uses variables specific to Carbide builds that will not work
+; on command-line builds. If you want to use this generated PKG file from the
+; command-line tools you will need to modify the variables with the appropriate
+; values: $(EPOCROOT), $(PLATFORM), $(TARGET)
+;
+
+;
+; UID is the exe's UID
+;
+#{"TraceErrorApp EXE"},(0xE8576D92),1,0,0
+
+
+;Localised Vendor name
+%{"Vendor-EN"}
+
+;Unique Vendor name
+:"Vendor"
+
+"$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\TraceErrorApp.exe"		  -"!:\sys\bin\TraceErrorApp.exe"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TraceErrorApp/src/TraceErrorApp.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,155 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "TraceErrorApp.h"
+#include <e32base.h>
+#include <e32std.h>
+#include <e32cons.h>			// Console
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "TraceErrorAppTraces.h"
+#endif
+
+//  Constants
+
+_LIT(KTextConsoleTitle, "Console");
+_LIT(KTextFailed, " failed, leave code = %d");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+//  Global Variables
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+
+//  Local Functions
+
+LOCAL_C void MainL()
+    {
+    /****************************SHOULD GIVE ERRORS*******************************/
+    _LIT8(KTestDes,"Test Descriptor");
+    TInt32 x = 555;
+    TUint32 y = 666;
+    
+    //In these two cases Trace Compiler should give a error that an extension macro isn't necessary:
+    //"TraceErrorApp.cpp, line xx: Trace does not need to use extension macro"
+    OstTraceExt1( TRACE_FLOW, TEST1_MAINL, "MainL(): x=%d" , x );
+    OstTraceExt1( TRACE_FLOW, TEST2_MAINL, "MainL(): y=%u" , y );
+    
+    //This should give an error stating that the trace name is duplicated
+    //"TraceErrorApp.cpp, line xx: Trace is used from multiple places"
+    OstTrace0( TRACE_FLOW, TEST3_MAINL, "MainL()" );
+    OstTrace0( TRACE_FLOW, TEST3_MAINL, "MainL()" );
+    
+    //This should NOT give an error stating that the arguments don't match format spec
+    //OstTraceExt2( TRACE_FLOW, TEST4_MAINL, "MainL(): x=%d;KTestDes=%d", x, KTestDes );
+
+    //Wrong API i.e more parameters than it takes
+    //"TraceErrorApp.cpp, line xx: Parameter count does not match the format specification"
+    OstTrace0( TRACE_FLOW, TEST5_MAINL, "MainL(): x=%d" ,x);
+    
+    //Too many User-defined group ids should be max of 32 but there are 33 here), should get an error
+    //"You have exceeded the number of Group IDs you have allocated."
+    OstTrace0( MY_GROUP_ID1, TEST_MAINL6, "MainL()" );
+    OstTrace0( MY_GROUP_ID2, TEST_MAINL7, "MainL()" );
+    OstTrace0( MY_GROUP_ID3, TEST_MAINL8, "MainL()" );
+    OstTrace0( MY_GROUP_ID4, TEST_MAINL9, "MainL()" );
+    OstTrace0( MY_GROUP_ID5, TEST_MAINL10, "MainL()" );
+    OstTrace0( MY_GROUP_ID6, TEST_MAINL11, "MainL()" );
+    OstTrace0( MY_GROUP_ID7, TEST_MAINL12, "MainL()" );
+    OstTrace0( MY_GROUP_ID8, TEST_MAINL13, "MainL()" );
+    OstTrace0( MY_GROUP_ID9, TEST_MAINL14, "MainL()" );
+    OstTrace0( MY_GROUP_ID10, TEST_MAINL15, "MainL()" );
+    OstTrace0( MY_GROUP_ID11, TEST_MAINL16, "MainL()" );
+    OstTrace0( MY_GROUP_ID12, TEST_MAINL17, "MainL()" );
+    OstTrace0( MY_GROUP_ID13, TEST_MAINL18, "MainL()" );
+    OstTrace0( MY_GROUP_ID14, TEST_MAINL19, "MainL()" );
+    OstTrace0( MY_GROUP_ID15, TEST_MAINL20, "MainL()" );
+    OstTrace0( MY_GROUP_ID16, TEST_MAINL21, "MainL()" );
+    OstTrace0( MY_GROUP_ID17, TEST_MAINL22, "MainL()" );
+    OstTrace0( MY_GROUP_ID18, TEST_MAINL23, "MainL()" );
+    OstTrace0( MY_GROUP_ID19, TEST_MAINL24, "MainL()" );
+    OstTrace0( MY_GROUP_ID20, TEST_MAINL25, "MainL()" );
+    OstTrace0( MY_GROUP_ID21, TEST_MAINL26, "MainL()" );
+    OstTrace0( MY_GROUP_ID22, TEST_MAINL27, "MainL()" );
+    OstTrace0( MY_GROUP_ID23, TEST_MAINL28, "MainL()" );
+    OstTrace0( MY_GROUP_ID24, TEST_MAINL29, "MainL()" );
+    OstTrace0( MY_GROUP_ID25, TEST_MAINL30, "MainL()" );
+    OstTrace0( MY_GROUP_ID26, TEST_MAINL31, "MainL()" );
+    OstTrace0( MY_GROUP_ID27, TEST_MAINL32, "MainL()" );
+    OstTrace0( MY_GROUP_ID28, TEST_MAINL33, "MainL()" );
+    OstTrace0( MY_GROUP_ID29, TEST_MAINL34, "MainL()" );
+    OstTrace0( MY_GROUP_ID30, TEST_MAINL35, "MainL()" );
+    OstTrace0( MY_GROUP_ID31, TEST_MAINL36, "MainL()" );
+    OstTrace0( MY_GROUP_ID32, TEST_MAINL37, "MainL()" );
+    OstTrace0( MY_GROUP_ID33, TEST_MAINL38, "MainL()" );    
+    /*****************************************************************************/
+    
+    
+    /******************************SHOULD GIVE WARNINGS***************************/
+    //Should get warnings from using deprecated GIDs
+    //e.g. "Deprecated group TRACE_API detected. Updating to TRACE_BORDER in dictionary. Please update source code!"
+    OstTrace0( TRACE_API, TEST_MAINL39, "MainL()" );  
+    OstTrace0( TRACE_IMPORTANT, TEST_MAINL40, "MainL()" );  
+    OstTrace0( TRACE_DETAILED, TEST_MAINL41, "MainL()" );
+    OstTrace0( TRACE_DEBUG, TEST_MAINL42, "MainL()" );  
+    /*****************************************************************************/
+    console->Write(_L("Hello, world!\n"));
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    MainL();
+
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(
+            KConsFullScreen, KConsFullScreen)));
+    if (createError)
+        return createError;
+
+    // Run application code inside TRAP harness, wait keypress when terminated
+    TRAPD(mainError, DoStartL());
+    if (mainError)
+        console->Printf(KTextFailed, mainError);
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TraceErrorApp/traces/OstTraceDefinitions.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2010 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/tracefw/tracecompiler/test/TraceErrorApp/traces/fixed_id.definitions	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,9 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TRACE_BORDER=0x84
+[GROUP]TRACE_DUMP=0x89
+[GROUP]TRACE_IMPORTANT=0x85
+[GROUP]TRACE_INTERNALS=0x88
+[TRACE]TRACE_BORDER[0x84]_TEST_MAINL39=0x1
+[TRACE]TRACE_DUMP[0x89]_TEST_MAINL42=0x1
+[TRACE]TRACE_IMPORTANT[0x85]_TEST_MAINL40=0x1
+[TRACE]TRACE_INTERNALS[0x88]_TEST_MAINL41=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/console/group/HelloTraceConsole.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceConsole.exe
+TARGETTYPE	  exe
+UID			  0 0xE40349E4
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE	   ../inc
+USERINCLUDE    ../../dll/inc
+USERINCLUDE    ../traces
+
+SOURCEPATH	  ../src
+SOURCE		  HelloTraceConsole.cpp
+
+LIBRARY		  euser.lib
+LIBRARY       HelloTraceDll.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/console/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotraceconsole.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotraceconsole.iby)
+
+PRJ_MMPFILES
+HelloTraceConsole.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/console/group/hellotraceconsole.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACECONSOLE_IBY
+#define HELLOTRACECONSOLE_IBY
+
+#include <core\os\hellotracedll.iby>
+
+file=ABI_DIR\BUILD_DIR\hellotraceconsole.exe    Sys\Bin\hellotraceconsole.exe
+
+#endif //HELLOTRACECONSOLE_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/console/inc/HelloTraceConsole.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACECONSOLE_H__
+#define __HELLOTRACECONSOLE_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+
+#endif  // __HELLOTRACECONSOLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/console/src/HelloTraceConsole.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32cons.h>			// Console
+
+#include "HelloTraceConsole.h"
+#include "HelloTraceExample.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceConsoleTraces.h"
+#endif
+
+
+_LIT(KTextConsoleTitle, "HelloTrace");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+LOCAL_C void DoExamples()
+    {
+    TInt err = KErrNone;
+
+    console->Printf(_L("Before main tracing examples ...\n"));
+
+    console->Printf(_L(" Before type examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::JustTypes());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+
+    console->Printf(_L(" Before Interface examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::Interface());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+    
+    console->Printf(_L(" Before FnEntryExit examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::FnEntryExit());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);    
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    DoExamples();
+    
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    OstTraceFunctionEntry0( E32MAIN_ENTRY );
+    
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, 
+          console = Console::NewL(KTextConsoleTitle, 
+                                  TSize(KConsFullScreen, KConsFullScreen)));    
+    if (createError)
+        {
+        delete cleanup;
+        OstTrace1( TRACE_ERROR, E32MAIN_CREATE_ERROR, "Failed to create console error: %d", createError);
+        OstTraceFunctionExit0( E32MAIN_EXIT_ERR );
+        return createError;
+        }
+
+    TRAPD(mainError, DoStartL());    
+    if (mainError)
+        {
+        OstTrace1( TRACE_ERROR, E32MAIN_START_ERROR, "DoStartL failed with error: %d", mainError);
+        console->Printf(_L("DoStartL failed with error: %d\n\n"), mainError);
+        }
+    else 
+        {
+        console->Printf(_L("Before panic tracing example ..."));
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+    
+        OstTrace0( TRACE_FLOW, E32MAIN_BEFORE_PANIC, "About to cause a panic ..." );
+        HelloTraceExample::PanicTrace();
+        
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+        }
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    
+    OstTraceFunctionExit0( E32MAIN_EXIT );
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/bwins/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,14 @@
+EXPORTS
+	?Version@CHelloTraceInterface@@SA?AVTVersion@@XZ @ 1 NONAME ; class TVersion CHelloTraceInterface::Version(void)
+	?NewLC@CHelloTraceInterface@@SAPAV1@XZ @ 2 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewLC(void)
+	?JustTypes@HelloTraceExample@@SAXXZ @ 3 NONAME ; void HelloTraceExample::JustTypes(void)
+	?Interface@HelloTraceExample@@SAXXZ @ 4 NONAME ; void HelloTraceExample::Interface(void)
+	?FnEntryExit@HelloTraceExample@@SAXXZ @ 5 NONAME ; void HelloTraceExample::FnEntryExit(void)
+	?ResetString@CHelloTraceInterface@@QAEXXZ @ 6 NONAME ; void CHelloTraceInterface::ResetString(void)
+	?AddCharL@CHelloTraceInterface@@QAEXABVTChar@@@Z @ 7 NONAME ; void CHelloTraceInterface::AddCharL(class TChar const &)
+	?PanicTrace@HelloTraceExample@@SAXXZ @ 8 NONAME ; void HelloTraceExample::PanicTrace(void)
+	??1CHelloTraceInterface@@UAE@XZ @ 9 NONAME ; CHelloTraceInterface::~CHelloTraceInterface(void)
+	?String@CHelloTraceInterface@@QBE?BVTPtrC16@@XZ @ 10 NONAME ; class TPtrC16 const CHelloTraceInterface::String(void) const
+	?RemoveLast@CHelloTraceInterface@@QAEXXZ @ 11 NONAME ; void CHelloTraceInterface::RemoveLast(void)
+	?NewL@CHelloTraceInterface@@SAPAV1@XZ @ 12 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewL(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/eabi/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,20 @@
+EXPORTS
+	_ZN17HelloTraceExample10PanicTraceEv @ 1 NONAME
+	_ZN17HelloTraceExample11FnEntryExitEv @ 2 NONAME
+	_ZN17HelloTraceExample9InterfaceEv @ 3 NONAME
+	_ZN17HelloTraceExample9JustTypesEv @ 4 NONAME
+	_ZN20CHelloTraceInterface10RemoveLastEv @ 5 NONAME
+	_ZN20CHelloTraceInterface11ResetStringEv @ 6 NONAME
+	_ZN20CHelloTraceInterface4NewLEv @ 7 NONAME
+	_ZN20CHelloTraceInterface5NewLCEv @ 8 NONAME
+	_ZN20CHelloTraceInterface7VersionEv @ 9 NONAME
+	_ZN20CHelloTraceInterface8AddCharLERK5TChar @ 10 NONAME
+	_ZN20CHelloTraceInterfaceD0Ev @ 11 NONAME
+	_ZN20CHelloTraceInterfaceD1Ev @ 12 NONAME
+	_ZN20CHelloTraceInterfaceD2Ev @ 13 NONAME
+	_ZNK20CHelloTraceInterface6StringEv @ 14 NONAME
+	_ZTI13CHelloTraceFn @ 15 NONAME
+	_ZTI20CHelloTraceInterface @ 16 NONAME
+	_ZTV13CHelloTraceFn @ 17 NONAME
+	_ZTV20CHelloTraceInterface @ 18 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/group/HelloTraceDll.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceDll.dll
+TARGETTYPE	  dll
+UID			  0x1000008d 0xE43DF43E
+CAPABILITY    ReadUserData
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE  ../inc ../incDup
+USERINCLUDE  ../traces
+
+SOURCEPATH	 ../src
+SOURCE       HelloTraceExample.cpp 
+SOURCE       HelloTraceTypes.cpp
+SOURCE       HelloTraceInterface.cpp 
+SOURCE       HelloTraceFn.cpp 
+SOURCE       HelloTracePanic.cpp 
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/group/HelloTraceDll2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceDll2.dll
+TARGETTYPE	  dll
+UID			  0x1000008d 0xE43DF43F
+CAPABILITY    ReadUserData
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE  ../inc ../incDup
+USERINCLUDE  ../traces
+
+SOURCEPATH	 ../src
+SOURCE       HelloTraceExample.cpp 
+SOURCE       HelloTraceTypes.cpp
+SOURCE       HelloTraceInterface.cpp 
+SOURCE       HelloTraceFn.cpp 
+SOURCE       HelloTracePanic.cpp 
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotracedll.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotracedll.iby)
+
+PRJ_MMPFILES
+HelloTraceDll.mmp
+HelloTraceDll2.mmp
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/group/hellotracedll.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,23 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACEDLL_IBY
+#define HELLOTRACEDLL_IBY
+
+file=ABI_DIR\BUILD_DIR\hellotracedll.dll        Sys\Bin\hellotracedll.dll
+file=ABI_DIR\BUILD_DIR\hellotracedll2.dll        Sys\Bin\hellotracedll2.dll
+
+#endif //HELLOTRACEDLL_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceExample.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEEXAMPLE_H__
+#define __HELLOTRACEEXAMPLE_H__
+
+#include <e32std.h>
+
+class HelloTraceExample
+    {
+public:
+    IMPORT_C static void JustTypes();    
+    IMPORT_C static void Interface();    
+    IMPORT_C static void FnEntryExit();    
+    IMPORT_C static void PanicTrace();    
+
+    // @TODO add examples for state macros
+    // @TODO add examples for event macros
+    // @TODO add examples for OstTraceData
+    // @TODO add compile-time selector examples
+    // @TODO add macro wrapper examples
+    };
+
+#endif  // __HELLOTRACEEXAMPLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceFn.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFN_H_
+#define HELLOTRACEFN_H_
+
+#include <e32base.h>    // CBase
+
+class CHelloTraceFn : public CBase
+    {
+public:
+    
+    // Note the Trace Builder will only parse this if it's in a cpp file
+    // but not from here :(
+    // Also if you add a new enum you need to reparse the enum - it doesn't
+    // get automatically reparsed by the Trace Compiler :(
+    enum TFnEnum
+        {
+        EExample1,
+        EExample2 = 2, 
+        // EExample3 = EExample2 + 1, // The Trace Builder can't parse this :(
+        };
+    
+public:
+    static CHelloTraceFn* NewL();
+    static CHelloTraceFn* NewLC();
+    ~CHelloTraceFn();
+   
+public: // Fn entry / exit tracing examples 
+    void Simple();
+    void OutputsParams(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValue();
+    TInt64 OutputsTInt64ReturnValue();
+    TFnEnum OutputsTFnEnumReturnValue();
+
+    CActive* OutputsUnknownPtrType(CActive* aActive);
+    CActive& OutputsUnknownRefType(CActive& aActive);
+    
+    void OutputMissingParams(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFn(TInt aDbgParam);
+#else
+    void PreProcessedFn();
+#endif
+    
+    static void StaticOutputsParamsL(TInt aParam);  
+    
+    // duplicate all the function and put the impl in the header file HelloTraceFnDup.h
+    void SimpleDup();
+    void OutputsParamsDup(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup();
+    TInt64 OutputsTInt64ReturnValueDup();
+    TFnEnum OutputsTFnEnumReturnValueDup();
+
+    CActive* OutputsUnknownPtrTypeDup(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup(CActive& aActive);
+    
+    void OutputMissingParamsDup(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup(TInt aDbgParam);
+#else
+    void PreProcessedFnDup();
+#endif
+    static void StaticOutputsParamsDupL(TInt aParam);  
+    
+    // duplicate all the function again and put the impl in the header file HelloTraceFnDup2.h
+    void SimpleDup2();
+    void OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup2();
+    TInt64 OutputsTInt64ReturnValueDup2();
+    TFnEnum OutputsTFnEnumReturnValueDup2();
+
+    CActive* OutputsUnknownPtrTypeDup2(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup2(CActive& aActive);
+    
+    void OutputMissingParamsDup2(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup2(TInt aDbgParam);
+#else
+    void PreProcessedFnDup2();
+#endif
+    static void StaticOutputsParamsDup2L(TInt aParam);  
+
+
+private:
+    CHelloTraceFn();
+    };
+
+#endif /* HELLOTRACEFN_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceFn2.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFN2_H_
+#define HELLOTRACEFN2_H_
+
+#include <e32base.h>    // CBase
+
+class CHelloTraceFn : public CBase
+    {
+public:
+    
+    // Note the Trace Builder will only parse this if it's in a cpp file
+    // but not from here :(
+    // Also if you add a new enum you need to reparse the enum - it doesn't
+    // get automatically reparsed by the Trace Compiler :(
+    enum TFnEnum
+        {
+        EExample1,
+        EExample2 = 2, 
+        // EExample3 = EExample2 + 1, // The Trace Builder can't parse this :(
+        };
+    
+public:
+    static CHelloTraceFn* NewL();
+    static CHelloTraceFn* NewLC();
+    ~CHelloTraceFn();
+   
+public: // Fn entry / exit tracing examples 
+    void Simple();
+    void OutputsParams(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValue();
+    TInt64 OutputsTInt64ReturnValue();
+    TFnEnum OutputsTFnEnumReturnValue();
+
+    CActive* OutputsUnknownPtrType(CActive* aActive);
+    CActive& OutputsUnknownRefType(CActive& aActive);
+    
+    void OutputMissingParams(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFn(TInt aDbgParam);
+#else
+    void PreProcessedFn();
+#endif
+    
+    static void StaticOutputsParamsL(TInt aParam);  
+    
+    // duplicate all the function and put the impl in the header file HelloTraceFnDup.h
+    void SimpleDup();
+    void OutputsParamsDup(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup();
+    TInt64 OutputsTInt64ReturnValueDup();
+    TFnEnum OutputsTFnEnumReturnValueDup();
+
+    CActive* OutputsUnknownPtrTypeDup(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup(CActive& aActive);
+    
+    void OutputMissingParamsDup(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup(TInt aDbgParam);
+#else
+    void PreProcessedFnDup();
+#endif
+    static void StaticOutputsParamsDupL(TInt aParam);  
+    
+    // duplicate all the function again and put the impl in the header file HelloTraceFnDup2.h
+    void SimpleDup2();
+    void OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup2();
+    TInt64 OutputsTInt64ReturnValueDup2();
+    TFnEnum OutputsTFnEnumReturnValueDup2();
+
+    CActive* OutputsUnknownPtrTypeDup2(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup2(CActive& aActive);
+    
+    void OutputMissingParamsDup2(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup2(TInt aDbgParam);
+#else
+    void PreProcessedFnDup2();
+#endif
+    static void StaticOutputsParamsDup2L(TInt aParam);  
+
+
+private:
+    CHelloTraceFn();
+    };
+
+#endif /* HELLOTRACEFN2_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceInterface.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE_H__
+#define __HELLOTRACEINTERFACE_H__
+
+#include <e32base.h>	// CBase
+#include <e32std.h>	 // TBuf
+
+const TInt KHelloTraceDllBufferLength = 10;
+typedef TBuf<KHelloTraceDllBufferLength> THelloTraceDllExampleString;
+
+class CHelloTraceInterface : public CBase
+    {
+public:
+    IMPORT_C static CHelloTraceInterface* NewL();
+    IMPORT_C static CHelloTraceInterface* NewLC();
+    IMPORT_C ~CHelloTraceInterface();
+
+public:
+    IMPORT_C static TVersion Version();
+    IMPORT_C const TPtrC String() const;
+    IMPORT_C void AddCharL(const TChar& aChar);
+    IMPORT_C void RemoveLast();
+    IMPORT_C void ResetString();
+    
+    IMPORT_C static TVersion VersionDup();
+    IMPORT_C const TPtrC StringDup() const;
+    IMPORT_C void AddCharDupL(const TChar& aChar);
+    IMPORT_C void RemoveLastDup();
+    IMPORT_C void ResetStringDup();
+
+    IMPORT_C static TVersion VersionDup2();
+    IMPORT_C const TPtrC StringDup2() const;
+    IMPORT_C void AddCharDup2L(const TChar& aChar);
+    IMPORT_C void RemoveLastDup2();
+    IMPORT_C void ResetStringDup2();
+private:
+    CHelloTraceInterface();
+    void ConstructL();
+
+private:
+    // data
+    THelloTraceDllExampleString* iString;
+    };
+
+#endif  // __HELLOTRACEINTERFACE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceInterface2.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE2_H__
+#define __HELLOTRACEINTERFACE2_H__
+
+#include <e32base.h>	// CBase
+#include <e32std.h>	 // TBuf
+
+const TInt KHelloTraceDllBufferLength = 10;
+typedef TBuf<KHelloTraceDllBufferLength> THelloTraceDllExampleString;
+
+class CHelloTraceInterface : public CBase
+    {
+public:
+    IMPORT_C static CHelloTraceInterface* NewL();
+    IMPORT_C static CHelloTraceInterface* NewLC();
+    IMPORT_C ~CHelloTraceInterface();
+
+public:
+    IMPORT_C static TVersion Version();
+    IMPORT_C const TPtrC String() const;
+    IMPORT_C void AddCharL(const TChar& aChar);
+    IMPORT_C void RemoveLast();
+    IMPORT_C void ResetString();
+    
+    IMPORT_C static TVersion VersionDup();
+    IMPORT_C const TPtrC StringDup() const;
+    IMPORT_C void AddCharDupL(const TChar& aChar);
+    IMPORT_C void RemoveLastDup();
+    IMPORT_C void ResetStringDup();
+
+    IMPORT_C static TVersion VersionDup2();
+    IMPORT_C const TPtrC StringDup2() const;
+    IMPORT_C void AddCharDup2L(const TChar& aChar);
+    IMPORT_C void RemoveLastDup2();
+    IMPORT_C void ResetStringDup2();
+private:
+    CHelloTraceInterface();
+    void ConstructL();
+
+private:
+    // data
+    THelloTraceDllExampleString* iString;
+    };
+
+#endif  // __HELLOTRACEINTERFACE2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTracePanic.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEDLL_PAN__
+#define __HELLOTRACEDLL_PAN__
+
+//  Data Types
+
+enum THelloTraceDllPanic
+    {
+    EHelloTraceDllExamplePanic,
+    EHelloTraceDllNullPointer,
+    };
+
+//  Function Prototypes
+
+GLREF_C void Panic(THelloTraceDllPanic aPanic);
+
+#endif  // __HELLOTRACEDLL_PAN__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceTypes.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES_H__
+#define __HELLOTRACETYPES_H__
+
+class HelloTraceTypes
+    {
+public:
+    static void SignedIntegers();
+    static void UnsignedIntegers();
+    static void Descriptors();
+    
+    static void SignedIntegersDup();
+    static void UnsignedIntegersDup();
+    static void DescriptorsDup();
+        
+    static void SignedIntegersDup2();
+    static void UnsignedIntegersDup2();
+    static void DescriptorsDup2();
+    };
+
+#endif  // __HELLOTRACETYPES_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/inc/HelloTraceTypes2.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES2_H__
+#define __HELLOTRACETYPES2_H__
+
+class HelloTraceTypes
+    {
+public:
+    static void SignedIntegers();
+    static void UnsignedIntegers();
+    static void Descriptors();
+    
+    static void SignedIntegersDup();
+    static void UnsignedIntegersDup();
+    static void DescriptorsDup();
+        
+    static void SignedIntegersDup2();
+    static void UnsignedIntegersDup2();
+    static void DescriptorsDup2();
+    };
+
+#endif  // __HELLOTRACETYPES2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceFn2Dup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,156 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP2_H_
+#define HELLOTRACEFNDUP2_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFn2DupTraces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE2_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE2_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS2_DUP_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS2_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDupL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS2_DUP_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS2_DUP_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS2_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS2_DUP_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS2_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS2_DUP_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE2_DUP_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE2_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE2_DUP_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE2_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE2_DUP_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE2_DUP_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE2_DUP_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE2_DUP_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE2_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE2_DUP_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS2_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS2_DUP_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN2_DUP_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN2_DUP_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN2_DUP_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFN2DUP_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceFn2Dup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,156 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFN2DUP2_H_
+#define HELLOTRACEFN2DUP2_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFn2Dup2Traces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE2_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE2_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS2_DUP2_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS2_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDup2L(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS2_DUP2_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup2();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS2_DUP2_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS2_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS2_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS2_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS2_DUP2_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE2_DUP2_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE2_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE2_DUP2_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE2_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE2_DUP2_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE2_DUP2_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup2(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE2_DUP2_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE2_DUP2_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup2(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE2_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE2_DUP2_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup2(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS2_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS2_DUP2_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup2(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN2_DUP2_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup2()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN2_DUP2_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup2();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN2_DUP2_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFN2DUP2_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceFnDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP_H_
+#define HELLOTRACEFNDUP_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDupTraces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDupL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceFnDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP2_H_
+#define HELLOTRACEFNDUP2_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDup2Traces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDup2L(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup2();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup2(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup2(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup2(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup2(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup2()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup2();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP2_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceInterface2Dup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE2DUP_H__
+#define __HELLOTRACEINTERFACE2DUP_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterface2DupTraces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION2_DUP, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING2_DUP, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDupL(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL2_DUP, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR2_DUP,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST2_DUP, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN2_DUP, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING2_DUP, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACE2DUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceInterface2Dup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE2DUP2_H__
+#define __HELLOTRACEINTERFACE2DUP2_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterface2Dup2Traces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup2()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION2_DUP2, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup2() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING2_DUP2, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDup2L(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL2_DUP2, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR2_DUP2,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup2()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST2_DUP2, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN2_DUP2, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup2()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING2_DUP2, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACE2DUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceInterfaceDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP_H__
+#define __HELLOTRACEINTERFACEDUP_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDupTraces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDupL(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceInterfaceDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP2_H__
+#define __HELLOTRACEINTERFACEDUP2_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDup2Traces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup2()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP2, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup2() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP2, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDup2L(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP2, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP2,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup2()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP2, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP2, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup2()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP2, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceTypes2Dup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES2DUP_H__
+#define __HELLOTRACETYPES2DUP_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypes2DupTraces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII2DUP, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE2DUP, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPES2DUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceTypes2Dup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES2DUP2_H__
+#define __HELLOTRACETYPES2DUP2_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypes2Dup2Traces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup2()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP2_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP2_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP2_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP2_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup2()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP2_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP2_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP2_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP2_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup2()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII2DUP2, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE2DUP2, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPES2DUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceTypesDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP_H__
+#define __HELLOTRACETYPESDUP_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDupTraces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/incDup/HelloTraceTypesDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP2_H__
+#define __HELLOTRACETYPESDUP2_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDup2Traces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup2()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup2()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup2()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP2, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP2, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/src/HelloTraceExample.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceExample.h"
+#include "HelloTraceTypes.h"
+#include "HelloTraceInterface.h"
+#include "HelloTraceFn.h"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceExampleTraces.h"
+#endif
+
+EXPORT_C void HelloTraceExample::JustTypes()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_JUSTTYPES, "*********************************************** " );
+    
+    HelloTraceTypes::SignedIntegers();
+    HelloTraceTypes::UnsignedIntegers();
+    HelloTraceTypes::Descriptors();    
+    }
+
+EXPORT_C void HelloTraceExample::Interface()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_INTERFACE, "*********************************************** " );
+    
+    TVersion version = CHelloTraceInterface::Version();   
+    if (version.iMajor >= 1) 
+        {
+        CHelloTraceInterface* example = CHelloTraceInterface::NewLC();
+        example->AddCharL('H');
+        example->AddCharL('e');
+        example->AddCharL('l');
+        example->AddCharL('l');
+        example->AddCharL('o');
+        example->AddCharL('T');        
+        example->RemoveLast();        
+        example->AddCharL(' ');
+        example->AddCharL('T');
+        example->AddCharL('r');
+        example->AddCharL('a');
+        example->AddCharL('c');
+        example->AddCharL('e');
+        example->AddCharL('!');
+        CleanupStack::PopAndDestroy(example);
+        }
+    else
+        {
+        OstTrace0( TRACE_ERROR, HELLOTRACEEXAMPLE_UNSUPPORTED_VERSION, "Unsupported version!");
+        }
+    }
+
+EXPORT_C void HelloTraceExample::FnEntryExit()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_FNENTRYEXIT, "*********************************************** " );
+       
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    CIdle* idle = CIdle::NewL(CActive::EPriorityIdle);
+    CleanupStack::PushL(idle);
+
+    CHelloTraceFn::StaticOutputsParamsL(1);
+   
+    example->Simple();
+    example->OutputsParams(2, CHelloTraceFn::EExample1);
+    example->OutputsParams(3, CHelloTraceFn::EExample2);
+    example->OutputsSignedIntegers(-4, -5, -6, -7);
+    example->OutputsUnsignedIntegers(8, 9, 10, 11);
+    example->OutputsTIntReturnValue();    
+    example->OutputsTInt64ReturnValue(); 
+    example->OutputsTFnEnumReturnValue();
+    example->OutputsUnknownPtrType(idle);    
+    example->OutputsUnknownRefType(*idle);
+#ifdef _DEBUG
+    example->PreProcessedFn(12);
+#else
+    example->PreProcessedFn();
+#endif
+    example->OutputMissingParams(13, 14, 15);
+
+    CleanupStack::PopAndDestroy(idle);
+    CleanupStack::PopAndDestroy(example);
+    }
+
+EXPORT_C void HelloTraceExample::PanicTrace()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_PANIC, "*********************************************** " );
+
+    Panic(EHelloTraceDllExamplePanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/src/HelloTraceFn.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+ 
+#include "HelloTraceFn.h"
+#include "HelloTraceFnDup.h"
+#include "HelloTraceFnDup2.inl"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnTraces.h"
+#endif
+
+CHelloTraceFn* CHelloTraceFn::NewLC()
+    {
+    CHelloTraceFn* self = new (ELeave) CHelloTraceFn;
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+CHelloTraceFn* CHelloTraceFn::NewL()
+    {
+    CHelloTraceFn* self = CHelloTraceFn::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceFn::CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_CTOR, "[0x%08x] Constructor", this );    
+    }
+
+CHelloTraceFn::~CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_DTOR, "[0x%08x] Destructor", this );    
+    }
+
+void CHelloTraceFn::Simple()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsParams(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_EXIT, this );
+    }
+
+void CHelloTraceFn::StaticOutputsParamsL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->Simple();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_EXIT );    
+    }
+
+void CHelloTraceFn::OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_EXIT, this );
+    }
+
+
+TInt CHelloTraceFn::OutputsTIntReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+TInt64 CHelloTraceFn::OutputsTInt64ReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_EXIT, this, ret );
+    return ret;    
+    }
+
+CActive* CHelloTraceFn::OutputsUnknownPtrType(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+CActive& CHelloTraceFn::OutputsUnknownRefType(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+void CHelloTraceFn::OutputMissingParams(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+void CHelloTraceFn::PreProcessedFn()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    Simple();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/src/HelloTraceInterface.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceInterface.h"
+#include "HelloTraceInterfaceDup.h"
+#include "HelloTraceInterfaceDup2.inl"
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceTraces.h"
+#endif
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewLC()
+    {
+    CHelloTraceInterface* self = new (ELeave) CHelloTraceInterface;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewL()
+    {
+    CHelloTraceInterface* self = CHelloTraceInterface::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceInterface::CHelloTraceInterface()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_CTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+void CHelloTraceInterface::ConstructL()
+    {
+    iString = new (ELeave) THelloTraceDllExampleString;
+    }
+
+EXPORT_C CHelloTraceInterface::~CHelloTraceInterface()
+    {
+    delete iString;
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_DTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+EXPORT_C TVersion CHelloTraceInterface::Version()
+    {
+    const TInt KMajor = 1;
+    const TInt KMinor = 0;
+    const TInt KBuild = 1;
+    TVersion version = TVersion(KMajor, KMinor, KBuild);
+    OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION, "CHelloTraceInterface::Version = %S", version.Name());   
+    return version;
+    }
+
+EXPORT_C const TPtrC CHelloTraceInterface::String() const
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING, 
+                     "[0x%08x] Returned %S", (TUint32) this, *iString);   
+    return *iString;
+    }
+
+EXPORT_C void CHelloTraceInterface::AddCharL(const TChar& aChar)
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL, 
+                  "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+    if (iString->Length() >= KHelloTraceDllBufferLength)
+        {
+        OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR,
+                   "[0x%08x] Not enough space to add character", (TUint32) this);
+        User::Leave( KErrTooBig);
+        }
+    iString->Append(aChar);
+    }
+
+EXPORT_C void CHelloTraceInterface::RemoveLast()
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST, 
+                  "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+    if (iString->Length() > 0)
+        {
+        iString->SetLength(iString->Length() - 1);
+        }
+    else
+        {
+        OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN, "[0x%08x] String already empty", (TUint32) this);   
+        }
+    }
+
+EXPORT_C void CHelloTraceInterface::ResetString()
+    {
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+    if (iString == NULL)
+        {
+        iString = new (ELeave) THelloTraceDllExampleString;
+        }
+    else
+        {
+        iString->SetLength(0);
+        }
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/src/HelloTracePanic.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32std.h>		 // GLDEF_C
+
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTracePanicTraces.h"
+#endif
+
+GLDEF_C void Panic(THelloTraceDllPanic aPanic)
+    {
+    OstTrace1( TRACE_FATAL, PANIC, "Panic(%{THelloTraceDllPanic})", (TUint) aPanic );    
+    User::Panic(_L("HelloTraceDll"), aPanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/src/HelloTraceTypes.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include <e32std.h>
+
+#include "HelloTraceTypes.h"
+#include "HelloTraceTypesDup.h"
+#include "HelloTraceTypesDup2.inl"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesTraces.h"
+#endif
+
+void HelloTraceTypes::SignedIntegers()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+void HelloTraceTypes::UnsignedIntegers()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+void HelloTraceTypes::Descriptors()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE, "16 bit descriptor: %S", KUnicode() );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/dll/traces/trace.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<trace_properties>
+<enum name="TFnEnum">
+<value id="0">EExample1</value>
+<value id="2">EExample2</value>
+</enum>
+<enum name="THelloTraceDllPanic">
+<value id="0">EHelloTraceDllExamplePanic</value>
+<value id="1">EHelloTraceDllNullPointer</value>
+</enum>
+<file>../incDup/HelloTraceInterfaceDup.h</file>
+<file>../incDup/HelloTraceInterfaceDup2.inl</file>
+<file>../incDup/HelloTraceFnDup.h</file>
+<file>../incDup/HelloTraceFnDup2.inl</file>
+<file>../incDup/HelloTraceTypesDup.h</file>
+<file>../incDup/HelloTraceTypesDup2.inl</file>
+<file>../incDup/HelloTraceInterface2Dup.h</file>
+<file>../incDup/HelloTraceInterface2Dup2.inl</file>
+<file>../incDup/HelloTraceFn2Dup.h</file>
+<file>../incDup/HelloTraceFn2Dup2.inl</file>
+<file>../incDup/HelloTraceTypes2Dup.h</file>
+<file>../incDup/HelloTraceTypes2Dup2.inl</file>
+</trace_properties>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,19 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+#include "../dll/group/bld.inf"
+#include "../console/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/console/group/HelloTraceConsole.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceConsole.exe
+TARGETTYPE	  exe
+UID			  0 0xE40349E4
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE	   ../inc
+USERINCLUDE    ../../dll/inc
+USERINCLUDE    ../traces
+
+SOURCEPATH	  ../src
+SOURCE		  HelloTraceConsole.cpp
+
+LIBRARY		  euser.lib
+LIBRARY       HelloTraceDll.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/console/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotraceconsole.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotraceconsole.iby)
+
+PRJ_MMPFILES
+HelloTraceConsole.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/console/group/hellotraceconsole.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACECONSOLE_IBY
+#define HELLOTRACECONSOLE_IBY
+
+#include <core\os\hellotracedll.iby>
+
+file=ABI_DIR\BUILD_DIR\hellotraceconsole.exe    Sys\Bin\hellotraceconsole.exe
+
+#endif //HELLOTRACECONSOLE_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/console/inc/HelloTraceConsole.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACECONSOLE_H__
+#define __HELLOTRACECONSOLE_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+
+#endif  // __HELLOTRACECONSOLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/console/src/HelloTraceConsole.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32cons.h>			// Console
+
+#include "HelloTraceConsole.h"
+#include "HelloTraceExample.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceConsoleTraces.h"
+#endif
+
+
+_LIT(KTextConsoleTitle, "HelloTrace");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+LOCAL_C void DoExamples()
+    {
+    TInt err = KErrNone;
+
+    console->Printf(_L("Before main tracing examples ...\n"));
+
+    console->Printf(_L(" Before type examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::JustTypes());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+
+    console->Printf(_L(" Before Interface examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::Interface());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+    
+    console->Printf(_L(" Before FnEntryExit examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::FnEntryExit());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);    
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    DoExamples();
+    
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    OstTraceFunctionEntry0( E32MAIN_ENTRY );
+    
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, 
+          console = Console::NewL(KTextConsoleTitle, 
+                                  TSize(KConsFullScreen, KConsFullScreen)));    
+    if (createError)
+        {
+        delete cleanup;
+        OstTrace1( TRACE_ERROR, E32MAIN_CREATE_ERROR, "Failed to create console error: %d", createError);
+        OstTraceFunctionExit0( E32MAIN_EXIT_ERR );
+        return createError;
+        }
+
+    TRAPD(mainError, DoStartL());    
+    if (mainError)
+        {
+        OstTrace1( TRACE_ERROR, E32MAIN_START_ERROR, "DoStartL failed with error: %d", mainError);
+        console->Printf(_L("DoStartL failed with error: %d\n\n"), mainError);
+        }
+    else 
+        {
+        console->Printf(_L("Before panic tracing example ..."));
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+    
+        OstTrace0( TRACE_FLOW, E32MAIN_BEFORE_PANIC, "About to cause a panic ..." );
+        HelloTraceExample::PanicTrace();
+        
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+        }
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    
+    OstTraceFunctionExit0( E32MAIN_EXIT );
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/bwins/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,14 @@
+EXPORTS
+	?Version@CHelloTraceInterface@@SA?AVTVersion@@XZ @ 1 NONAME ; class TVersion CHelloTraceInterface::Version(void)
+	?NewLC@CHelloTraceInterface@@SAPAV1@XZ @ 2 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewLC(void)
+	?JustTypes@HelloTraceExample@@SAXXZ @ 3 NONAME ; void HelloTraceExample::JustTypes(void)
+	?Interface@HelloTraceExample@@SAXXZ @ 4 NONAME ; void HelloTraceExample::Interface(void)
+	?FnEntryExit@HelloTraceExample@@SAXXZ @ 5 NONAME ; void HelloTraceExample::FnEntryExit(void)
+	?ResetString@CHelloTraceInterface@@QAEXXZ @ 6 NONAME ; void CHelloTraceInterface::ResetString(void)
+	?AddCharL@CHelloTraceInterface@@QAEXABVTChar@@@Z @ 7 NONAME ; void CHelloTraceInterface::AddCharL(class TChar const &)
+	?PanicTrace@HelloTraceExample@@SAXXZ @ 8 NONAME ; void HelloTraceExample::PanicTrace(void)
+	??1CHelloTraceInterface@@UAE@XZ @ 9 NONAME ; CHelloTraceInterface::~CHelloTraceInterface(void)
+	?String@CHelloTraceInterface@@QBE?BVTPtrC16@@XZ @ 10 NONAME ; class TPtrC16 const CHelloTraceInterface::String(void) const
+	?RemoveLast@CHelloTraceInterface@@QAEXXZ @ 11 NONAME ; void CHelloTraceInterface::RemoveLast(void)
+	?NewL@CHelloTraceInterface@@SAPAV1@XZ @ 12 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewL(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/eabi/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,20 @@
+EXPORTS
+	_ZN17HelloTraceExample10PanicTraceEv @ 1 NONAME
+	_ZN17HelloTraceExample11FnEntryExitEv @ 2 NONAME
+	_ZN17HelloTraceExample9InterfaceEv @ 3 NONAME
+	_ZN17HelloTraceExample9JustTypesEv @ 4 NONAME
+	_ZN20CHelloTraceInterface10RemoveLastEv @ 5 NONAME
+	_ZN20CHelloTraceInterface11ResetStringEv @ 6 NONAME
+	_ZN20CHelloTraceInterface4NewLEv @ 7 NONAME
+	_ZN20CHelloTraceInterface5NewLCEv @ 8 NONAME
+	_ZN20CHelloTraceInterface7VersionEv @ 9 NONAME
+	_ZN20CHelloTraceInterface8AddCharLERK5TChar @ 10 NONAME
+	_ZN20CHelloTraceInterfaceD0Ev @ 11 NONAME
+	_ZN20CHelloTraceInterfaceD1Ev @ 12 NONAME
+	_ZN20CHelloTraceInterfaceD2Ev @ 13 NONAME
+	_ZNK20CHelloTraceInterface6StringEv @ 14 NONAME
+	_ZTI13CHelloTraceFn @ 15 NONAME
+	_ZTI20CHelloTraceInterface @ 16 NONAME
+	_ZTV13CHelloTraceFn @ 17 NONAME
+	_ZTV20CHelloTraceInterface @ 18 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/group/HelloTraceDll.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceDll.dll
+TARGETTYPE	  dll
+UID			  0x1000008d 0xE43DF43E
+CAPABILITY    ReadUserData
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE  ../inc ../incDup
+USERINCLUDE  ../traces/HelloTraceDll_dll
+
+SOURCEPATH	 ../src
+SOURCE       HelloTraceExample.cpp 
+SOURCE       HelloTraceTypes.cpp
+SOURCE       HelloTraceInterface.cpp 
+SOURCE       HelloTraceFn.cpp 
+SOURCE       HelloTracePanic.cpp 
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/group/HelloTraceDll2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceDll2.dll
+TARGETTYPE	  dll
+UID			  0x1000008d 0xE43DF43F
+CAPABILITY    ReadUserData
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE  ../inc ../incDup
+USERINCLUDE  ../traces/HelloTraceDll2_dll
+
+SOURCEPATH	 ../src
+SOURCE       HelloTraceExample.cpp 
+SOURCE       HelloTraceTypes.cpp
+SOURCE       HelloTraceInterface.cpp 
+SOURCE       HelloTraceFn.cpp 
+SOURCE       HelloTracePanic.cpp 
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotracedll.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotracedll.iby)
+
+PRJ_MMPFILES
+HelloTraceDll.mmp
+HelloTraceDll2.mmp
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/group/hellotracedll.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,23 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACEDLL_IBY
+#define HELLOTRACEDLL_IBY
+
+file=ABI_DIR\BUILD_DIR\hellotracedll.dll        Sys\Bin\hellotracedll.dll
+file=ABI_DIR\BUILD_DIR\hellotracedll2.dll        Sys\Bin\hellotracedll2.dll
+
+#endif //HELLOTRACEDLL_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/inc/HelloTraceExample.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEEXAMPLE_H__
+#define __HELLOTRACEEXAMPLE_H__
+
+#include <e32std.h>
+
+class HelloTraceExample
+    {
+public:
+    IMPORT_C static void JustTypes();    
+    IMPORT_C static void Interface();    
+    IMPORT_C static void FnEntryExit();    
+    IMPORT_C static void PanicTrace();    
+
+    // @TODO add examples for state macros
+    // @TODO add examples for event macros
+    // @TODO add examples for OstTraceData
+    // @TODO add compile-time selector examples
+    // @TODO add macro wrapper examples
+    };
+
+#endif  // __HELLOTRACEEXAMPLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/inc/HelloTraceFn.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFN_H_
+#define HELLOTRACEFN_H_
+
+#include <e32base.h>    // CBase
+
+class CHelloTraceFn : public CBase
+    {
+public:
+    
+    // Note the Trace Builder will only parse this if it's in a cpp file
+    // but not from here :(
+    // Also if you add a new enum you need to reparse the enum - it doesn't
+    // get automatically reparsed by the Trace Compiler :(
+    enum TFnEnum
+        {
+        EExample1,
+        EExample2 = 2, 
+        // EExample3 = EExample2 + 1, // The Trace Builder can't parse this :(
+        };
+    
+public:
+    static CHelloTraceFn* NewL();
+    static CHelloTraceFn* NewLC();
+    ~CHelloTraceFn();
+   
+public: // Fn entry / exit tracing examples 
+    void Simple();
+    void OutputsParams(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValue();
+    TInt64 OutputsTInt64ReturnValue();
+    TFnEnum OutputsTFnEnumReturnValue();
+
+    CActive* OutputsUnknownPtrType(CActive* aActive);
+    CActive& OutputsUnknownRefType(CActive& aActive);
+    
+    void OutputMissingParams(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFn(TInt aDbgParam);
+#else
+    void PreProcessedFn();
+#endif
+    
+    static void StaticOutputsParamsL(TInt aParam);  
+    
+    // duplicate all the function and put the impl in the header file HelloTraceFnDup.h
+    void SimpleDup();
+    void OutputsParamsDup(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup();
+    TInt64 OutputsTInt64ReturnValueDup();
+    TFnEnum OutputsTFnEnumReturnValueDup();
+
+    CActive* OutputsUnknownPtrTypeDup(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup(CActive& aActive);
+    
+    void OutputMissingParamsDup(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup(TInt aDbgParam);
+#else
+    void PreProcessedFnDup();
+#endif
+    static void StaticOutputsParamsDupL(TInt aParam);  
+    
+    // duplicate all the function again and put the impl in the header file HelloTraceFnDup2.h
+    void SimpleDup2();
+    void OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup2();
+    TInt64 OutputsTInt64ReturnValueDup2();
+    TFnEnum OutputsTFnEnumReturnValueDup2();
+
+    CActive* OutputsUnknownPtrTypeDup2(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup2(CActive& aActive);
+    
+    void OutputMissingParamsDup2(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup2(TInt aDbgParam);
+#else
+    void PreProcessedFnDup2();
+#endif
+    static void StaticOutputsParamsDup2L(TInt aParam);  
+
+
+private:
+    CHelloTraceFn();
+    };
+
+#endif /* HELLOTRACEFN_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/inc/HelloTraceInterface.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE_H__
+#define __HELLOTRACEINTERFACE_H__
+
+#include <e32base.h>	// CBase
+#include <e32std.h>	 // TBuf
+
+const TInt KHelloTraceDllBufferLength = 10;
+typedef TBuf<KHelloTraceDllBufferLength> THelloTraceDllExampleString;
+
+class CHelloTraceInterface : public CBase
+    {
+public:
+    IMPORT_C static CHelloTraceInterface* NewL();
+    IMPORT_C static CHelloTraceInterface* NewLC();
+    IMPORT_C ~CHelloTraceInterface();
+
+public:
+    IMPORT_C static TVersion Version();
+    IMPORT_C const TPtrC String() const;
+    IMPORT_C void AddCharL(const TChar& aChar);
+    IMPORT_C void RemoveLast();
+    IMPORT_C void ResetString();
+    
+    IMPORT_C static TVersion VersionDup();
+    IMPORT_C const TPtrC StringDup() const;
+    IMPORT_C void AddCharDupL(const TChar& aChar);
+    IMPORT_C void RemoveLastDup();
+    IMPORT_C void ResetStringDup();
+
+    IMPORT_C static TVersion VersionDup2();
+    IMPORT_C const TPtrC StringDup2() const;
+    IMPORT_C void AddCharDup2L(const TChar& aChar);
+    IMPORT_C void RemoveLastDup2();
+    IMPORT_C void ResetStringDup2();
+private:
+    CHelloTraceInterface();
+    void ConstructL();
+
+private:
+    // data
+    THelloTraceDllExampleString* iString;
+    };
+
+#endif  // __HELLOTRACEINTERFACE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/inc/HelloTracePanic.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEDLL_PAN__
+#define __HELLOTRACEDLL_PAN__
+
+//  Data Types
+
+enum THelloTraceDllPanic
+    {
+    EHelloTraceDllExamplePanic,
+    EHelloTraceDllNullPointer,
+    };
+
+//  Function Prototypes
+
+GLREF_C void Panic(THelloTraceDllPanic aPanic);
+
+#endif  // __HELLOTRACEDLL_PAN__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/inc/HelloTraceTypes.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES_H__
+#define __HELLOTRACETYPES_H__
+
+class HelloTraceTypes
+    {
+public:
+    static void SignedIntegers();
+    static void UnsignedIntegers();
+    static void Descriptors();
+    
+    static void SignedIntegersDup();
+    static void UnsignedIntegersDup();
+    static void DescriptorsDup();
+        
+    static void SignedIntegersDup2();
+    static void UnsignedIntegersDup2();
+    static void DescriptorsDup2();
+    };
+
+#endif  // __HELLOTRACETYPES_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/incDup/HelloTraceFnDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP_H_
+#define HELLOTRACEFNDUP_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDupTraces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDupL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/incDup/HelloTraceFnDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP2_H_
+#define HELLOTRACEFNDUP2_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDup2Traces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDup2L(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup2();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup2(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup2(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup2(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup2(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup2()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup2();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP2_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/incDup/HelloTraceInterfaceDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP_H__
+#define __HELLOTRACEINTERFACEDUP_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDupTraces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDupL(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/incDup/HelloTraceInterfaceDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP2_H__
+#define __HELLOTRACEINTERFACEDUP2_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDup2Traces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup2()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP2, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup2() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP2, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDup2L(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP2, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP2,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup2()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP2, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP2, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup2()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP2, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/incDup/HelloTraceTypesDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP_H__
+#define __HELLOTRACETYPESDUP_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDupTraces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/incDup/HelloTraceTypesDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP2_H__
+#define __HELLOTRACETYPESDUP2_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDup2Traces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup2()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup2()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup2()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP2, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP2, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/src/HelloTraceExample.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceExample.h"
+#include "HelloTraceTypes.h"
+#include "HelloTraceInterface.h"
+#include "HelloTraceFn.h"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceExampleTraces.h"
+#endif
+
+EXPORT_C void HelloTraceExample::JustTypes()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_JUSTTYPES, "*********************************************** " );
+    
+    HelloTraceTypes::SignedIntegers();
+    HelloTraceTypes::UnsignedIntegers();
+    HelloTraceTypes::Descriptors();    
+    }
+
+EXPORT_C void HelloTraceExample::Interface()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_INTERFACE, "*********************************************** " );
+    
+    TVersion version = CHelloTraceInterface::Version();   
+    if (version.iMajor >= 1) 
+        {
+        CHelloTraceInterface* example = CHelloTraceInterface::NewLC();
+        example->AddCharL('H');
+        example->AddCharL('e');
+        example->AddCharL('l');
+        example->AddCharL('l');
+        example->AddCharL('o');
+        example->AddCharL('T');        
+        example->RemoveLast();        
+        example->AddCharL(' ');
+        example->AddCharL('T');
+        example->AddCharL('r');
+        example->AddCharL('a');
+        example->AddCharL('c');
+        example->AddCharL('e');
+        example->AddCharL('!');
+        CleanupStack::PopAndDestroy(example);
+        }
+    else
+        {
+        OstTrace0( TRACE_ERROR, HELLOTRACEEXAMPLE_UNSUPPORTED_VERSION, "Unsupported version!");
+        }
+    }
+
+EXPORT_C void HelloTraceExample::FnEntryExit()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_FNENTRYEXIT, "*********************************************** " );
+       
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    CIdle* idle = CIdle::NewL(CActive::EPriorityIdle);
+    CleanupStack::PushL(idle);
+
+    CHelloTraceFn::StaticOutputsParamsL(1);
+   
+    example->Simple();
+    example->OutputsParams(2, CHelloTraceFn::EExample1);
+    example->OutputsParams(3, CHelloTraceFn::EExample2);
+    example->OutputsSignedIntegers(-4, -5, -6, -7);
+    example->OutputsUnsignedIntegers(8, 9, 10, 11);
+    example->OutputsTIntReturnValue();    
+    example->OutputsTInt64ReturnValue(); 
+    example->OutputsTFnEnumReturnValue();
+    example->OutputsUnknownPtrType(idle);    
+    example->OutputsUnknownRefType(*idle);
+#ifdef _DEBUG
+    example->PreProcessedFn(12);
+#else
+    example->PreProcessedFn();
+#endif
+    example->OutputMissingParams(13, 14, 15);
+
+    CleanupStack::PopAndDestroy(idle);
+    CleanupStack::PopAndDestroy(example);
+    }
+
+EXPORT_C void HelloTraceExample::PanicTrace()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_PANIC, "*********************************************** " );
+
+    Panic(EHelloTraceDllExamplePanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/src/HelloTraceFn.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+ 
+#include "HelloTraceFn.h"
+#include "HelloTraceFnDup.h"
+#include "HelloTraceFnDup2.inl"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnTraces.h"
+#endif
+
+CHelloTraceFn* CHelloTraceFn::NewLC()
+    {
+    CHelloTraceFn* self = new (ELeave) CHelloTraceFn;
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+CHelloTraceFn* CHelloTraceFn::NewL()
+    {
+    CHelloTraceFn* self = CHelloTraceFn::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceFn::CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_CTOR, "[0x%08x] Constructor", this );    
+    }
+
+CHelloTraceFn::~CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_DTOR, "[0x%08x] Destructor", this );    
+    }
+
+void CHelloTraceFn::Simple()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsParams(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_EXIT, this );
+    }
+
+void CHelloTraceFn::StaticOutputsParamsL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->Simple();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_EXIT );    
+    }
+
+void CHelloTraceFn::OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_EXIT, this );
+    }
+
+
+TInt CHelloTraceFn::OutputsTIntReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+TInt64 CHelloTraceFn::OutputsTInt64ReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_EXIT, this, ret );
+    return ret;    
+    }
+
+CActive* CHelloTraceFn::OutputsUnknownPtrType(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+CActive& CHelloTraceFn::OutputsUnknownRefType(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+void CHelloTraceFn::OutputMissingParams(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+void CHelloTraceFn::PreProcessedFn()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    Simple();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/src/HelloTraceInterface.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceInterface.h"
+#include "HelloTraceInterfaceDup.h"
+#include "HelloTraceInterfaceDup2.inl"
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceTraces.h"
+#endif
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewLC()
+    {
+    CHelloTraceInterface* self = new (ELeave) CHelloTraceInterface;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewL()
+    {
+    CHelloTraceInterface* self = CHelloTraceInterface::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceInterface::CHelloTraceInterface()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_CTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+void CHelloTraceInterface::ConstructL()
+    {
+    iString = new (ELeave) THelloTraceDllExampleString;
+    }
+
+EXPORT_C CHelloTraceInterface::~CHelloTraceInterface()
+    {
+    delete iString;
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_DTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+EXPORT_C TVersion CHelloTraceInterface::Version()
+    {
+    const TInt KMajor = 1;
+    const TInt KMinor = 0;
+    const TInt KBuild = 1;
+    TVersion version = TVersion(KMajor, KMinor, KBuild);
+    OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION, "CHelloTraceInterface::Version = %S", version.Name());   
+    return version;
+    }
+
+EXPORT_C const TPtrC CHelloTraceInterface::String() const
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING, 
+                     "[0x%08x] Returned %S", (TUint32) this, *iString);   
+    return *iString;
+    }
+
+EXPORT_C void CHelloTraceInterface::AddCharL(const TChar& aChar)
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL, 
+                  "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+    if (iString->Length() >= KHelloTraceDllBufferLength)
+        {
+        OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR,
+                   "[0x%08x] Not enough space to add character", (TUint32) this);
+        User::Leave( KErrTooBig);
+        }
+    iString->Append(aChar);
+    }
+
+EXPORT_C void CHelloTraceInterface::RemoveLast()
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST, 
+                  "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+    if (iString->Length() > 0)
+        {
+        iString->SetLength(iString->Length() - 1);
+        }
+    else
+        {
+        OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN, "[0x%08x] String already empty", (TUint32) this);   
+        }
+    }
+
+EXPORT_C void CHelloTraceInterface::ResetString()
+    {
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+    if (iString == NULL)
+        {
+        iString = new (ELeave) THelloTraceDllExampleString;
+        }
+    else
+        {
+        iString->SetLength(0);
+        }
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/src/HelloTracePanic.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32std.h>		 // GLDEF_C
+
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTracePanicTraces.h"
+#endif
+
+GLDEF_C void Panic(THelloTraceDllPanic aPanic)
+    {
+    OstTrace1( TRACE_FATAL, PANIC, "Panic(%{THelloTraceDllPanic})", (TUint) aPanic );    
+    User::Panic(_L("HelloTraceDll"), aPanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/src/HelloTraceTypes.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include <e32std.h>
+
+#include "HelloTraceTypes.h"
+#include "HelloTraceTypesDup.h"
+#include "HelloTraceTypesDup2.inl"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesTraces.h"
+#endif
+
+void HelloTraceTypes::SignedIntegers()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+void HelloTraceTypes::UnsignedIntegers()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+void HelloTraceTypes::Descriptors()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE, "16 bit descriptor: %S", KUnicode() );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/traces/hellotracedll2_dll/trace.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<trace_properties>
+<enum name="TFnEnum">
+<value id="0">EExample1</value>
+<value id="2">EExample2</value>
+</enum>
+<enum name="THelloTraceDllPanic">
+<value id="0">EHelloTraceDllExamplePanic</value>
+<value id="1">EHelloTraceDllNullPointer</value>
+</enum>
+<file>../../incDup/HelloTraceInterfaceDup.h</file>
+<file>../../incDup/HelloTraceInterfaceDup2.inl</file>
+<file>../../incDup/HelloTraceFnDup.h</file>
+<file>../../incDup/HelloTraceFnDup2.inl</file>
+<file>../../incDup/HelloTraceTypesDup.h</file>
+<file>../../incDup/HelloTraceTypesDup2.inl</file>
+</trace_properties>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/dll/traces/hellotracedll_dll/trace.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<trace_properties>
+<enum name="TFnEnum">
+<value id="0">EExample1</value>
+<value id="2">EExample2</value>
+</enum>
+<enum name="THelloTraceDllPanic">
+<value id="0">EHelloTraceDllExamplePanic</value>
+<value id="1">EHelloTraceDllNullPointer</value>
+</enum>
+<file>../../incDup/HelloTraceInterfaceDup.h</file>
+<file>../../incDup/HelloTraceInterfaceDup2.inl</file>
+<file>../../incDup/HelloTraceFnDup.h</file>
+<file>../../incDup/HelloTraceFnDup2.inl</file>
+<file>../../incDup/HelloTraceTypesDup.h</file>
+<file>../../incDup/HelloTraceTypesDup2.inl</file>
+</trace_properties>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_comm_source_tracesplus/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,19 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+#include "../dll/group/bld.inf"
+#include "../console/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/console/group/HelloTraceConsole.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceConsole.exe
+TARGETTYPE	  exe
+UID			  0 0xE40349E4
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE	   ../inc
+USERINCLUDE    ../../dll/inc
+USERINCLUDE    ../traces
+
+SOURCEPATH	  ../src
+SOURCE		  HelloTraceConsole.cpp
+
+LIBRARY		  euser.lib
+LIBRARY       HelloTraceDll.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/console/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotraceconsole.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotraceconsole.iby)
+
+PRJ_MMPFILES
+HelloTraceConsole.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/console/group/hellotraceconsole.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACECONSOLE_IBY
+#define HELLOTRACECONSOLE_IBY
+
+#include <core\os\hellotracedll.iby>
+
+file=ABI_DIR\BUILD_DIR\hellotraceconsole.exe    Sys\Bin\hellotraceconsole.exe
+
+#endif //HELLOTRACECONSOLE_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/console/inc/HelloTraceConsole.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACECONSOLE_H__
+#define __HELLOTRACECONSOLE_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+
+#endif  // __HELLOTRACECONSOLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/console/src/HelloTraceConsole.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32cons.h>			// Console
+
+#include "HelloTraceConsole.h"
+#include "HelloTraceExample.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceConsoleTraces.h"
+#endif
+
+
+_LIT(KTextConsoleTitle, "HelloTrace");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+LOCAL_C void DoExamples()
+    {
+    TInt err = KErrNone;
+
+    console->Printf(_L("Before main tracing examples ...\n"));
+
+    console->Printf(_L(" Before type examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::JustTypes());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+
+    console->Printf(_L(" Before Interface examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::Interface());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+    
+    console->Printf(_L(" Before FnEntryExit examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::FnEntryExit());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);    
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    DoExamples();
+    
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    OstTraceFunctionEntry0( E32MAIN_ENTRY );
+    
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, 
+          console = Console::NewL(KTextConsoleTitle, 
+                                  TSize(KConsFullScreen, KConsFullScreen)));    
+    if (createError)
+        {
+        delete cleanup;
+        OstTrace1( TRACE_ERROR, E32MAIN_CREATE_ERROR, "Failed to create console error: %d", createError);
+        OstTraceFunctionExit0( E32MAIN_EXIT_ERR );
+        return createError;
+        }
+
+    TRAPD(mainError, DoStartL());    
+    if (mainError)
+        {
+        OstTrace1( TRACE_ERROR, E32MAIN_START_ERROR, "DoStartL failed with error: %d", mainError);
+        console->Printf(_L("DoStartL failed with error: %d\n\n"), mainError);
+        }
+    else 
+        {
+        console->Printf(_L("Before panic tracing example ..."));
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+    
+        OstTrace0( TRACE_FLOW, E32MAIN_BEFORE_PANIC, "About to cause a panic ..." );
+        HelloTraceExample::PanicTrace();
+        
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+        }
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    
+    OstTraceFunctionExit0( E32MAIN_EXIT );
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/bwins/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,14 @@
+EXPORTS
+	?Version@CHelloTraceInterface@@SA?AVTVersion@@XZ @ 1 NONAME ; class TVersion CHelloTraceInterface::Version(void)
+	?NewLC@CHelloTraceInterface@@SAPAV1@XZ @ 2 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewLC(void)
+	?JustTypes@HelloTraceExample@@SAXXZ @ 3 NONAME ; void HelloTraceExample::JustTypes(void)
+	?Interface@HelloTraceExample@@SAXXZ @ 4 NONAME ; void HelloTraceExample::Interface(void)
+	?FnEntryExit@HelloTraceExample@@SAXXZ @ 5 NONAME ; void HelloTraceExample::FnEntryExit(void)
+	?ResetString@CHelloTraceInterface@@QAEXXZ @ 6 NONAME ; void CHelloTraceInterface::ResetString(void)
+	?AddCharL@CHelloTraceInterface@@QAEXABVTChar@@@Z @ 7 NONAME ; void CHelloTraceInterface::AddCharL(class TChar const &)
+	?PanicTrace@HelloTraceExample@@SAXXZ @ 8 NONAME ; void HelloTraceExample::PanicTrace(void)
+	??1CHelloTraceInterface@@UAE@XZ @ 9 NONAME ; CHelloTraceInterface::~CHelloTraceInterface(void)
+	?String@CHelloTraceInterface@@QBE?BVTPtrC16@@XZ @ 10 NONAME ; class TPtrC16 const CHelloTraceInterface::String(void) const
+	?RemoveLast@CHelloTraceInterface@@QAEXXZ @ 11 NONAME ; void CHelloTraceInterface::RemoveLast(void)
+	?NewL@CHelloTraceInterface@@SAPAV1@XZ @ 12 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewL(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/eabi/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,20 @@
+EXPORTS
+	_ZN17HelloTraceExample10PanicTraceEv @ 1 NONAME
+	_ZN17HelloTraceExample11FnEntryExitEv @ 2 NONAME
+	_ZN17HelloTraceExample9InterfaceEv @ 3 NONAME
+	_ZN17HelloTraceExample9JustTypesEv @ 4 NONAME
+	_ZN20CHelloTraceInterface10RemoveLastEv @ 5 NONAME
+	_ZN20CHelloTraceInterface11ResetStringEv @ 6 NONAME
+	_ZN20CHelloTraceInterface4NewLEv @ 7 NONAME
+	_ZN20CHelloTraceInterface5NewLCEv @ 8 NONAME
+	_ZN20CHelloTraceInterface7VersionEv @ 9 NONAME
+	_ZN20CHelloTraceInterface8AddCharLERK5TChar @ 10 NONAME
+	_ZN20CHelloTraceInterfaceD0Ev @ 11 NONAME
+	_ZN20CHelloTraceInterfaceD1Ev @ 12 NONAME
+	_ZN20CHelloTraceInterfaceD2Ev @ 13 NONAME
+	_ZNK20CHelloTraceInterface6StringEv @ 14 NONAME
+	_ZTI13CHelloTraceFn @ 15 NONAME
+	_ZTI20CHelloTraceInterface @ 16 NONAME
+	_ZTV13CHelloTraceFn @ 17 NONAME
+	_ZTV20CHelloTraceInterface @ 18 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/group/HelloTraceDll.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceDll.dll
+TARGETTYPE	  dll
+UID			  0x1000008d 0xE43DF43E
+CAPABILITY    ReadUserData
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE  ../inc ../incDup
+USERINCLUDE  ../traces
+
+SOURCEPATH	 ../src
+SOURCE       HelloTraceExample.cpp 
+SOURCE       HelloTraceTypes.cpp
+SOURCE       HelloTraceInterface.cpp 
+SOURCE       HelloTraceFn.cpp 
+SOURCE       HelloTracePanic.cpp 
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/group/HelloTraceDll2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceDll2.dll
+TARGETTYPE	  dll
+UID			  0x1000008d 0xE43DF43E
+CAPABILITY    ReadUserData
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE  ../inc ../incDup
+USERINCLUDE  ../traces
+
+SOURCEPATH	 ../src
+SOURCE       HelloTraceExample2.cpp 
+SOURCE       HelloTraceTypes2.cpp
+SOURCE       HelloTraceInterface2.cpp 
+SOURCE       HelloTraceFn2.cpp 
+SOURCE       HelloTracePanic2.cpp 
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotracedll.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotracedll.iby)
+
+PRJ_MMPFILES
+HelloTraceDll.mmp
+HelloTraceDll2.mmp
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/group/hellotracedll.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,23 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACEDLL_IBY
+#define HELLOTRACEDLL_IBY
+
+file=ABI_DIR\BUILD_DIR\hellotracedll.dll        Sys\Bin\hellotracedll.dll
+file=ABI_DIR\BUILD_DIR\hellotracedll2.dll        Sys\Bin\hellotracedll2.dll
+
+#endif //HELLOTRACEDLL_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceExample.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEEXAMPLE_H__
+#define __HELLOTRACEEXAMPLE_H__
+
+#include <e32std.h>
+
+class HelloTraceExample
+    {
+public:
+    IMPORT_C static void JustTypes();    
+    IMPORT_C static void Interface();    
+    IMPORT_C static void FnEntryExit();    
+    IMPORT_C static void PanicTrace();    
+
+    // @TODO add examples for state macros
+    // @TODO add examples for event macros
+    // @TODO add examples for OstTraceData
+    // @TODO add compile-time selector examples
+    // @TODO add macro wrapper examples
+    };
+
+#endif  // __HELLOTRACEEXAMPLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceFn.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFN_H_
+#define HELLOTRACEFN_H_
+
+#include <e32base.h>    // CBase
+
+class CHelloTraceFn : public CBase
+    {
+public:
+    
+    // Note the Trace Builder will only parse this if it's in a cpp file
+    // but not from here :(
+    // Also if you add a new enum you need to reparse the enum - it doesn't
+    // get automatically reparsed by the Trace Compiler :(
+    enum TFnEnum
+        {
+        EExample1,
+        EExample2 = 2, 
+        // EExample3 = EExample2 + 1, // The Trace Builder can't parse this :(
+        };
+    
+public:
+    static CHelloTraceFn* NewL();
+    static CHelloTraceFn* NewLC();
+    ~CHelloTraceFn();
+   
+public: // Fn entry / exit tracing examples 
+    void Simple();
+    void OutputsParams(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValue();
+    TInt64 OutputsTInt64ReturnValue();
+    TFnEnum OutputsTFnEnumReturnValue();
+
+    CActive* OutputsUnknownPtrType(CActive* aActive);
+    CActive& OutputsUnknownRefType(CActive& aActive);
+    
+    void OutputMissingParams(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFn(TInt aDbgParam);
+#else
+    void PreProcessedFn();
+#endif
+    
+    static void StaticOutputsParamsL(TInt aParam);  
+    
+    // duplicate all the function and put the impl in the header file HelloTraceFnDup.h
+    void SimpleDup();
+    void OutputsParamsDup(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup();
+    TInt64 OutputsTInt64ReturnValueDup();
+    TFnEnum OutputsTFnEnumReturnValueDup();
+
+    CActive* OutputsUnknownPtrTypeDup(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup(CActive& aActive);
+    
+    void OutputMissingParamsDup(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup(TInt aDbgParam);
+#else
+    void PreProcessedFnDup();
+#endif
+    static void StaticOutputsParamsDupL(TInt aParam);  
+    
+    // duplicate all the function again and put the impl in the header file HelloTraceFnDup2.h
+    void SimpleDup2();
+    void OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup2();
+    TInt64 OutputsTInt64ReturnValueDup2();
+    TFnEnum OutputsTFnEnumReturnValueDup2();
+
+    CActive* OutputsUnknownPtrTypeDup2(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup2(CActive& aActive);
+    
+    void OutputMissingParamsDup2(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup2(TInt aDbgParam);
+#else
+    void PreProcessedFnDup2();
+#endif
+    static void StaticOutputsParamsDup2L(TInt aParam);  
+
+
+private:
+    CHelloTraceFn();
+    };
+
+#endif /* HELLOTRACEFN_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceFn2.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFN2_H_
+#define HELLOTRACEFN2_H_
+
+#include <e32base.h>    // CBase
+
+class CHelloTraceFn : public CBase
+    {
+public:
+    
+    // Note the Trace Builder will only parse this if it's in a cpp file
+    // but not from here :(
+    // Also if you add a new enum you need to reparse the enum - it doesn't
+    // get automatically reparsed by the Trace Compiler :(
+    enum TFnEnum
+        {
+        EExample1,
+        EExample2 = 2, 
+        // EExample3 = EExample2 + 1, // The Trace Builder can't parse this :(
+        };
+    
+public:
+    static CHelloTraceFn* NewL();
+    static CHelloTraceFn* NewLC();
+    ~CHelloTraceFn();
+   
+public: // Fn entry / exit tracing examples 
+    void Simple();
+    void OutputsParams(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValue();
+    TInt64 OutputsTInt64ReturnValue();
+    TFnEnum OutputsTFnEnumReturnValue();
+
+    CActive* OutputsUnknownPtrType(CActive* aActive);
+    CActive& OutputsUnknownRefType(CActive& aActive);
+    
+    void OutputMissingParams(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFn(TInt aDbgParam);
+#else
+    void PreProcessedFn();
+#endif
+    
+    static void StaticOutputsParamsL(TInt aParam);  
+    
+    // duplicate all the function and put the impl in the header file HelloTraceFnDup.h
+    void SimpleDup();
+    void OutputsParamsDup(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup();
+    TInt64 OutputsTInt64ReturnValueDup();
+    TFnEnum OutputsTFnEnumReturnValueDup();
+
+    CActive* OutputsUnknownPtrTypeDup(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup(CActive& aActive);
+    
+    void OutputMissingParamsDup(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup(TInt aDbgParam);
+#else
+    void PreProcessedFnDup();
+#endif
+    static void StaticOutputsParamsDupL(TInt aParam);  
+    
+    // duplicate all the function again and put the impl in the header file HelloTraceFnDup2.h
+    void SimpleDup2();
+    void OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup2();
+    TInt64 OutputsTInt64ReturnValueDup2();
+    TFnEnum OutputsTFnEnumReturnValueDup2();
+
+    CActive* OutputsUnknownPtrTypeDup2(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup2(CActive& aActive);
+    
+    void OutputMissingParamsDup2(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup2(TInt aDbgParam);
+#else
+    void PreProcessedFnDup2();
+#endif
+    static void StaticOutputsParamsDup2L(TInt aParam);  
+
+
+private:
+    CHelloTraceFn();
+    };
+
+#endif /* HELLOTRACEFN2_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceInterface.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE_H__
+#define __HELLOTRACEINTERFACE_H__
+
+#include <e32base.h>	// CBase
+#include <e32std.h>	 // TBuf
+
+const TInt KHelloTraceDllBufferLength = 10;
+typedef TBuf<KHelloTraceDllBufferLength> THelloTraceDllExampleString;
+
+class CHelloTraceInterface : public CBase
+    {
+public:
+    IMPORT_C static CHelloTraceInterface* NewL();
+    IMPORT_C static CHelloTraceInterface* NewLC();
+    IMPORT_C ~CHelloTraceInterface();
+
+public:
+    IMPORT_C static TVersion Version();
+    IMPORT_C const TPtrC String() const;
+    IMPORT_C void AddCharL(const TChar& aChar);
+    IMPORT_C void RemoveLast();
+    IMPORT_C void ResetString();
+    
+    IMPORT_C static TVersion VersionDup();
+    IMPORT_C const TPtrC StringDup() const;
+    IMPORT_C void AddCharDupL(const TChar& aChar);
+    IMPORT_C void RemoveLastDup();
+    IMPORT_C void ResetStringDup();
+
+    IMPORT_C static TVersion VersionDup2();
+    IMPORT_C const TPtrC StringDup2() const;
+    IMPORT_C void AddCharDup2L(const TChar& aChar);
+    IMPORT_C void RemoveLastDup2();
+    IMPORT_C void ResetStringDup2();
+private:
+    CHelloTraceInterface();
+    void ConstructL();
+
+private:
+    // data
+    THelloTraceDllExampleString* iString;
+    };
+
+#endif  // __HELLOTRACEINTERFACE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceInterface2.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE2_H__
+#define __HELLOTRACEINTERFACE2_H__
+
+#include <e32base.h>	// CBase
+#include <e32std.h>	 // TBuf
+
+const TInt KHelloTraceDllBufferLength = 10;
+typedef TBuf<KHelloTraceDllBufferLength> THelloTraceDllExampleString;
+
+class CHelloTraceInterface : public CBase
+    {
+public:
+    IMPORT_C static CHelloTraceInterface* NewL();
+    IMPORT_C static CHelloTraceInterface* NewLC();
+    IMPORT_C ~CHelloTraceInterface();
+
+public:
+    IMPORT_C static TVersion Version();
+    IMPORT_C const TPtrC String() const;
+    IMPORT_C void AddCharL(const TChar& aChar);
+    IMPORT_C void RemoveLast();
+    IMPORT_C void ResetString();
+    
+    IMPORT_C static TVersion VersionDup();
+    IMPORT_C const TPtrC StringDup() const;
+    IMPORT_C void AddCharDupL(const TChar& aChar);
+    IMPORT_C void RemoveLastDup();
+    IMPORT_C void ResetStringDup();
+
+    IMPORT_C static TVersion VersionDup2();
+    IMPORT_C const TPtrC StringDup2() const;
+    IMPORT_C void AddCharDup2L(const TChar& aChar);
+    IMPORT_C void RemoveLastDup2();
+    IMPORT_C void ResetStringDup2();
+private:
+    CHelloTraceInterface();
+    void ConstructL();
+
+private:
+    // data
+    THelloTraceDllExampleString* iString;
+    };
+
+#endif  // __HELLOTRACEINTERFACE2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTracePanic.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEDLL_PAN__
+#define __HELLOTRACEDLL_PAN__
+
+//  Data Types
+
+enum THelloTraceDllPanic
+    {
+    EHelloTraceDllExamplePanic,
+    EHelloTraceDllNullPointer,
+    };
+
+//  Function Prototypes
+
+GLREF_C void Panic(THelloTraceDllPanic aPanic);
+
+#endif  // __HELLOTRACEDLL_PAN__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceTypes.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES_H__
+#define __HELLOTRACETYPES_H__
+
+class HelloTraceTypes
+    {
+public:
+    static void SignedIntegers();
+    static void UnsignedIntegers();
+    static void Descriptors();
+    
+    static void SignedIntegersDup();
+    static void UnsignedIntegersDup();
+    static void DescriptorsDup();
+        
+    static void SignedIntegersDup2();
+    static void UnsignedIntegersDup2();
+    static void DescriptorsDup2();
+    };
+
+#endif  // __HELLOTRACETYPES_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/inc/HelloTraceTypes2.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES2_H__
+#define __HELLOTRACETYPES2_H__
+
+class HelloTraceTypes
+    {
+public:
+    static void SignedIntegers();
+    static void UnsignedIntegers();
+    static void Descriptors();
+    
+    static void SignedIntegersDup();
+    static void UnsignedIntegersDup();
+    static void DescriptorsDup();
+        
+    static void SignedIntegersDup2();
+    static void UnsignedIntegersDup2();
+    static void DescriptorsDup2();
+    };
+
+#endif  // __HELLOTRACETYPES2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceFn2Dup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,156 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP2_H_
+#define HELLOTRACEFNDUP2_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFn2DupTraces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE2_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE2_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS2_DUP_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS2_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDupL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS2_DUP_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS2_DUP_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS2_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS2_DUP_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS2_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS2_DUP_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE2_DUP_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE2_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE2_DUP_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE2_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE2_DUP_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE2_DUP_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE2_DUP_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE2_DUP_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE2_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE2_DUP_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS2_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS2_DUP_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN2_DUP_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN2_DUP_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN2_DUP_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFN2DUP_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceFn2Dup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFN2DUP2_H_
+#define HELLOTRACEFN2DUP2_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFn2Dup2Traces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE2_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE2_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS2_DUP2_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS2_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDup2L(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS2_DUP2_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup2();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS2_DUP2_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS2_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS2_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS2_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS2_DUP2_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE2_DUP2_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE2_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE2_DUP2_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE2_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE2_DUP2_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE2_DUP2_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup2(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE2_DUP2_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE2_DUP2_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup2(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE2_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE2_DUP2_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup2(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS2_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS2_DUP2_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup2(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN2_DUP2_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup2()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN2_DUP2_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup2();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN2_DUP2_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFN2DUP2_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceFnDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP_H_
+#define HELLOTRACEFNDUP_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDupTraces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDupL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceFnDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP2_H_
+#define HELLOTRACEFNDUP2_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDup2Traces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDup2L(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup2();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup2(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup2(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup2(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup2(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup2()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup2();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP2_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceInterface2Dup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE2DUP_H__
+#define __HELLOTRACEINTERFACE2DUP_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterface2DupTraces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION2_DUP, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING2_DUP, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDupL(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL2_DUP, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR2_DUP,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST2_DUP, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN2_DUP, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING2_DUP, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACE2DUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceInterface2Dup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE2DUP2_H__
+#define __HELLOTRACEINTERFACE2DUP2_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterface2Dup2Traces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup2()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION2_DUP2, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup2() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING2_DUP2, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDup2L(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL2_DUP2, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR2_DUP2,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup2()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST2_DUP2, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN2_DUP2, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup2()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING2_DUP2, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACE2DUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceInterfaceDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP_H__
+#define __HELLOTRACEINTERFACEDUP_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDupTraces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDupL(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceInterfaceDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP2_H__
+#define __HELLOTRACEINTERFACEDUP2_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDup2Traces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup2()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP2, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup2() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP2, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDup2L(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP2, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP2,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup2()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP2, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP2, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup2()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP2, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceTypes2Dup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES2DUP_H__
+#define __HELLOTRACETYPES2DUP_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypes2DupTraces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII2DUP, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE2DUP, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPES2DUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceTypes2Dup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES2DUP2_H__
+#define __HELLOTRACETYPES2DUP2_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypes2Dup2Traces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup2()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP2_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP2_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP2_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS2DUP2_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup2()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP2_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP2_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP2_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS2DUP2_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup2()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII2DUP2, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE2DUP2, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPES2DUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceTypesDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP_H__
+#define __HELLOTRACETYPESDUP_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDupTraces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/incDup/HelloTraceTypesDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP2_H__
+#define __HELLOTRACETYPESDUP2_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDup2Traces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup2()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup2()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup2()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP2, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP2, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceExample.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceExample.h"
+#include "HelloTraceTypes.h"
+#include "HelloTraceInterface.h"
+#include "HelloTraceFn.h"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceExampleTraces.h"
+#endif
+
+EXPORT_C void HelloTraceExample::JustTypes()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_JUSTTYPES, "*********************************************** " );
+    
+    HelloTraceTypes::SignedIntegers();
+    HelloTraceTypes::UnsignedIntegers();
+    HelloTraceTypes::Descriptors();    
+    }
+
+EXPORT_C void HelloTraceExample::Interface()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_INTERFACE, "*********************************************** " );
+    
+    TVersion version = CHelloTraceInterface::Version();   
+    if (version.iMajor >= 1) 
+        {
+        CHelloTraceInterface* example = CHelloTraceInterface::NewLC();
+        example->AddCharL('H');
+        example->AddCharL('e');
+        example->AddCharL('l');
+        example->AddCharL('l');
+        example->AddCharL('o');
+        example->AddCharL('T');        
+        example->RemoveLast();        
+        example->AddCharL(' ');
+        example->AddCharL('T');
+        example->AddCharL('r');
+        example->AddCharL('a');
+        example->AddCharL('c');
+        example->AddCharL('e');
+        example->AddCharL('!');
+        CleanupStack::PopAndDestroy(example);
+        }
+    else
+        {
+        OstTrace0( TRACE_ERROR, HELLOTRACEEXAMPLE_UNSUPPORTED_VERSION, "Unsupported version!");
+        }
+    }
+
+EXPORT_C void HelloTraceExample::FnEntryExit()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_FNENTRYEXIT, "*********************************************** " );
+       
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    CIdle* idle = CIdle::NewL(CActive::EPriorityIdle);
+    CleanupStack::PushL(idle);
+
+    CHelloTraceFn::StaticOutputsParamsL(1);
+   
+    example->Simple();
+    example->OutputsParams(2, CHelloTraceFn::EExample1);
+    example->OutputsParams(3, CHelloTraceFn::EExample2);
+    example->OutputsSignedIntegers(-4, -5, -6, -7);
+    example->OutputsUnsignedIntegers(8, 9, 10, 11);
+    example->OutputsTIntReturnValue();    
+    example->OutputsTInt64ReturnValue(); 
+    example->OutputsTFnEnumReturnValue();
+    example->OutputsUnknownPtrType(idle);    
+    example->OutputsUnknownRefType(*idle);
+#ifdef _DEBUG
+    example->PreProcessedFn(12);
+#else
+    example->PreProcessedFn();
+#endif
+    example->OutputMissingParams(13, 14, 15);
+
+    CleanupStack::PopAndDestroy(idle);
+    CleanupStack::PopAndDestroy(example);
+    }
+
+EXPORT_C void HelloTraceExample::PanicTrace()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_PANIC, "*********************************************** " );
+
+    Panic(EHelloTraceDllExamplePanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceExample2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceExample.h"
+#include "HelloTraceTypes2.h"
+#include "HelloTraceInterface2.h"
+#include "HelloTraceFn2.h"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceExample2Traces.h"
+#endif
+
+EXPORT_C void HelloTraceExample::JustTypes()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_JUSTTYPES, "*********************************************** " );
+    
+    HelloTraceTypes::SignedIntegers();
+    HelloTraceTypes::UnsignedIntegers();
+    HelloTraceTypes::Descriptors();    
+    }
+
+EXPORT_C void HelloTraceExample::Interface()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_INTERFACE, "*********************************************** " );
+    
+    TVersion version = CHelloTraceInterface::Version();   
+    if (version.iMajor >= 1) 
+        {
+        CHelloTraceInterface* example = CHelloTraceInterface::NewLC();
+        example->AddCharL('H');
+        example->AddCharL('e');
+        example->AddCharL('l');
+        example->AddCharL('l');
+        example->AddCharL('o');
+        example->AddCharL('T');        
+        example->RemoveLast();        
+        example->AddCharL(' ');
+        example->AddCharL('T');
+        example->AddCharL('r');
+        example->AddCharL('a');
+        example->AddCharL('c');
+        example->AddCharL('e');
+        example->AddCharL('!');
+        CleanupStack::PopAndDestroy(example);
+        }
+    else
+        {
+        OstTrace0( TRACE_ERROR, HELLOTRACEEXAMPLE_UNSUPPORTED_VERSION, "Unsupported version!");
+        }
+    }
+
+EXPORT_C void HelloTraceExample::FnEntryExit()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_FNENTRYEXIT, "*********************************************** " );
+       
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    CIdle* idle = CIdle::NewL(CActive::EPriorityIdle);
+    CleanupStack::PushL(idle);
+
+    CHelloTraceFn::StaticOutputsParamsL(1);
+   
+    example->Simple();
+    example->OutputsParams(2, CHelloTraceFn::EExample1);
+    example->OutputsParams(3, CHelloTraceFn::EExample2);
+    example->OutputsSignedIntegers(-4, -5, -6, -7);
+    example->OutputsUnsignedIntegers(8, 9, 10, 11);
+    example->OutputsTIntReturnValue();    
+    example->OutputsTInt64ReturnValue(); 
+    example->OutputsTFnEnumReturnValue();
+    example->OutputsUnknownPtrType(idle);    
+    example->OutputsUnknownRefType(*idle);
+#ifdef _DEBUG
+    example->PreProcessedFn(12);
+#else
+    example->PreProcessedFn();
+#endif
+    example->OutputMissingParams(13, 14, 15);
+
+    CleanupStack::PopAndDestroy(idle);
+    CleanupStack::PopAndDestroy(example);
+    }
+
+EXPORT_C void HelloTraceExample::PanicTrace()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_PANIC, "*********************************************** " );
+
+    Panic(EHelloTraceDllExamplePanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceFn.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+ 
+#include "HelloTraceFn.h"
+#include "HelloTraceFnDup.h"
+#include "HelloTraceFnDup2.inl"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnTraces.h"
+#endif
+
+CHelloTraceFn* CHelloTraceFn::NewLC()
+    {
+    CHelloTraceFn* self = new (ELeave) CHelloTraceFn;
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+CHelloTraceFn* CHelloTraceFn::NewL()
+    {
+    CHelloTraceFn* self = CHelloTraceFn::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceFn::CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_CTOR, "[0x%08x] Constructor", this );    
+    }
+
+CHelloTraceFn::~CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_DTOR, "[0x%08x] Destructor", this );    
+    }
+
+void CHelloTraceFn::Simple()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsParams(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_EXIT, this );
+    }
+
+void CHelloTraceFn::StaticOutputsParamsL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->Simple();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_EXIT );    
+    }
+
+void CHelloTraceFn::OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_EXIT, this );
+    }
+
+
+TInt CHelloTraceFn::OutputsTIntReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+TInt64 CHelloTraceFn::OutputsTInt64ReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_EXIT, this, ret );
+    return ret;    
+    }
+
+CActive* CHelloTraceFn::OutputsUnknownPtrType(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+CActive& CHelloTraceFn::OutputsUnknownRefType(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+void CHelloTraceFn::OutputMissingParams(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+void CHelloTraceFn::PreProcessedFn()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    Simple();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceFn2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+ 
+#include "HelloTraceFn2.h"
+#include "HelloTraceFn2Dup.h"
+#include "HelloTraceFn2Dup2.inl"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFn2Traces.h"
+#endif
+
+CHelloTraceFn* CHelloTraceFn::NewLC()
+    {
+    CHelloTraceFn* self = new (ELeave) CHelloTraceFn;
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+CHelloTraceFn* CHelloTraceFn::NewL()
+    {
+    CHelloTraceFn* self = CHelloTraceFn::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceFn::CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_CTOR, "[0x%08x] Constructor", this );    
+    }
+
+CHelloTraceFn::~CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_DTOR, "[0x%08x] Destructor", this );    
+    }
+
+void CHelloTraceFn::Simple()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsParams(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_EXIT, this );
+    }
+
+void CHelloTraceFn::StaticOutputsParamsL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->Simple();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_EXIT );    
+    }
+
+void CHelloTraceFn::OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_EXIT, this );
+    }
+
+
+TInt CHelloTraceFn::OutputsTIntReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+TInt64 CHelloTraceFn::OutputsTInt64ReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_EXIT, this, ret );
+    return ret;    
+    }
+
+CActive* CHelloTraceFn::OutputsUnknownPtrType(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+CActive& CHelloTraceFn::OutputsUnknownRefType(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+void CHelloTraceFn::OutputMissingParams(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+void CHelloTraceFn::PreProcessedFn()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    Simple();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceInterface.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceInterface.h"
+#include "HelloTraceInterfaceDup.h"
+#include "HelloTraceInterfaceDup2.inl"
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceTraces.h"
+#endif
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewLC()
+    {
+    CHelloTraceInterface* self = new (ELeave) CHelloTraceInterface;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewL()
+    {
+    CHelloTraceInterface* self = CHelloTraceInterface::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceInterface::CHelloTraceInterface()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_CTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+void CHelloTraceInterface::ConstructL()
+    {
+    iString = new (ELeave) THelloTraceDllExampleString;
+    }
+
+EXPORT_C CHelloTraceInterface::~CHelloTraceInterface()
+    {
+    delete iString;
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_DTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+EXPORT_C TVersion CHelloTraceInterface::Version()
+    {
+    const TInt KMajor = 1;
+    const TInt KMinor = 0;
+    const TInt KBuild = 1;
+    TVersion version = TVersion(KMajor, KMinor, KBuild);
+    OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION, "CHelloTraceInterface::Version = %S", version.Name());   
+    return version;
+    }
+
+EXPORT_C const TPtrC CHelloTraceInterface::String() const
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING, 
+                     "[0x%08x] Returned %S", (TUint32) this, *iString);   
+    return *iString;
+    }
+
+EXPORT_C void CHelloTraceInterface::AddCharL(const TChar& aChar)
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL, 
+                  "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+    if (iString->Length() >= KHelloTraceDllBufferLength)
+        {
+        OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR,
+                   "[0x%08x] Not enough space to add character", (TUint32) this);
+        User::Leave( KErrTooBig);
+        }
+    iString->Append(aChar);
+    }
+
+EXPORT_C void CHelloTraceInterface::RemoveLast()
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST, 
+                  "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+    if (iString->Length() > 0)
+        {
+        iString->SetLength(iString->Length() - 1);
+        }
+    else
+        {
+        OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN, "[0x%08x] String already empty", (TUint32) this);   
+        }
+    }
+
+EXPORT_C void CHelloTraceInterface::ResetString()
+    {
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+    if (iString == NULL)
+        {
+        iString = new (ELeave) THelloTraceDllExampleString;
+        }
+    else
+        {
+        iString->SetLength(0);
+        }
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceInterface2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceInterface2.h"
+#include "HelloTraceInterface2Dup.h"
+#include "HelloTraceInterface2Dup2.inl"
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterface2Traces.h"
+#endif
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewLC()
+    {
+    CHelloTraceInterface* self = new (ELeave) CHelloTraceInterface;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewL()
+    {
+    CHelloTraceInterface* self = CHelloTraceInterface::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceInterface::CHelloTraceInterface()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_CTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+void CHelloTraceInterface::ConstructL()
+    {
+    iString = new (ELeave) THelloTraceDllExampleString;
+    }
+
+EXPORT_C CHelloTraceInterface::~CHelloTraceInterface()
+    {
+    delete iString;
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_DTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+EXPORT_C TVersion CHelloTraceInterface::Version()
+    {
+    const TInt KMajor = 1;
+    const TInt KMinor = 0;
+    const TInt KBuild = 1;
+    TVersion version = TVersion(KMajor, KMinor, KBuild);
+    OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION, "CHelloTraceInterface::Version = %S", version.Name());   
+    return version;
+    }
+
+EXPORT_C const TPtrC CHelloTraceInterface::String() const
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING, 
+                     "[0x%08x] Returned %S", (TUint32) this, *iString);   
+    return *iString;
+    }
+
+EXPORT_C void CHelloTraceInterface::AddCharL(const TChar& aChar)
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL, 
+                  "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+    if (iString->Length() >= KHelloTraceDllBufferLength)
+        {
+        OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR,
+                   "[0x%08x] Not enough space to add character", (TUint32) this);
+        User::Leave( KErrTooBig);
+        }
+    iString->Append(aChar);
+    }
+
+EXPORT_C void CHelloTraceInterface::RemoveLast()
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST, 
+                  "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+    if (iString->Length() > 0)
+        {
+        iString->SetLength(iString->Length() - 1);
+        }
+    else
+        {
+        OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN, "[0x%08x] String already empty", (TUint32) this);   
+        }
+    }
+
+EXPORT_C void CHelloTraceInterface::ResetString()
+    {
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+    if (iString == NULL)
+        {
+        iString = new (ELeave) THelloTraceDllExampleString;
+        }
+    else
+        {
+        iString->SetLength(0);
+        }
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTracePanic.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32std.h>		 // GLDEF_C
+
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTracePanicTraces.h"
+#endif
+
+GLDEF_C void Panic(THelloTraceDllPanic aPanic)
+    {
+    OstTrace1( TRACE_FATAL, PANIC, "Panic(%{THelloTraceDllPanic})", (TUint) aPanic );    
+    User::Panic(_L("HelloTraceDll"), aPanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTracePanic2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32std.h>		 // GLDEF_C
+
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTracePanic2Traces.h"
+#endif
+
+GLDEF_C void Panic(THelloTraceDllPanic aPanic)
+    {
+    OstTrace1( TRACE_FATAL, PANIC, "Panic(%{THelloTraceDllPanic})", (TUint) aPanic );    
+    User::Panic(_L("HelloTraceDll"), aPanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceTypes.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include <e32std.h>
+
+#include "HelloTraceTypes.h"
+#include "HelloTraceTypesDup.h"
+#include "HelloTraceTypesDup2.inl"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesTraces.h"
+#endif
+
+void HelloTraceTypes::SignedIntegers()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+void HelloTraceTypes::UnsignedIntegers()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+void HelloTraceTypes::Descriptors()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE, "16 bit descriptor: %S", KUnicode() );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/src/HelloTraceTypes2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include <e32std.h>
+
+#include "HelloTraceTypes2.h"
+#include "HelloTraceTypes2Dup.h"
+#include "HelloTraceTypes2Dup2.inl"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypes2Traces.h"
+#endif
+
+void HelloTraceTypes::SignedIntegers()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+void HelloTraceTypes::UnsignedIntegers()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+void HelloTraceTypes::Descriptors()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE, "16 bit descriptor: %S", KUnicode() );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/dll/traces/trace.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<trace_properties>
+<enum name="TFnEnum">
+<value id="0">EExample1</value>
+<value id="2">EExample2</value>
+</enum>
+<enum name="THelloTraceDllPanic">
+<value id="0">EHelloTraceDllExamplePanic</value>
+<value id="1">EHelloTraceDllNullPointer</value>
+</enum>
+<file>../incDup/HelloTraceInterfaceDup.h</file>
+<file>../incDup/HelloTraceInterfaceDup2.inl</file>
+<file>../incDup/HelloTraceFnDup.h</file>
+<file>../incDup/HelloTraceFnDup2.inl</file>
+<file>../incDup/HelloTraceTypesDup.h</file>
+<file>../incDup/HelloTraceTypesDup2.inl</file>
+<file>../incDup/HelloTraceInterface2Dup.h</file>
+<file>../incDup/HelloTraceInterface2Dup2.inl</file>
+<file>../incDup/HelloTraceFn2Dup.h</file>
+<file>../incDup/HelloTraceFn2Dup2.inl</file>
+<file>../incDup/HelloTraceTypes2Dup.h</file>
+<file>../incDup/HelloTraceTypes2Dup2.inl</file>
+</trace_properties>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/multmmp_separate_source/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,19 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+#include "../dll/group/bld.inf"
+#include "../console/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/console/group/HelloTraceConsole.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceConsole.exe
+TARGETTYPE	  exe
+UID			  0 0xE40349E4
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE	   ../inc
+USERINCLUDE    ../../dll/inc
+USERINCLUDE    ../traces
+
+SOURCEPATH	  ../src
+SOURCE		  HelloTraceConsole.cpp
+
+LIBRARY		  euser.lib
+LIBRARY       HelloTraceDll.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/console/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotraceconsole.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotraceconsole.iby)
+
+PRJ_MMPFILES
+HelloTraceConsole.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/console/group/hellotraceconsole.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACECONSOLE_IBY
+#define HELLOTRACECONSOLE_IBY
+
+#include <core\os\hellotracedll.iby>
+
+file=ABI_DIR\BUILD_DIR\hellotraceconsole.exe    Sys\Bin\hellotraceconsole.exe
+
+#endif //HELLOTRACECONSOLE_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/console/inc/HelloTraceConsole.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACECONSOLE_H__
+#define __HELLOTRACECONSOLE_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+
+#endif  // __HELLOTRACECONSOLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/bwins/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,14 @@
+EXPORTS
+	?Version@CHelloTraceInterface@@SA?AVTVersion@@XZ @ 1 NONAME ; class TVersion CHelloTraceInterface::Version(void)
+	?NewLC@CHelloTraceInterface@@SAPAV1@XZ @ 2 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewLC(void)
+	?JustTypes@HelloTraceExample@@SAXXZ @ 3 NONAME ; void HelloTraceExample::JustTypes(void)
+	?Interface@HelloTraceExample@@SAXXZ @ 4 NONAME ; void HelloTraceExample::Interface(void)
+	?FnEntryExit@HelloTraceExample@@SAXXZ @ 5 NONAME ; void HelloTraceExample::FnEntryExit(void)
+	?ResetString@CHelloTraceInterface@@QAEXXZ @ 6 NONAME ; void CHelloTraceInterface::ResetString(void)
+	?AddCharL@CHelloTraceInterface@@QAEXABVTChar@@@Z @ 7 NONAME ; void CHelloTraceInterface::AddCharL(class TChar const &)
+	?PanicTrace@HelloTraceExample@@SAXXZ @ 8 NONAME ; void HelloTraceExample::PanicTrace(void)
+	??1CHelloTraceInterface@@UAE@XZ @ 9 NONAME ; CHelloTraceInterface::~CHelloTraceInterface(void)
+	?String@CHelloTraceInterface@@QBE?BVTPtrC16@@XZ @ 10 NONAME ; class TPtrC16 const CHelloTraceInterface::String(void) const
+	?RemoveLast@CHelloTraceInterface@@QAEXXZ @ 11 NONAME ; void CHelloTraceInterface::RemoveLast(void)
+	?NewL@CHelloTraceInterface@@SAPAV1@XZ @ 12 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewL(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/eabi/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,20 @@
+EXPORTS
+	_ZN17HelloTraceExample10PanicTraceEv @ 1 NONAME
+	_ZN17HelloTraceExample11FnEntryExitEv @ 2 NONAME
+	_ZN17HelloTraceExample9InterfaceEv @ 3 NONAME
+	_ZN17HelloTraceExample9JustTypesEv @ 4 NONAME
+	_ZN20CHelloTraceInterface10RemoveLastEv @ 5 NONAME
+	_ZN20CHelloTraceInterface11ResetStringEv @ 6 NONAME
+	_ZN20CHelloTraceInterface4NewLEv @ 7 NONAME
+	_ZN20CHelloTraceInterface5NewLCEv @ 8 NONAME
+	_ZN20CHelloTraceInterface7VersionEv @ 9 NONAME
+	_ZN20CHelloTraceInterface8AddCharLERK5TChar @ 10 NONAME
+	_ZN20CHelloTraceInterfaceD0Ev @ 11 NONAME
+	_ZN20CHelloTraceInterfaceD1Ev @ 12 NONAME
+	_ZN20CHelloTraceInterfaceD2Ev @ 13 NONAME
+	_ZNK20CHelloTraceInterface6StringEv @ 14 NONAME
+	_ZTI13CHelloTraceFn @ 15 NONAME
+	_ZTI20CHelloTraceInterface @ 16 NONAME
+	_ZTV13CHelloTraceFn @ 17 NONAME
+	_ZTV20CHelloTraceInterface @ 18 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/group/HelloTraceDll.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceDll.dll
+TARGETTYPE	  dll
+UID			  0x1000008d 0xE43DF43E
+CAPABILITY    ReadUserData
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE  ../inc ../incDup
+USERINCLUDE  ../traces
+
+SOURCEPATH	 ../src
+SOURCE       HelloTraceExample.cpp 
+SOURCE       HelloTraceTypes.cpp
+SOURCE       HelloTraceInterface.cpp 
+SOURCE       HelloTraceFn.cpp 
+SOURCE       HelloTracePanic.cpp 
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotracedll.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotracedll.iby)
+../inc/hellotracefn.h		      OS_LAYER_PLATFORM_EXPORT_PATH(hellotracefn.h)
+
+PRJ_MMPFILES
+HelloTraceDll.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/group/hellotracedll.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,22 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACEDLL_IBY
+#define HELLOTRACEDLL_IBY
+
+file=ABI_DIR\BUILD_DIR\hellotracedll.dll        Sys\Bin\hellotracedll.dll
+
+#endif //HELLOTRACEDLL_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/inc/HelloTraceExample.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEEXAMPLE_H__
+#define __HELLOTRACEEXAMPLE_H__
+
+#include <e32std.h>
+
+class HelloTraceExample
+    {
+public:
+    IMPORT_C static void JustTypes();    
+    IMPORT_C static void Interface();    
+    IMPORT_C static void FnEntryExit();    
+    IMPORT_C static void PanicTrace();    
+
+    // @TODO add examples for state macros
+    // @TODO add examples for event macros
+    // @TODO add examples for OstTraceData
+    // @TODO add compile-time selector examples
+    // @TODO add macro wrapper examples
+    };
+
+#endif  // __HELLOTRACEEXAMPLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/inc/HelloTraceFn.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFN_H_
+#define HELLOTRACEFN_H_
+
+#include <e32base.h>    // CBase
+
+class CHelloTraceFn : public CBase
+    {
+public:
+    
+    // Note the Trace Builder will only parse this if it's in a cpp file
+    // but not from here :(
+    // Also if you add a new enum you need to reparse the enum - it doesn't
+    // get automatically reparsed by the Trace Compiler :(
+    enum TFnEnum
+        {
+        EExample1,
+        EExample2 = 2, 
+        // EExample3 = EExample2 + 1, // The Trace Builder can't parse this :(
+        };
+    
+public:
+    static CHelloTraceFn* NewL();
+    static CHelloTraceFn* NewLC();
+    ~CHelloTraceFn();
+   
+public: // Fn entry / exit tracing examples 
+    void Simple();
+    void OutputsParams(TInt aParam, TFnEnum aEnumParam);
+    void OutputsParams2(TInt aParam, TFnEnum aEnumParam);
+    void OutputsParams3(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValue();
+    TInt64 OutputsTInt64ReturnValue();
+    TFnEnum OutputsTFnEnumReturnValue();
+
+    CActive* OutputsUnknownPtrType(CActive* aActive);
+    CActive& OutputsUnknownRefType(CActive& aActive);
+    
+    void OutputMissingParams(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFn(TInt aDbgParam);
+#else
+    void PreProcessedFn();
+#endif
+    
+    static void StaticOutputsParamsL(TInt aParam);  
+    
+    // duplicate all the function and put the impl in the header file HelloTraceFnDup.h
+    void SimpleDup();
+    void OutputsParamsDup(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup();
+    TInt64 OutputsTInt64ReturnValueDup();
+    TFnEnum OutputsTFnEnumReturnValueDup();
+
+    CActive* OutputsUnknownPtrTypeDup(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup(CActive& aActive);
+    
+    void OutputMissingParamsDup(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup(TInt aDbgParam);
+#else
+    void PreProcessedFnDup();
+#endif
+    static void StaticOutputsParamsDupL(TInt aParam);  
+    
+    // duplicate all the function again and put the impl in the header file HelloTraceFnDup2.h
+    void SimpleDup2();
+    void OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup2();
+    TInt64 OutputsTInt64ReturnValueDup2();
+    TFnEnum OutputsTFnEnumReturnValueDup2();
+
+    CActive* OutputsUnknownPtrTypeDup2(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup2(CActive& aActive);
+    
+    void OutputMissingParamsDup2(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup2(TInt aDbgParam);
+#else
+    void PreProcessedFnDup2();
+#endif
+    static void StaticOutputsParamsDup2L(TInt aParam);  
+
+
+private:
+    CHelloTraceFn();
+    };
+
+#endif /* HELLOTRACEFN_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/inc/HelloTraceInterface.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE_H__
+#define __HELLOTRACEINTERFACE_H__
+
+#include <e32base.h>	// CBase
+#include <e32std.h>	 // TBuf
+
+const TInt KHelloTraceDllBufferLength = 10;
+typedef TBuf<KHelloTraceDllBufferLength> THelloTraceDllExampleString;
+
+class CHelloTraceInterface : public CBase
+    {
+public:
+    IMPORT_C static CHelloTraceInterface* NewL();
+    IMPORT_C static CHelloTraceInterface* NewLC();
+    IMPORT_C ~CHelloTraceInterface();
+
+public:
+    IMPORT_C static TVersion Version();
+    IMPORT_C const TPtrC String() const;
+    IMPORT_C void AddCharL(const TChar& aChar);
+    IMPORT_C void RemoveLast();
+    IMPORT_C void ResetString();
+    
+    IMPORT_C static TVersion VersionDup();
+    IMPORT_C const TPtrC StringDup() const;
+    IMPORT_C void AddCharDupL(const TChar& aChar);
+    IMPORT_C void RemoveLastDup();
+    IMPORT_C void ResetStringDup();
+
+    IMPORT_C static TVersion VersionDup2();
+    IMPORT_C const TPtrC StringDup2() const;
+    IMPORT_C void AddCharDup2L(const TChar& aChar);
+    IMPORT_C void RemoveLastDup2();
+    IMPORT_C void ResetStringDup2();
+private:
+    CHelloTraceInterface();
+    void ConstructL();
+
+private:
+    // data
+    THelloTraceDllExampleString* iString;
+    };
+
+#endif  // __HELLOTRACEINTERFACE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/inc/HelloTracePanic.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEDLL_PAN__
+#define __HELLOTRACEDLL_PAN__
+
+//  Data Types
+
+enum THelloTraceDllPanic
+    {
+    EHelloTraceDllExamplePanic,
+    EHelloTraceDllNullPointer,
+    };
+
+//  Function Prototypes
+
+GLREF_C void Panic(THelloTraceDllPanic aPanic);
+
+#endif  // __HELLOTRACEDLL_PAN__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/inc/HelloTraceTypes.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES_H__
+#define __HELLOTRACETYPES_H__
+
+class HelloTraceTypes
+    {
+public:
+    static void SignedIntegers();
+    static void UnsignedIntegers();
+    static void Descriptors();
+    
+    static void SignedIntegersDup();
+    static void UnsignedIntegersDup();
+    static void DescriptorsDup();
+        
+    static void SignedIntegersDup2();
+    static void UnsignedIntegersDup2();
+    static void DescriptorsDup2();
+    };
+
+#endif  // __HELLOTRACETYPES_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/incDup/HelloTraceFnDup.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,156 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP_H_
+#define HELLOTRACEFNDUP_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDupTraces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDupL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/incDup/HelloTraceFnDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP2_H_
+#define HELLOTRACEFNDUP2_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDup2Traces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDup2L(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup2();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup2(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup2(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup2(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup2(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup2()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup2();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP2_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/incDup/HelloTraceInterfaceDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP_H__
+#define __HELLOTRACEINTERFACEDUP_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDupTraces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDupL(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/incDup/HelloTraceInterfaceDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP2_H__
+#define __HELLOTRACEINTERFACEDUP2_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDup2Traces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup2()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP2, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup2() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP2, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDup2L(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP2, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP2,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup2()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP2, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP2, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup2()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP2, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/incDup/HelloTraceTypesDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP_H__
+#define __HELLOTRACETYPESDUP_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDupTraces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/incDup/HelloTraceTypesDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP2_H__
+#define __HELLOTRACETYPESDUP2_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDup2Traces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup2()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup2()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup2()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP2, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP2, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/src/HelloTraceExample.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,107 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include "HelloTraceExample.h"
+#include "HelloTraceTypes.h"
+#include "HelloTraceInterface.h"
+#include "HelloTraceFn.h"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceExampleTraces.h"
+#endif
+
+EXPORT_C void HelloTraceExample::JustTypes()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_JUSTTYPES, "*********************************************** " );
+    
+    HelloTraceTypes::SignedIntegers();
+    HelloTraceTypes::UnsignedIntegers();
+    HelloTraceTypes::Descriptors();    
+    }
+
+EXPORT_C void HelloTraceExample::Interface()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_INTERFACE, "*********************************************** " );
+    
+    TVersion version = CHelloTraceInterface::Version();   
+    if (version.iMajor >= 1) 
+        {
+        CHelloTraceInterface* example = CHelloTraceInterface::NewLC();
+        example->AddCharL('H');
+        example->AddCharL('e');
+        example->AddCharL('l');
+        example->AddCharL('l');
+        example->AddCharL('o');
+        example->AddCharL('T');        
+        example->RemoveLast();        
+        example->AddCharL(' ');
+        example->AddCharL('T');
+        example->AddCharL('r');
+        example->AddCharL('a');
+        example->AddCharL('c');
+        example->AddCharL('e');
+        example->AddCharL('!');
+        CleanupStack::PopAndDestroy(example);
+        }
+    else
+        {
+        OstTrace0( TRACE_ERROR, HELLOTRACEEXAMPLE_UNSUPPORTED_VERSION, "Unsupported version!");
+        }
+    }
+
+EXPORT_C void HelloTraceExample::FnEntryExit()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_FNENTRYEXIT, "*********************************************** " );
+       
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    CIdle* idle = CIdle::NewL(CActive::EPriorityIdle);
+    CleanupStack::PushL(idle);
+
+    CHelloTraceFn::StaticOutputsParamsL(1);
+   
+    example->Simple();
+    example->OutputsParams(2, CHelloTraceFn::EExample1);
+    example->OutputsParams2(2, CHelloTraceFn::EExample1);
+    example->OutputsParams3(2, CHelloTraceFn::EExample1);
+    example->OutputsParams(3, CHelloTraceFn::EExample2);
+    example->OutputsSignedIntegers(-4, -5, -6, -7);
+    example->OutputsUnsignedIntegers(8, 9, 10, 11);
+    example->OutputsTIntReturnValue();    
+    example->OutputsTInt64ReturnValue(); 
+    example->OutputsTFnEnumReturnValue();
+    example->OutputsUnknownPtrType(idle);    
+    example->OutputsUnknownRefType(*idle);
+#ifdef _DEBUG
+    example->PreProcessedFn(12);
+#else
+    example->PreProcessedFn();
+#endif
+    example->OutputMissingParams(13, 14, 15);
+
+    CleanupStack::PopAndDestroy(idle);
+    CleanupStack::PopAndDestroy(example);
+    }
+
+EXPORT_C void HelloTraceExample::PanicTrace()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_PANIC, "*********************************************** " );
+
+    Panic(EHelloTraceDllExamplePanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/src/HelloTraceFn.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,200 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+ 
+#include "HelloTraceFn.h"
+#include "HelloTraceFnDup.inl"
+#include "HelloTraceFnDup2.inl"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnTraces.h"
+#endif
+
+
+CHelloTraceFn* CHelloTraceFn::NewLC()
+    {
+    CHelloTraceFn* self = new (ELeave) CHelloTraceFn;
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+CHelloTraceFn* CHelloTraceFn::NewL()
+    {
+    CHelloTraceFn* self = CHelloTraceFn::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceFn::CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_CTOR, "[0x%08x] Constructor", this );  
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_CTOR_TEXTWITHTAB, "[0x%08x] Constructor -   Trace text with tabs", this );
+    }
+
+CHelloTraceFn::~CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_DTOR, "[0x%08x] Destructor", this );    
+    }
+
+void CHelloTraceFn::Simple()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_ENTRY, this );
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_SIMPLE_ENTRY_EXT_NO_PARAM, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsParams(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_EXIT, this );
+    }
+void CHelloTraceFn::OutputsParams2(TInt /*aParam*/, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS2_PRAMCOMMENTED_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS2_EXIT, this );
+    }
+    
+void CHelloTraceFn::OutputsParams3(TInt /*aParam*/, TFnEnum /*aEnumParam*/)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS3_ALLPARAMCOMMENTED_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS3_EXIT, this );
+    }    
+
+void CHelloTraceFn::StaticOutputsParamsL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->Simple();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_EXIT );    
+    }
+
+void CHelloTraceFn::OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_EXIT, this );
+    }
+
+
+TInt CHelloTraceFn::OutputsTIntReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+TInt64 CHelloTraceFn::OutputsTInt64ReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_EXIT, this, ret );
+    return ret;    
+    }
+
+CActive* CHelloTraceFn::OutputsUnknownPtrType(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+CActive& CHelloTraceFn::OutputsUnknownRefType(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+void CHelloTraceFn::OutputMissingParams(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+void CHelloTraceFn::PreProcessedFn()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    Simple();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/src/HelloTraceInterface.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceInterface.h"
+#include "HelloTraceInterfaceDup.h"
+#include "HelloTraceInterfaceDup2.inl"
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceTraces.h"
+#endif
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewLC()
+    {
+    CHelloTraceInterface* self = new (ELeave) CHelloTraceInterface;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewL()
+    {
+    CHelloTraceInterface* self = CHelloTraceInterface::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceInterface::CHelloTraceInterface()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_CTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+void CHelloTraceInterface::ConstructL()
+    {
+    iString = new (ELeave) THelloTraceDllExampleString;
+    }
+
+EXPORT_C CHelloTraceInterface::~CHelloTraceInterface()
+    {
+    delete iString;
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_DTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+EXPORT_C TVersion CHelloTraceInterface::Version()
+    {
+    const TInt KMajor = 1;
+    const TInt KMinor = 0;
+    const TInt KBuild = 1;
+    TVersion version = TVersion(KMajor, KMinor, KBuild);
+    OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION, "CHelloTraceInterface::Version = %S", version.Name());   
+    return version;
+    }
+
+EXPORT_C const TPtrC CHelloTraceInterface::String() const
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING, 
+                     "[0x%08x] Returned %S", (TUint32) this, *iString);   
+    return *iString;
+    }
+
+EXPORT_C void CHelloTraceInterface::AddCharL(const TChar& aChar)
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL, 
+                  "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+    if (iString->Length() >= KHelloTraceDllBufferLength)
+        {
+        OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR,
+                   "[0x%08x] Not enough space to add character", (TUint32) this);
+        User::Leave( KErrTooBig);
+        }
+    iString->Append(aChar);
+    }
+
+EXPORT_C void CHelloTraceInterface::RemoveLast()
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST, 
+                  "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+    if (iString->Length() > 0)
+        {
+        iString->SetLength(iString->Length() - 1);
+        }
+    else
+        {
+        OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN, "[0x%08x] String already empty", (TUint32) this);   
+        }
+    }
+
+EXPORT_C void CHelloTraceInterface::ResetString()
+    {
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+    if (iString == NULL)
+        {
+        iString = new (ELeave) THelloTraceDllExampleString;
+        }
+    else
+        {
+        iString->SetLength(0);
+        }
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/src/HelloTracePanic.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32std.h>		 // GLDEF_C
+
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTracePanicTraces.h"
+#endif
+
+GLDEF_C void Panic(THelloTraceDllPanic aPanic)
+    {
+    OstTrace1( TRACE_FATAL, PANIC, "Panic(%{THelloTraceDllPanic})", (TUint) aPanic );    
+    User::Panic(_L("HelloTraceDll"), aPanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/src/HelloTraceTypes.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include <e32std.h>
+
+#include "HelloTraceTypes.h"
+#include "HelloTraceTypesDup.h"
+#include "HelloTraceTypesDup2.inl"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesTraces.h"
+#endif
+
+void HelloTraceTypes::SignedIntegers()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+void HelloTraceTypes::UnsignedIntegers()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+void HelloTraceTypes::Descriptors()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE, "16 bit descriptor: %S", KUnicode() );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/dll/traces/trace.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<trace_properties>
+<enum name="TFnEnum">
+<value id="0">EExample1</value>
+<value id="2">EExample2</value>
+</enum>
+<enum name="THelloTraceDllPanic">
+<value id="0">EHelloTraceDllExamplePanic</value>
+<value id="1">EHelloTraceDllNullPointer</value>
+</enum>
+<file>../incDup/HelloTraceInterfaceDup.h</file>
+<file>../incDup/HelloTraceInterfaceDup2.inl</file>
+<file>../incDup/HelloTraceFnDup.inl</file>
+<file>../incDup/HelloTraceFnDup2.inl</file>
+<file>../incDup/HelloTraceTypesDup.h</file>
+<file>../incDup/HelloTraceTypesDup2.inl</file>
+</trace_properties>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,19 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+#include "../dll/group/bld.inf"
+#include "../console/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/console/group/HelloTraceConsole.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceConsole.exe
+TARGETTYPE	  exe
+UID			  0 0xE40349E4
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE	   ../inc
+USERINCLUDE    ../../dll/inc
+USERINCLUDE    ../traces
+
+SOURCEPATH	  ../src
+SOURCE		  HelloTraceConsole.cpp
+
+LIBRARY		  euser.lib
+LIBRARY       HelloTraceDll.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/console/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotraceconsole.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotraceconsole.iby)
+
+PRJ_MMPFILES
+HelloTraceConsole.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/console/group/hellotraceconsole.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACECONSOLE_IBY
+#define HELLOTRACECONSOLE_IBY
+
+#include <core\os\hellotracedll.iby>
+
+file=ABI_DIR\BUILD_DIR\hellotraceconsole.exe    Sys\Bin\hellotraceconsole.exe
+
+#endif //HELLOTRACECONSOLE_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/console/inc/HelloTraceConsole.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACECONSOLE_H__
+#define __HELLOTRACECONSOLE_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+
+#endif  // __HELLOTRACECONSOLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/console/src/HelloTraceConsole.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32cons.h>			// Console
+
+#include "HelloTraceConsole.h"
+#include "HelloTraceExample.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceConsoleTraces.h"
+#endif
+
+
+_LIT(KTextConsoleTitle, "HelloTrace");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+LOCAL_C void DoExamples()
+    {
+    TInt err = KErrNone;
+
+    console->Printf(_L("Before main tracing examples ...\n"));
+
+    console->Printf(_L(" Before type examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::JustTypes());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+
+    console->Printf(_L(" Before Interface examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::Interface());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+    
+    console->Printf(_L(" Before FnEntryExit examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::FnEntryExit());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);    
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    DoExamples();
+    
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    OstTraceFunctionEntry0( E32MAIN_ENTRY );
+    
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, 
+          console = Console::NewL(KTextConsoleTitle, 
+                                  TSize(KConsFullScreen, KConsFullScreen)));    
+    if (createError)
+        {
+        delete cleanup;
+        OstTrace1( TRACE_ERROR, E32MAIN_CREATE_ERROR, "Failed to create console error: %d", createError);
+        OstTraceFunctionExit0( E32MAIN_EXIT_ERR );
+        return createError;
+        }
+
+    TRAPD(mainError, DoStartL());    
+    if (mainError)
+        {
+        OstTrace1( TRACE_ERROR, E32MAIN_START_ERROR, "DoStartL failed with error: %d", mainError);
+        console->Printf(_L("DoStartL failed with error: %d\n\n"), mainError);
+        }
+    else 
+        {
+        console->Printf(_L("Before panic tracing example ..."));
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+    
+        OstTrace0( TRACE_FLOW, E32MAIN_BEFORE_PANIC, "About to cause a panic ..." );
+        HelloTraceExample::PanicTrace();
+        
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+        }
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    
+    OstTraceFunctionExit0( E32MAIN_EXIT );
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/bwins/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,14 @@
+EXPORTS
+	?Version@CHelloTraceInterface@@SA?AVTVersion@@XZ @ 1 NONAME ; class TVersion CHelloTraceInterface::Version(void)
+	?NewLC@CHelloTraceInterface@@SAPAV1@XZ @ 2 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewLC(void)
+	?JustTypes@HelloTraceExample@@SAXXZ @ 3 NONAME ; void HelloTraceExample::JustTypes(void)
+	?Interface@HelloTraceExample@@SAXXZ @ 4 NONAME ; void HelloTraceExample::Interface(void)
+	?FnEntryExit@HelloTraceExample@@SAXXZ @ 5 NONAME ; void HelloTraceExample::FnEntryExit(void)
+	?ResetString@CHelloTraceInterface@@QAEXXZ @ 6 NONAME ; void CHelloTraceInterface::ResetString(void)
+	?AddCharL@CHelloTraceInterface@@QAEXABVTChar@@@Z @ 7 NONAME ; void CHelloTraceInterface::AddCharL(class TChar const &)
+	?PanicTrace@HelloTraceExample@@SAXXZ @ 8 NONAME ; void HelloTraceExample::PanicTrace(void)
+	??1CHelloTraceInterface@@UAE@XZ @ 9 NONAME ; CHelloTraceInterface::~CHelloTraceInterface(void)
+	?String@CHelloTraceInterface@@QBE?BVTPtrC16@@XZ @ 10 NONAME ; class TPtrC16 const CHelloTraceInterface::String(void) const
+	?RemoveLast@CHelloTraceInterface@@QAEXXZ @ 11 NONAME ; void CHelloTraceInterface::RemoveLast(void)
+	?NewL@CHelloTraceInterface@@SAPAV1@XZ @ 12 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewL(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/eabi/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,20 @@
+EXPORTS
+	_ZN17HelloTraceExample10PanicTraceEv @ 1 NONAME
+	_ZN17HelloTraceExample11FnEntryExitEv @ 2 NONAME
+	_ZN17HelloTraceExample9InterfaceEv @ 3 NONAME
+	_ZN17HelloTraceExample9JustTypesEv @ 4 NONAME
+	_ZN20CHelloTraceInterface10RemoveLastEv @ 5 NONAME
+	_ZN20CHelloTraceInterface11ResetStringEv @ 6 NONAME
+	_ZN20CHelloTraceInterface4NewLEv @ 7 NONAME
+	_ZN20CHelloTraceInterface5NewLCEv @ 8 NONAME
+	_ZN20CHelloTraceInterface7VersionEv @ 9 NONAME
+	_ZN20CHelloTraceInterface8AddCharLERK5TChar @ 10 NONAME
+	_ZN20CHelloTraceInterfaceD0Ev @ 11 NONAME
+	_ZN20CHelloTraceInterfaceD1Ev @ 12 NONAME
+	_ZN20CHelloTraceInterfaceD2Ev @ 13 NONAME
+	_ZNK20CHelloTraceInterface6StringEv @ 14 NONAME
+	_ZTI13CHelloTraceFn @ 15 NONAME
+	_ZTI20CHelloTraceInterface @ 16 NONAME
+	_ZTV13CHelloTraceFn @ 17 NONAME
+	_ZTV20CHelloTraceInterface @ 18 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/group/HelloTraceDll.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceDll.dll
+TARGETTYPE	  dll
+UID			  0x1000008d 0xE43DF43E
+CAPABILITY    ReadUserData
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE  ../inc ../incDup
+USERINCLUDE  ../traces/HelloTraceDll_dll
+
+SOURCEPATH	 ../src
+SOURCE       HelloTraceExample.cpp 
+SOURCE       HelloTraceTypes.cpp
+SOURCE       HelloTraceInterface.cpp 
+SOURCE       HelloTraceFn.cpp 
+SOURCE       HelloTracePanic.cpp 
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotracedll.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotracedll.iby)
+
+PRJ_MMPFILES
+HelloTraceDll.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/group/hellotracedll.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,22 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACEDLL_IBY
+#define HELLOTRACEDLL_IBY
+
+file=ABI_DIR\BUILD_DIR\hellotracedll.dll        Sys\Bin\hellotracedll.dll
+
+#endif //HELLOTRACEDLL_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/inc/HelloTraceExample.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEEXAMPLE_H__
+#define __HELLOTRACEEXAMPLE_H__
+
+#include <e32std.h>
+
+class HelloTraceExample
+    {
+public:
+    IMPORT_C static void JustTypes();    
+    IMPORT_C static void Interface();    
+    IMPORT_C static void FnEntryExit();    
+    IMPORT_C static void PanicTrace();    
+
+    // @TODO add examples for state macros
+    // @TODO add examples for event macros
+    // @TODO add examples for OstTraceData
+    // @TODO add compile-time selector examples
+    // @TODO add macro wrapper examples
+    };
+
+#endif  // __HELLOTRACEEXAMPLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/inc/HelloTraceFn.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFN_H_
+#define HELLOTRACEFN_H_
+
+#include <e32base.h>    // CBase
+
+class CHelloTraceFn : public CBase
+    {
+public:
+    
+    // Note the Trace Builder will only parse this if it's in a cpp file
+    // but not from here :(
+    // Also if you add a new enum you need to reparse the enum - it doesn't
+    // get automatically reparsed by the Trace Compiler :(
+    enum TFnEnum
+        {
+        EExample1,
+        EExample2 = 2, 
+        // EExample3 = EExample2 + 1, // The Trace Builder can't parse this :(
+        };
+    
+public:
+    static CHelloTraceFn* NewL();
+    static CHelloTraceFn* NewLC();
+    ~CHelloTraceFn();
+   
+public: // Fn entry / exit tracing examples 
+    void Simple();
+    void OutputsParams(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValue();
+    TInt64 OutputsTInt64ReturnValue();
+    TFnEnum OutputsTFnEnumReturnValue();
+
+    CActive* OutputsUnknownPtrType(CActive* aActive);
+    CActive& OutputsUnknownRefType(CActive& aActive);
+    
+    void OutputMissingParams(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFn(TInt aDbgParam);
+#else
+    void PreProcessedFn();
+#endif
+    
+    static void StaticOutputsParamsL(TInt aParam);  
+    
+    // duplicate all the function and put the impl in the header file HelloTraceFnDup.h
+    void SimpleDup();
+    void OutputsParamsDup(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup();
+    TInt64 OutputsTInt64ReturnValueDup();
+    TFnEnum OutputsTFnEnumReturnValueDup();
+
+    CActive* OutputsUnknownPtrTypeDup(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup(CActive& aActive);
+    
+    void OutputMissingParamsDup(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup(TInt aDbgParam);
+#else
+    void PreProcessedFnDup();
+#endif
+    static void StaticOutputsParamsDupL(TInt aParam);  
+    
+    // duplicate all the function again and put the impl in the header file HelloTraceFnDup2.h
+    void SimpleDup2();
+    void OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup2();
+    TInt64 OutputsTInt64ReturnValueDup2();
+    TFnEnum OutputsTFnEnumReturnValueDup2();
+
+    CActive* OutputsUnknownPtrTypeDup2(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup2(CActive& aActive);
+    
+    void OutputMissingParamsDup2(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup2(TInt aDbgParam);
+#else
+    void PreProcessedFnDup2();
+#endif
+    static void StaticOutputsParamsDup2L(TInt aParam);  
+
+
+private:
+    CHelloTraceFn();
+    };
+
+#endif /* HELLOTRACEFN_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/inc/HelloTraceInterface.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE_H__
+#define __HELLOTRACEINTERFACE_H__
+
+#include <e32base.h>	// CBase
+#include <e32std.h>	 // TBuf
+
+const TInt KHelloTraceDllBufferLength = 10;
+typedef TBuf<KHelloTraceDllBufferLength> THelloTraceDllExampleString;
+
+class CHelloTraceInterface : public CBase
+    {
+public:
+    IMPORT_C static CHelloTraceInterface* NewL();
+    IMPORT_C static CHelloTraceInterface* NewLC();
+    IMPORT_C ~CHelloTraceInterface();
+
+public:
+    IMPORT_C static TVersion Version();
+    IMPORT_C const TPtrC String() const;
+    IMPORT_C void AddCharL(const TChar& aChar);
+    IMPORT_C void RemoveLast();
+    IMPORT_C void ResetString();
+    
+    IMPORT_C static TVersion VersionDup();
+    IMPORT_C const TPtrC StringDup() const;
+    IMPORT_C void AddCharDupL(const TChar& aChar);
+    IMPORT_C void RemoveLastDup();
+    IMPORT_C void ResetStringDup();
+
+    IMPORT_C static TVersion VersionDup2();
+    IMPORT_C const TPtrC StringDup2() const;
+    IMPORT_C void AddCharDup2L(const TChar& aChar);
+    IMPORT_C void RemoveLastDup2();
+    IMPORT_C void ResetStringDup2();
+private:
+    CHelloTraceInterface();
+    void ConstructL();
+
+private:
+    // data
+    THelloTraceDllExampleString* iString;
+    };
+
+#endif  // __HELLOTRACEINTERFACE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/inc/HelloTracePanic.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEDLL_PAN__
+#define __HELLOTRACEDLL_PAN__
+
+//  Data Types
+
+enum THelloTraceDllPanic
+    {
+    EHelloTraceDllExamplePanic,
+    EHelloTraceDllNullPointer,
+    };
+
+//  Function Prototypes
+
+GLREF_C void Panic(THelloTraceDllPanic aPanic);
+
+#endif  // __HELLOTRACEDLL_PAN__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/inc/HelloTraceTypes.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES_H__
+#define __HELLOTRACETYPES_H__
+
+class HelloTraceTypes
+    {
+public:
+    static void SignedIntegers();
+    static void UnsignedIntegers();
+    static void Descriptors();
+    
+    static void SignedIntegersDup();
+    static void UnsignedIntegersDup();
+    static void DescriptorsDup();
+        
+    static void SignedIntegersDup2();
+    static void UnsignedIntegersDup2();
+    static void DescriptorsDup2();
+    };
+
+#endif  // __HELLOTRACETYPES_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/incDup/HelloTraceFnDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP_H_
+#define HELLOTRACEFNDUP_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDupTraces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDupL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/incDup/HelloTraceFnDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP2_H_
+#define HELLOTRACEFNDUP2_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDup2Traces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDup2L(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup2();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup2(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup2(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup2(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup2(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup2()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup2();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP2_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/incDup/HelloTraceInterfaceDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP_H__
+#define __HELLOTRACEINTERFACEDUP_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDupTraces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDupL(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/incDup/HelloTraceInterfaceDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP2_H__
+#define __HELLOTRACEINTERFACEDUP2_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDup2Traces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup2()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP2, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup2() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP2, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDup2L(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP2, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP2,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup2()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP2, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP2, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup2()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP2, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/incDup/HelloTraceTypesDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP_H__
+#define __HELLOTRACETYPESDUP_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDupTraces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/incDup/HelloTraceTypesDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP2_H__
+#define __HELLOTRACETYPESDUP2_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDup2Traces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup2()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup2()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup2()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP2, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP2, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/src/HelloTraceExample.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceExample.h"
+#include "HelloTraceTypes.h"
+#include "HelloTraceInterface.h"
+#include "HelloTraceFn.h"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceExampleTraces.h"
+#endif
+
+EXPORT_C void HelloTraceExample::JustTypes()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_JUSTTYPES, "*********************************************** " );
+    
+    HelloTraceTypes::SignedIntegers();
+    HelloTraceTypes::UnsignedIntegers();
+    HelloTraceTypes::Descriptors();    
+    }
+
+EXPORT_C void HelloTraceExample::Interface()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_INTERFACE, "*********************************************** " );
+    
+    TVersion version = CHelloTraceInterface::Version();   
+    if (version.iMajor >= 1) 
+        {
+        CHelloTraceInterface* example = CHelloTraceInterface::NewLC();
+        example->AddCharL('H');
+        example->AddCharL('e');
+        example->AddCharL('l');
+        example->AddCharL('l');
+        example->AddCharL('o');
+        example->AddCharL('T');        
+        example->RemoveLast();        
+        example->AddCharL(' ');
+        example->AddCharL('T');
+        example->AddCharL('r');
+        example->AddCharL('a');
+        example->AddCharL('c');
+        example->AddCharL('e');
+        example->AddCharL('!');
+        CleanupStack::PopAndDestroy(example);
+        }
+    else
+        {
+        OstTrace0( TRACE_ERROR, HELLOTRACEEXAMPLE_UNSUPPORTED_VERSION, "Unsupported version!");
+        }
+    }
+
+EXPORT_C void HelloTraceExample::FnEntryExit()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_FNENTRYEXIT, "*********************************************** " );
+       
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    CIdle* idle = CIdle::NewL(CActive::EPriorityIdle);
+    CleanupStack::PushL(idle);
+
+    CHelloTraceFn::StaticOutputsParamsL(1);
+   
+    example->Simple();
+    example->OutputsParams(2, CHelloTraceFn::EExample1);
+    example->OutputsParams(3, CHelloTraceFn::EExample2);
+    example->OutputsSignedIntegers(-4, -5, -6, -7);
+    example->OutputsUnsignedIntegers(8, 9, 10, 11);
+    example->OutputsTIntReturnValue();    
+    example->OutputsTInt64ReturnValue(); 
+    example->OutputsTFnEnumReturnValue();
+    example->OutputsUnknownPtrType(idle);    
+    example->OutputsUnknownRefType(*idle);
+#ifdef _DEBUG
+    example->PreProcessedFn(12);
+#else
+    example->PreProcessedFn();
+#endif
+    example->OutputMissingParams(13, 14, 15);
+
+    CleanupStack::PopAndDestroy(idle);
+    CleanupStack::PopAndDestroy(example);
+    }
+
+EXPORT_C void HelloTraceExample::PanicTrace()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_PANIC, "*********************************************** " );
+
+    Panic(EHelloTraceDllExamplePanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/src/HelloTraceFn.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+ 
+#include "HelloTraceFn.h"
+#include "HelloTraceFnDup.h"
+#include "HelloTraceFnDup2.inl"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnTraces.h"
+#endif
+
+CHelloTraceFn* CHelloTraceFn::NewLC()
+    {
+    CHelloTraceFn* self = new (ELeave) CHelloTraceFn;
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+CHelloTraceFn* CHelloTraceFn::NewL()
+    {
+    CHelloTraceFn* self = CHelloTraceFn::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceFn::CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_CTOR, "[0x%08x] Constructor", this );    
+    }
+
+CHelloTraceFn::~CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_DTOR, "[0x%08x] Destructor", this );    
+    }
+
+void CHelloTraceFn::Simple()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsParams(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_EXIT, this );
+    }
+
+void CHelloTraceFn::StaticOutputsParamsL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->Simple();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_EXIT );    
+    }
+
+void CHelloTraceFn::OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_EXIT, this );
+    }
+
+
+TInt CHelloTraceFn::OutputsTIntReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+TInt64 CHelloTraceFn::OutputsTInt64ReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_EXIT, this, ret );
+    return ret;    
+    }
+
+CActive* CHelloTraceFn::OutputsUnknownPtrType(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+CActive& CHelloTraceFn::OutputsUnknownRefType(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+void CHelloTraceFn::OutputMissingParams(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+void CHelloTraceFn::PreProcessedFn()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    Simple();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/src/HelloTraceInterface.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceInterface.h"
+#include "HelloTraceInterfaceDup.h"
+#include "HelloTraceInterfaceDup2.inl"
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceTraces.h"
+#endif
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewLC()
+    {
+    CHelloTraceInterface* self = new (ELeave) CHelloTraceInterface;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewL()
+    {
+    CHelloTraceInterface* self = CHelloTraceInterface::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceInterface::CHelloTraceInterface()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_CTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+void CHelloTraceInterface::ConstructL()
+    {
+    iString = new (ELeave) THelloTraceDllExampleString;
+    }
+
+EXPORT_C CHelloTraceInterface::~CHelloTraceInterface()
+    {
+    delete iString;
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_DTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+EXPORT_C TVersion CHelloTraceInterface::Version()
+    {
+    const TInt KMajor = 1;
+    const TInt KMinor = 0;
+    const TInt KBuild = 1;
+    TVersion version = TVersion(KMajor, KMinor, KBuild);
+    OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION, "CHelloTraceInterface::Version = %S", version.Name());   
+    return version;
+    }
+
+EXPORT_C const TPtrC CHelloTraceInterface::String() const
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING, 
+                     "[0x%08x] Returned %S", (TUint32) this, *iString);   
+    return *iString;
+    }
+
+EXPORT_C void CHelloTraceInterface::AddCharL(const TChar& aChar)
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL, 
+                  "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+    if (iString->Length() >= KHelloTraceDllBufferLength)
+        {
+        OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR,
+                   "[0x%08x] Not enough space to add character", (TUint32) this);
+        User::Leave( KErrTooBig);
+        }
+    iString->Append(aChar);
+    }
+
+EXPORT_C void CHelloTraceInterface::RemoveLast()
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST, 
+                  "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+    if (iString->Length() > 0)
+        {
+        iString->SetLength(iString->Length() - 1);
+        }
+    else
+        {
+        OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN, "[0x%08x] String already empty", (TUint32) this);   
+        }
+    }
+
+EXPORT_C void CHelloTraceInterface::ResetString()
+    {
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+    if (iString == NULL)
+        {
+        iString = new (ELeave) THelloTraceDllExampleString;
+        }
+    else
+        {
+        iString->SetLength(0);
+        }
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/src/HelloTracePanic.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32std.h>		 // GLDEF_C
+
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTracePanicTraces.h"
+#endif
+
+GLDEF_C void Panic(THelloTraceDllPanic aPanic)
+    {
+    OstTrace1( TRACE_FATAL, PANIC, "Panic(%{THelloTraceDllPanic})", (TUint) aPanic );    
+    User::Panic(_L("HelloTraceDll"), aPanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/src/HelloTraceTypes.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include <e32std.h>
+
+#include "HelloTraceTypes.h"
+#include "HelloTraceTypesDup.h"
+#include "HelloTraceTypesDup2.inl"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesTraces.h"
+#endif
+
+void HelloTraceTypes::SignedIntegers()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+void HelloTraceTypes::UnsignedIntegers()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+void HelloTraceTypes::Descriptors()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE, "16 bit descriptor: %S", KUnicode() );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/dll/traces/hellotracedll_dll/trace.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<trace_properties>
+<enum name="TFnEnum">
+<value id="0">EExample1</value>
+<value id="2">EExample2</value>
+</enum>
+<enum name="THelloTraceDllPanic">
+<value id="0">EHelloTraceDllExamplePanic</value>
+<value id="1">EHelloTraceDllNullPointer</value>
+</enum>
+<file>../../incDup/HelloTraceInterfaceDup.h</file>
+<file>../../incDup/HelloTraceInterfaceDup2.inl</file>
+<file>../../incDup/HelloTraceFnDup.h</file>
+<file>../../incDup/HelloTraceFnDup2.inl</file>
+<file>../../incDup/HelloTraceTypesDup.h</file>
+<file>../../incDup/HelloTraceTypesDup2.inl</file>
+</trace_properties>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_diffnames_tracesplus/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,19 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+#include "../dll/group/bld.inf"
+#include "../console/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/console/group/HelloTraceConsole.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceConsole.exe
+TARGETTYPE	  exe
+UID			  0 0xE40349E4
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE	   ../inc
+USERINCLUDE    ../../dll/inc
+USERINCLUDE    ../traces
+
+SOURCEPATH	  ../src
+SOURCE		  HelloTraceConsole.cpp
+
+LIBRARY		  euser.lib
+LIBRARY       HelloTraceDll.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/console/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotraceconsole.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotraceconsole.iby)
+
+PRJ_MMPFILES
+HelloTraceConsole.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/console/group/hellotraceconsole.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACECONSOLE_IBY
+#define HELLOTRACECONSOLE_IBY
+
+#include <core\os\hellotracedll.iby>
+
+file=ABI_DIR\BUILD_DIR\hellotraceconsole.exe    Sys\Bin\hellotraceconsole.exe
+
+#endif //HELLOTRACECONSOLE_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/console/inc/HelloTraceConsole.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACECONSOLE_H__
+#define __HELLOTRACECONSOLE_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+
+#endif  // __HELLOTRACECONSOLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/console/src/HelloTraceConsole.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32cons.h>			// Console
+
+#include "HelloTraceConsole.h"
+#include "HelloTraceExample.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceConsoleTraces.h"
+#endif
+
+
+_LIT(KTextConsoleTitle, "HelloTrace");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+LOCAL_C void DoExamples()
+    {
+    TInt err = KErrNone;
+
+    console->Printf(_L("Before main tracing examples ...\n"));
+
+    console->Printf(_L(" Before type examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::JustTypes());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+
+    console->Printf(_L(" Before Interface examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::Interface());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+    
+    console->Printf(_L(" Before FnEntryExit examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::FnEntryExit());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);    
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    DoExamples();
+    
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    OstTraceFunctionEntry0( E32MAIN_ENTRY );
+    
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, 
+          console = Console::NewL(KTextConsoleTitle, 
+                                  TSize(KConsFullScreen, KConsFullScreen)));    
+    if (createError)
+        {
+        delete cleanup;
+        OstTrace1( TRACE_ERROR, E32MAIN_CREATE_ERROR, "Failed to create console error: %d", createError);
+        OstTraceFunctionExit0( E32MAIN_EXIT_ERR );
+        return createError;
+        }
+
+    TRAPD(mainError, DoStartL());    
+    if (mainError)
+        {
+        OstTrace1( TRACE_ERROR, E32MAIN_START_ERROR, "DoStartL failed with error: %d", mainError);
+        console->Printf(_L("DoStartL failed with error: %d\n\n"), mainError);
+        }
+    else 
+        {
+        console->Printf(_L("Before panic tracing example ..."));
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+    
+        OstTrace0( TRACE_FLOW, E32MAIN_BEFORE_PANIC, "About to cause a panic ..." );
+        HelloTraceExample::PanicTrace();
+        
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+        }
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    
+    OstTraceFunctionExit0( E32MAIN_EXIT );
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/bwins/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,14 @@
+EXPORTS
+	?Version@CHelloTraceInterface@@SA?AVTVersion@@XZ @ 1 NONAME ; class TVersion CHelloTraceInterface::Version(void)
+	?NewLC@CHelloTraceInterface@@SAPAV1@XZ @ 2 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewLC(void)
+	?JustTypes@HelloTraceExample@@SAXXZ @ 3 NONAME ; void HelloTraceExample::JustTypes(void)
+	?Interface@HelloTraceExample@@SAXXZ @ 4 NONAME ; void HelloTraceExample::Interface(void)
+	?FnEntryExit@HelloTraceExample@@SAXXZ @ 5 NONAME ; void HelloTraceExample::FnEntryExit(void)
+	?ResetString@CHelloTraceInterface@@QAEXXZ @ 6 NONAME ; void CHelloTraceInterface::ResetString(void)
+	?AddCharL@CHelloTraceInterface@@QAEXABVTChar@@@Z @ 7 NONAME ; void CHelloTraceInterface::AddCharL(class TChar const &)
+	?PanicTrace@HelloTraceExample@@SAXXZ @ 8 NONAME ; void HelloTraceExample::PanicTrace(void)
+	??1CHelloTraceInterface@@UAE@XZ @ 9 NONAME ; CHelloTraceInterface::~CHelloTraceInterface(void)
+	?String@CHelloTraceInterface@@QBE?BVTPtrC16@@XZ @ 10 NONAME ; class TPtrC16 const CHelloTraceInterface::String(void) const
+	?RemoveLast@CHelloTraceInterface@@QAEXXZ @ 11 NONAME ; void CHelloTraceInterface::RemoveLast(void)
+	?NewL@CHelloTraceInterface@@SAPAV1@XZ @ 12 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewL(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/eabi/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,20 @@
+EXPORTS
+	_ZN17HelloTraceExample10PanicTraceEv @ 1 NONAME
+	_ZN17HelloTraceExample11FnEntryExitEv @ 2 NONAME
+	_ZN17HelloTraceExample9InterfaceEv @ 3 NONAME
+	_ZN17HelloTraceExample9JustTypesEv @ 4 NONAME
+	_ZN20CHelloTraceInterface10RemoveLastEv @ 5 NONAME
+	_ZN20CHelloTraceInterface11ResetStringEv @ 6 NONAME
+	_ZN20CHelloTraceInterface4NewLEv @ 7 NONAME
+	_ZN20CHelloTraceInterface5NewLCEv @ 8 NONAME
+	_ZN20CHelloTraceInterface7VersionEv @ 9 NONAME
+	_ZN20CHelloTraceInterface8AddCharLERK5TChar @ 10 NONAME
+	_ZN20CHelloTraceInterfaceD0Ev @ 11 NONAME
+	_ZN20CHelloTraceInterfaceD1Ev @ 12 NONAME
+	_ZN20CHelloTraceInterfaceD2Ev @ 13 NONAME
+	_ZNK20CHelloTraceInterface6StringEv @ 14 NONAME
+	_ZTI13CHelloTraceFn @ 15 NONAME
+	_ZTI20CHelloTraceInterface @ 16 NONAME
+	_ZTV13CHelloTraceFn @ 17 NONAME
+	_ZTV20CHelloTraceInterface @ 18 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/group/HelloTraceDll.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceDll.dll
+TARGETTYPE	  dll
+UID			  0x1000008d 0xE43DF43E
+CAPABILITY    ReadUserData
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE  ../inc ../incDup
+USERINCLUDE  ../traces
+
+SOURCEPATH	 ../src
+SOURCE       HelloTraceExample.cpp 
+SOURCE       HelloTraceTypes.cpp
+SOURCE       HelloTraceInterface.cpp 
+SOURCE       HelloTraceFn.cpp 
+SOURCE       HelloTracePanic.cpp 
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotracedll.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotracedll.iby)
+
+PRJ_MMPFILES
+HelloTraceDll.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/group/hellotracedll.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,22 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACEDLL_IBY
+#define HELLOTRACEDLL_IBY
+
+file=ABI_DIR\BUILD_DIR\hellotracedll.dll        Sys\Bin\hellotracedll.dll
+
+#endif //HELLOTRACEDLL_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/inc/HelloTraceExample.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEEXAMPLE_H__
+#define __HELLOTRACEEXAMPLE_H__
+
+#include <e32std.h>
+
+class HelloTraceExample
+    {
+public:
+    IMPORT_C static void JustTypes();    
+    IMPORT_C static void Interface();    
+    IMPORT_C static void FnEntryExit();    
+    IMPORT_C static void PanicTrace();    
+
+    // @TODO add examples for state macros
+    // @TODO add examples for event macros
+    // @TODO add examples for OstTraceData
+    // @TODO add compile-time selector examples
+    // @TODO add macro wrapper examples
+    };
+
+#endif  // __HELLOTRACEEXAMPLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/inc/HelloTraceInterface.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE_H__
+#define __HELLOTRACEINTERFACE_H__
+
+#include <e32base.h>	// CBase
+#include <e32std.h>	 // TBuf
+
+const TInt KHelloTraceDllBufferLength = 10;
+typedef TBuf<KHelloTraceDllBufferLength> THelloTraceDllExampleString;
+
+class CHelloTraceInterface : public CBase
+    {
+public:
+    IMPORT_C static CHelloTraceInterface* NewL();
+    IMPORT_C static CHelloTraceInterface* NewLC();
+    IMPORT_C ~CHelloTraceInterface();
+
+public:
+    IMPORT_C static TVersion Version();
+    IMPORT_C const TPtrC String() const;
+    IMPORT_C void AddCharL(const TChar& aChar);
+    IMPORT_C void RemoveLast();
+    IMPORT_C void ResetString();
+    
+    IMPORT_C static TVersion VersionDup();
+    IMPORT_C const TPtrC StringDup() const;
+    IMPORT_C void AddCharDupL(const TChar& aChar);
+    IMPORT_C void RemoveLastDup();
+    IMPORT_C void ResetStringDup();
+
+    IMPORT_C static TVersion VersionDup2();
+    IMPORT_C const TPtrC StringDup2() const;
+    IMPORT_C void AddCharDup2L(const TChar& aChar);
+    IMPORT_C void RemoveLastDup2();
+    IMPORT_C void ResetStringDup2();
+private:
+    CHelloTraceInterface();
+    void ConstructL();
+
+private:
+    // data
+    THelloTraceDllExampleString* iString;
+    };
+
+#endif  // __HELLOTRACEINTERFACE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/inc/HelloTracePanic.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEDLL_PAN__
+#define __HELLOTRACEDLL_PAN__
+
+//  Data Types
+
+enum THelloTraceDllPanic
+    {
+    EHelloTraceDllExamplePanic,
+    EHelloTraceDllNullPointer,
+    };
+
+//  Function Prototypes
+
+GLREF_C void Panic(THelloTraceDllPanic aPanic);
+
+#endif  // __HELLOTRACEDLL_PAN__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/inc/HelloTraceTypes.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES_H__
+#define __HELLOTRACETYPES_H__
+
+class HelloTraceTypes
+    {
+public:
+    static void SignedIntegers();
+    static void UnsignedIntegers();
+    static void Descriptors();
+    
+    static void SignedIntegersDup();
+    static void UnsignedIntegersDup();
+    static void DescriptorsDup();
+        
+    static void SignedIntegersDup2();
+    static void UnsignedIntegersDup2();
+    static void DescriptorsDup2();
+    };
+
+#endif  // __HELLOTRACETYPES_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/incDup/HelloTraceFnDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP_H_
+#define HELLOTRACEFNDUP_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDupTraces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDupL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/incDup/HelloTraceFnDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP2_H_
+#define HELLOTRACEFNDUP2_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDup2Traces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDup2L(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup2();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup2(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup2(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup2(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup2(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup2()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup2();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP2_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/incDup/HelloTraceInterfaceDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP_H__
+#define __HELLOTRACEINTERFACEDUP_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDupTraces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDupL(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/incDup/HelloTraceInterfaceDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP2_H__
+#define __HELLOTRACEINTERFACEDUP2_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDup2Traces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup2()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP2, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup2() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP2, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDup2L(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP2, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP2,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup2()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP2, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP2, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup2()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP2, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/incDup/HelloTraceTypesDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP_H__
+#define __HELLOTRACETYPESDUP_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDupTraces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/incDup/HelloTraceTypesDup2.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP2_H__
+#define __HELLOTRACETYPESDUP2_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDup2Traces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup2()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup2()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup2()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP2, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP2, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP2_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/src/HelloTraceExample.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceExample.h"
+#include "HelloTraceTypes.h"
+#include "HelloTraceInterface.h"
+#include "HelloTraceFn.h"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceExampleTraces.h"
+#endif
+
+EXPORT_C void HelloTraceExample::JustTypes()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_JUSTTYPES, "*********************************************** " );
+    
+    HelloTraceTypes::SignedIntegers();
+    HelloTraceTypes::UnsignedIntegers();
+    HelloTraceTypes::Descriptors();    
+    }
+
+EXPORT_C void HelloTraceExample::Interface()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_INTERFACE, "*********************************************** " );
+    
+    TVersion version = CHelloTraceInterface::Version();   
+    if (version.iMajor >= 1) 
+        {
+        CHelloTraceInterface* example = CHelloTraceInterface::NewLC();
+        example->AddCharL('H');
+        example->AddCharL('e');
+        example->AddCharL('l');
+        example->AddCharL('l');
+        example->AddCharL('o');
+        example->AddCharL('T');        
+        example->RemoveLast();        
+        example->AddCharL(' ');
+        example->AddCharL('T');
+        example->AddCharL('r');
+        example->AddCharL('a');
+        example->AddCharL('c');
+        example->AddCharL('e');
+        example->AddCharL('!');
+        CleanupStack::PopAndDestroy(example);
+        }
+    else
+        {
+        OstTrace0( TRACE_ERROR, HELLOTRACEEXAMPLE_UNSUPPORTED_VERSION, "Unsupported version!");
+        }
+    }
+
+EXPORT_C void HelloTraceExample::FnEntryExit()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_FNENTRYEXIT, "*********************************************** " );
+       
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    CIdle* idle = CIdle::NewL(CActive::EPriorityIdle);
+    CleanupStack::PushL(idle);
+
+    CHelloTraceFn::StaticOutputsParamsL(1);
+   
+    example->Simple();
+    example->OutputsParams(2, CHelloTraceFn::EExample1);
+    example->OutputsParams(3, CHelloTraceFn::EExample2);
+    example->OutputsSignedIntegers(-4, -5, -6, -7);
+    example->OutputsUnsignedIntegers(8, 9, 10, 11);
+    example->OutputsTIntReturnValue();    
+    example->OutputsTInt64ReturnValue(); 
+    example->OutputsTFnEnumReturnValue();
+    example->OutputsUnknownPtrType(idle);    
+    example->OutputsUnknownRefType(*idle);
+#ifdef _DEBUG
+    example->PreProcessedFn(12);
+#else
+    example->PreProcessedFn();
+#endif
+    example->OutputMissingParams(13, 14, 15);
+
+    CleanupStack::PopAndDestroy(idle);
+    CleanupStack::PopAndDestroy(example);
+    }
+
+EXPORT_C void HelloTraceExample::PanicTrace()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_PANIC, "*********************************************** " );
+
+    Panic(EHelloTraceDllExamplePanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/src/HelloTraceFn.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+ 
+#include <HelloTraceFn.h>
+#include "HelloTraceFnDup.h"
+#include "HelloTraceFnDup2.inl"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnTraces.h"
+#endif
+
+CHelloTraceFn* CHelloTraceFn::NewLC()
+    {
+    CHelloTraceFn* self = new (ELeave) CHelloTraceFn;
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+CHelloTraceFn* CHelloTraceFn::NewL()
+    {
+    CHelloTraceFn* self = CHelloTraceFn::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceFn::CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_CTOR, "[0x%08x] Constructor", this );    
+    }
+
+CHelloTraceFn::~CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_DTOR, "[0x%08x] Destructor", this );    
+    }
+
+void CHelloTraceFn::Simple()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsParams(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_EXIT, this );
+    }
+
+void CHelloTraceFn::StaticOutputsParamsL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->Simple();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_EXIT );    
+    }
+
+void CHelloTraceFn::OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_EXIT, this );
+    }
+
+
+TInt CHelloTraceFn::OutputsTIntReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+TInt64 CHelloTraceFn::OutputsTInt64ReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_EXIT, this, ret );
+    return ret;    
+    }
+
+CActive* CHelloTraceFn::OutputsUnknownPtrType(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+CActive& CHelloTraceFn::OutputsUnknownRefType(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+void CHelloTraceFn::OutputMissingParams(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+void CHelloTraceFn::PreProcessedFn()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    Simple();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/src/HelloTraceInterface.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,120 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include "HelloTraceInterface.h"
+#include "HelloTraceInterfaceDup.h"
+#include "HelloTraceInterfaceDup2.inl"
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceTraces.h"
+#endif
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewLC()
+    {
+    CHelloTraceInterface* self = new (ELeave) CHelloTraceInterface;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewL()
+    {
+    CHelloTraceInterface* self = CHelloTraceInterface::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceInterface::CHelloTraceInterface()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_CTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+void CHelloTraceInterface::ConstructL()
+    {
+    iString = new (ELeave) THelloTraceDllExampleString;
+    }
+
+EXPORT_C CHelloTraceInterface::~CHelloTraceInterface()
+    {
+    delete iString;
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_DTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+EXPORT_C TVersion CHelloTraceInterface::Version()
+    {
+    const TInt KMajor = 1;
+    const TInt KMinor = 0;
+    const TInt KBuild = 1;
+    TVersion version = TVersion(KMajor, KMinor, KBuild);
+    OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION, "CHelloTraceInterface::Version = %S", version.Name());   
+    return version;
+    }
+
+EXPORT_C const TPtrC CHelloTraceInterface::String() const
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING, 
+                     "[0x%08x] Returned %S", (TUint32) this, *iString);   
+    return *iString;
+    }
+
+EXPORT_C void CHelloTraceInterface::AddCharL(const TChar& aChar)
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL, 
+                  "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+    if (iString->Length() >= KHelloTraceDllBufferLength)
+        {
+        OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR,
+                   "[0x%08x] Not enough space to add character", (TUint32) this);
+        User::Leave( KErrTooBig);
+        }
+    iString->Append(aChar);
+    }
+
+EXPORT_C void CHelloTraceInterface::RemoveLast()
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST, 
+                  "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+    if (iString->Length() > 0)
+        {
+        iString->SetLength(iString->Length() - 1);
+        }
+    else
+        {
+        OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN, "[0x%08x] String already empty", (TUint32) this);   
+        }
+    }
+
+EXPORT_C void CHelloTraceInterface::ResetString()
+    {
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+    if (iString == NULL)
+        {
+        iString = new (ELeave) THelloTraceDllExampleString;
+        }
+    else
+        {
+        iString->SetLength(0);
+        }
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/src/HelloTracePanic.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32std.h>		 // GLDEF_C
+
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTracePanicTraces.h"
+#endif
+
+GLDEF_C void Panic(THelloTraceDllPanic aPanic)
+    {
+    OstTrace1( TRACE_FATAL, PANIC, "Panic(%{THelloTraceDllPanic})", (TUint) aPanic );    
+    User::Panic(_L("HelloTraceDll"), aPanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/src/HelloTraceTypes.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include <e32std.h>
+
+#include "HelloTraceTypes.h"
+#include "HelloTraceTypesDup.h"
+#include "HelloTraceTypesDup2.inl"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesTraces.h"
+#endif
+
+void HelloTraceTypes::SignedIntegers()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+void HelloTraceTypes::UnsignedIntegers()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+void HelloTraceTypes::Descriptors()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE, "16 bit descriptor: %S", KUnicode() );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/dll/traces/trace.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<trace_properties>
+<enum name="TFnEnum">
+<value id="0">EExample1</value>
+<value id="2">EExample2</value>
+</enum>
+<enum name="THelloTraceDllPanic">
+<value id="0">EHelloTraceDllExamplePanic</value>
+<value id="1">EHelloTraceDllNullPointer</value>
+</enum>
+<file>../incDup/HelloTraceInterfaceDup.h</file>
+<file>../incDup/HelloTraceInterfaceDup2.inl</file>
+<file>../incDup/HelloTraceFnDup2.inl</file>
+<file>../incDup/HelloTraceTypesDup.h</file>
+<file>../incDup/HelloTraceTypesDup2.inl</file>
+</trace_properties>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_import/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,19 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+#include "../dll/group/bld.inf"
+#include "../console/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/console/group/HelloTraceConsole.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceConsole.exe
+TARGETTYPE	  exe
+UID			  0 0xE40349E4
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE	   ../inc
+USERINCLUDE    ../../dll/inc
+USERINCLUDE    ../traces
+
+SOURCEPATH	  ../src
+SOURCE		  HelloTraceConsole.cpp
+
+LIBRARY		  euser.lib
+LIBRARY       HelloTraceDll.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/console/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotraceconsole.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotraceconsole.iby)
+
+PRJ_MMPFILES
+HelloTraceConsole.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/console/group/hellotraceconsole.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACECONSOLE_IBY
+#define HELLOTRACECONSOLE_IBY
+
+#include <core\os\hellotracedll.iby>
+
+file=ABI_DIR\BUILD_DIR\hellotraceconsole.exe    Sys\Bin\hellotraceconsole.exe
+
+#endif //HELLOTRACECONSOLE_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/console/inc/HelloTraceConsole.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACECONSOLE_H__
+#define __HELLOTRACECONSOLE_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+
+#endif  // __HELLOTRACECONSOLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/console/src/HelloTraceConsole.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32cons.h>			// Console
+
+#include "HelloTraceConsole.h"
+#include "HelloTraceExample.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceConsoleTraces.h"
+#endif
+
+
+_LIT(KTextConsoleTitle, "HelloTrace");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+LOCAL_C void DoExamples()
+    {
+    TInt err = KErrNone;
+
+    console->Printf(_L("Before main tracing examples ...\n"));
+
+    console->Printf(_L(" Before type examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::JustTypes());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+
+    console->Printf(_L(" Before Interface examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::Interface());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+    
+    console->Printf(_L(" Before FnEntryExit examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::FnEntryExit());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);    
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    DoExamples();
+    
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    OstTraceFunctionEntry0( E32MAIN_ENTRY );
+    
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, 
+          console = Console::NewL(KTextConsoleTitle, 
+                                  TSize(KConsFullScreen, KConsFullScreen)));    
+    if (createError)
+        {
+        delete cleanup;
+        OstTrace1( TRACE_ERROR, E32MAIN_CREATE_ERROR, "Failed to create console error: %d", createError);
+        OstTraceFunctionExit0( E32MAIN_EXIT_ERR );
+        return createError;
+        }
+
+    TRAPD(mainError, DoStartL());    
+    if (mainError)
+        {
+        OstTrace1( TRACE_ERROR, E32MAIN_START_ERROR, "DoStartL failed with error: %d", mainError);
+        console->Printf(_L("DoStartL failed with error: %d\n\n"), mainError);
+        }
+    else 
+        {
+        console->Printf(_L("Before panic tracing example ..."));
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+    
+        OstTrace0( TRACE_FLOW, E32MAIN_BEFORE_PANIC, "About to cause a panic ..." );
+        HelloTraceExample::PanicTrace();
+        
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+        }
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    
+    OstTraceFunctionExit0( E32MAIN_EXIT );
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/bwins/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,14 @@
+EXPORTS
+	?Version@CHelloTraceInterface@@SA?AVTVersion@@XZ @ 1 NONAME ; class TVersion CHelloTraceInterface::Version(void)
+	?NewLC@CHelloTraceInterface@@SAPAV1@XZ @ 2 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewLC(void)
+	?JustTypes@HelloTraceExample@@SAXXZ @ 3 NONAME ; void HelloTraceExample::JustTypes(void)
+	?Interface@HelloTraceExample@@SAXXZ @ 4 NONAME ; void HelloTraceExample::Interface(void)
+	?FnEntryExit@HelloTraceExample@@SAXXZ @ 5 NONAME ; void HelloTraceExample::FnEntryExit(void)
+	?ResetString@CHelloTraceInterface@@QAEXXZ @ 6 NONAME ; void CHelloTraceInterface::ResetString(void)
+	?AddCharL@CHelloTraceInterface@@QAEXABVTChar@@@Z @ 7 NONAME ; void CHelloTraceInterface::AddCharL(class TChar const &)
+	?PanicTrace@HelloTraceExample@@SAXXZ @ 8 NONAME ; void HelloTraceExample::PanicTrace(void)
+	??1CHelloTraceInterface@@UAE@XZ @ 9 NONAME ; CHelloTraceInterface::~CHelloTraceInterface(void)
+	?String@CHelloTraceInterface@@QBE?BVTPtrC16@@XZ @ 10 NONAME ; class TPtrC16 const CHelloTraceInterface::String(void) const
+	?RemoveLast@CHelloTraceInterface@@QAEXXZ @ 11 NONAME ; void CHelloTraceInterface::RemoveLast(void)
+	?NewL@CHelloTraceInterface@@SAPAV1@XZ @ 12 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewL(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/eabi/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,20 @@
+EXPORTS
+	_ZN17HelloTraceExample10PanicTraceEv @ 1 NONAME
+	_ZN17HelloTraceExample11FnEntryExitEv @ 2 NONAME
+	_ZN17HelloTraceExample9InterfaceEv @ 3 NONAME
+	_ZN17HelloTraceExample9JustTypesEv @ 4 NONAME
+	_ZN20CHelloTraceInterface10RemoveLastEv @ 5 NONAME
+	_ZN20CHelloTraceInterface11ResetStringEv @ 6 NONAME
+	_ZN20CHelloTraceInterface4NewLEv @ 7 NONAME
+	_ZN20CHelloTraceInterface5NewLCEv @ 8 NONAME
+	_ZN20CHelloTraceInterface7VersionEv @ 9 NONAME
+	_ZN20CHelloTraceInterface8AddCharLERK5TChar @ 10 NONAME
+	_ZN20CHelloTraceInterfaceD0Ev @ 11 NONAME
+	_ZN20CHelloTraceInterfaceD1Ev @ 12 NONAME
+	_ZN20CHelloTraceInterfaceD2Ev @ 13 NONAME
+	_ZNK20CHelloTraceInterface6StringEv @ 14 NONAME
+	_ZTI13CHelloTraceFn @ 15 NONAME
+	_ZTI20CHelloTraceInterface @ 16 NONAME
+	_ZTV13CHelloTraceFn @ 17 NONAME
+	_ZTV20CHelloTraceInterface @ 18 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/group/HelloTraceDll.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceDll.dll
+TARGETTYPE	  dll
+UID			  0x1000008d 0xE43DF43E
+CAPABILITY    ReadUserData
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE  ../inc ../incDup
+USERINCLUDE  ../traces
+
+SOURCEPATH	 ../src
+SOURCE       HelloTraceExample.cpp 
+SOURCE       HelloTraceTypes.cpp
+SOURCE       HelloTraceInterface.cpp 
+SOURCE       HelloTraceFn.cpp 
+SOURCE       HelloTracePanic.cpp 
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotracedll.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotracedll.iby)
+
+PRJ_MMPFILES
+HelloTraceDll.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/group/hellotracedll.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,22 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACEDLL_IBY
+#define HELLOTRACEDLL_IBY
+
+file=ABI_DIR\BUILD_DIR\hellotracedll.dll        Sys\Bin\hellotracedll.dll
+
+#endif //HELLOTRACEDLL_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/inc/HelloTraceExample.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEEXAMPLE_H__
+#define __HELLOTRACEEXAMPLE_H__
+
+#include <e32std.h>
+
+class HelloTraceExample
+    {
+public:
+    IMPORT_C static void JustTypes();    
+    IMPORT_C static void Interface();    
+    IMPORT_C static void FnEntryExit();    
+    IMPORT_C static void PanicTrace();    
+
+    // @TODO add examples for state macros
+    // @TODO add examples for event macros
+    // @TODO add examples for OstTraceData
+    // @TODO add compile-time selector examples
+    // @TODO add macro wrapper examples
+    };
+
+#endif  // __HELLOTRACEEXAMPLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/inc/HelloTraceFn.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFN_H_
+#define HELLOTRACEFN_H_
+
+#include <e32base.h>    // CBase
+
+class CHelloTraceFn : public CBase
+    {
+public:
+    
+    // Note the Trace Builder will only parse this if it's in a cpp file
+    // but not from here :(
+    // Also if you add a new enum you need to reparse the enum - it doesn't
+    // get automatically reparsed by the Trace Compiler :(
+    enum TFnEnum
+        {
+        EExample1,
+        EExample2 = 2, 
+        // EExample3 = EExample2 + 1, // The Trace Builder can't parse this :(
+        };
+    
+public:
+    static CHelloTraceFn* NewL();
+    static CHelloTraceFn* NewLC();
+    ~CHelloTraceFn();
+   
+public: // Fn entry / exit tracing examples 
+    void Simple();
+    void OutputsParams(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValue();
+    TInt64 OutputsTInt64ReturnValue();
+    TFnEnum OutputsTFnEnumReturnValue();
+
+    CActive* OutputsUnknownPtrType(CActive* aActive);
+    CActive& OutputsUnknownRefType(CActive& aActive);
+    
+    void OutputMissingParams(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFn(TInt aDbgParam);
+#else
+    void PreProcessedFn();
+#endif
+    
+    static void StaticOutputsParamsL(TInt aParam);  
+    
+    // duplicate all the function and put the impl in the header file HelloTraceFnDup.h
+    void SimpleDup();
+    void OutputsParamsDup(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup();
+    TInt64 OutputsTInt64ReturnValueDup();
+    TFnEnum OutputsTFnEnumReturnValueDup();
+
+    CActive* OutputsUnknownPtrTypeDup(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup(CActive& aActive);
+    
+    void OutputMissingParamsDup(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup(TInt aDbgParam);
+#else
+    void PreProcessedFnDup();
+#endif
+    static void StaticOutputsParamsDupL(TInt aParam);  
+    
+    // duplicate all the function again and put the impl in the header file HelloTraceFnDup2.h
+    void SimpleDup2();
+    void OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup2();
+    TInt64 OutputsTInt64ReturnValueDup2();
+    TFnEnum OutputsTFnEnumReturnValueDup2();
+
+    CActive* OutputsUnknownPtrTypeDup2(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup2(CActive& aActive);
+    
+    void OutputMissingParamsDup2(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup2(TInt aDbgParam);
+#else
+    void PreProcessedFnDup2();
+#endif
+    static void StaticOutputsParamsDup2L(TInt aParam);  
+
+
+private:
+    CHelloTraceFn();
+    };
+
+#endif /* HELLOTRACEFN_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/inc/HelloTraceInterface.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE_H__
+#define __HELLOTRACEINTERFACE_H__
+
+#include <e32base.h>	// CBase
+#include <e32std.h>	 // TBuf
+
+const TInt KHelloTraceDllBufferLength = 10;
+typedef TBuf<KHelloTraceDllBufferLength> THelloTraceDllExampleString;
+
+class CHelloTraceInterface : public CBase
+    {
+public:
+    IMPORT_C static CHelloTraceInterface* NewL();
+    IMPORT_C static CHelloTraceInterface* NewLC();
+    IMPORT_C ~CHelloTraceInterface();
+
+public:
+    IMPORT_C static TVersion Version();
+    IMPORT_C const TPtrC String() const;
+    IMPORT_C void AddCharL(const TChar& aChar);
+    IMPORT_C void RemoveLast();
+    IMPORT_C void ResetString();
+    
+    IMPORT_C static TVersion VersionDup();
+    IMPORT_C const TPtrC StringDup() const;
+    IMPORT_C void AddCharDupL(const TChar& aChar);
+    IMPORT_C void RemoveLastDup();
+    IMPORT_C void ResetStringDup();
+
+    IMPORT_C static TVersion VersionDup2();
+    IMPORT_C const TPtrC StringDup2() const;
+    IMPORT_C void AddCharDup2L(const TChar& aChar);
+    IMPORT_C void RemoveLastDup2();
+    IMPORT_C void ResetStringDup2();
+private:
+    CHelloTraceInterface();
+    void ConstructL();
+
+private:
+    // data
+    THelloTraceDllExampleString* iString;
+    };
+
+#endif  // __HELLOTRACEINTERFACE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/inc/HelloTracePanic.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEDLL_PAN__
+#define __HELLOTRACEDLL_PAN__
+
+//  Data Types
+
+enum THelloTraceDllPanic
+    {
+    EHelloTraceDllExamplePanic,
+    EHelloTraceDllNullPointer,
+    };
+
+//  Function Prototypes
+
+GLREF_C void Panic(THelloTraceDllPanic aPanic);
+
+#endif  // __HELLOTRACEDLL_PAN__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/inc/HelloTraceTypes.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES_H__
+#define __HELLOTRACETYPES_H__
+
+class HelloTraceTypes
+    {
+public:
+    static void SignedIntegers();
+    static void UnsignedIntegers();
+    static void Descriptors();
+    
+    static void SignedIntegersDup();
+    static void UnsignedIntegersDup();
+    static void DescriptorsDup();
+        
+    static void SignedIntegersDup2();
+    static void UnsignedIntegersDup2();
+    static void DescriptorsDup2();
+    };
+
+#endif  // __HELLOTRACETYPES_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/incDup/HelloTraceFn.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNINL_H_
+#define HELLOTRACEFNINL_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnTraces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDup2L(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup2();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup2(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup2(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup2(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup2(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup2()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup2();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNINL_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/incDup/HelloTraceFnDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP_H_
+#define HELLOTRACEFNDUP_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDupTraces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDupL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/incDup/HelloTraceInterface.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEINL_H__
+#define __HELLOTRACEINTERFACEINL_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceTraces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup2()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP2, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup2() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP2, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDup2L(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP2, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP2,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup2()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP2, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP2, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup2()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP2, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEINL_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/incDup/HelloTraceInterfaceDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP_H__
+#define __HELLOTRACEINTERFACEDUP_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDupTraces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDupL(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/incDup/HelloTraceTypes.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESINL_H__
+#define __HELLOTRACETYPESINL_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesTraces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup2()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup2()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup2()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP2, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP2, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESINL_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/incDup/HelloTraceTypesDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP_H__
+#define __HELLOTRACETYPESDUP_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDupTraces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/src/HelloTraceExample.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceExample.h"
+#include "HelloTraceTypes.h"
+#include "HelloTraceInterface.h"
+#include "HelloTraceFn.h"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceExampleTraces.h"
+#endif
+
+EXPORT_C void HelloTraceExample::JustTypes()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_JUSTTYPES, "*********************************************** " );
+    
+    HelloTraceTypes::SignedIntegers();
+    HelloTraceTypes::UnsignedIntegers();
+    HelloTraceTypes::Descriptors();    
+    }
+
+EXPORT_C void HelloTraceExample::Interface()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_INTERFACE, "*********************************************** " );
+    
+    TVersion version = CHelloTraceInterface::Version();   
+    if (version.iMajor >= 1) 
+        {
+        CHelloTraceInterface* example = CHelloTraceInterface::NewLC();
+        example->AddCharL('H');
+        example->AddCharL('e');
+        example->AddCharL('l');
+        example->AddCharL('l');
+        example->AddCharL('o');
+        example->AddCharL('T');        
+        example->RemoveLast();        
+        example->AddCharL(' ');
+        example->AddCharL('T');
+        example->AddCharL('r');
+        example->AddCharL('a');
+        example->AddCharL('c');
+        example->AddCharL('e');
+        example->AddCharL('!');
+        CleanupStack::PopAndDestroy(example);
+        }
+    else
+        {
+        OstTrace0( TRACE_ERROR, HELLOTRACEEXAMPLE_UNSUPPORTED_VERSION, "Unsupported version!");
+        }
+    }
+
+EXPORT_C void HelloTraceExample::FnEntryExit()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_FNENTRYEXIT, "*********************************************** " );
+       
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    CIdle* idle = CIdle::NewL(CActive::EPriorityIdle);
+    CleanupStack::PushL(idle);
+
+    CHelloTraceFn::StaticOutputsParamsL(1);
+   
+    example->Simple();
+    example->OutputsParams(2, CHelloTraceFn::EExample1);
+    example->OutputsParams(3, CHelloTraceFn::EExample2);
+    example->OutputsSignedIntegers(-4, -5, -6, -7);
+    example->OutputsUnsignedIntegers(8, 9, 10, 11);
+    example->OutputsTIntReturnValue();    
+    example->OutputsTInt64ReturnValue(); 
+    example->OutputsTFnEnumReturnValue();
+    example->OutputsUnknownPtrType(idle);    
+    example->OutputsUnknownRefType(*idle);
+#ifdef _DEBUG
+    example->PreProcessedFn(12);
+#else
+    example->PreProcessedFn();
+#endif
+    example->OutputMissingParams(13, 14, 15);
+
+    CleanupStack::PopAndDestroy(idle);
+    CleanupStack::PopAndDestroy(example);
+    }
+
+EXPORT_C void HelloTraceExample::PanicTrace()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_PANIC, "*********************************************** " );
+
+    Panic(EHelloTraceDllExamplePanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/src/HelloTraceFn.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+ 
+#include "HelloTraceFn.h"
+#include "HelloTraceFnDup.h"
+#include "HelloTraceFn.inl"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnTraces.h"
+#endif
+
+CHelloTraceFn* CHelloTraceFn::NewLC()
+    {
+    CHelloTraceFn* self = new (ELeave) CHelloTraceFn;
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+CHelloTraceFn* CHelloTraceFn::NewL()
+    {
+    CHelloTraceFn* self = CHelloTraceFn::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceFn::CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_CTOR, "[0x%08x] Constructor", this );    
+    }
+
+CHelloTraceFn::~CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_DTOR, "[0x%08x] Destructor", this );    
+    }
+
+void CHelloTraceFn::Simple()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsParams(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_EXIT, this );
+    }
+
+void CHelloTraceFn::StaticOutputsParamsL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->Simple();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_EXIT );    
+    }
+
+void CHelloTraceFn::OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_EXIT, this );
+    }
+
+
+TInt CHelloTraceFn::OutputsTIntReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+TInt64 CHelloTraceFn::OutputsTInt64ReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_EXIT, this, ret );
+    return ret;    
+    }
+
+CActive* CHelloTraceFn::OutputsUnknownPtrType(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+CActive& CHelloTraceFn::OutputsUnknownRefType(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+void CHelloTraceFn::OutputMissingParams(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+void CHelloTraceFn::PreProcessedFn()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    Simple();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/src/HelloTraceInterface.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceInterface.h"
+#include "HelloTraceInterfaceDup.h"
+#include "HelloTraceInterface.inl"
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceTraces.h"
+#endif
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewLC()
+    {
+    CHelloTraceInterface* self = new (ELeave) CHelloTraceInterface;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewL()
+    {
+    CHelloTraceInterface* self = CHelloTraceInterface::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceInterface::CHelloTraceInterface()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_CTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+void CHelloTraceInterface::ConstructL()
+    {
+    iString = new (ELeave) THelloTraceDllExampleString;
+    }
+
+EXPORT_C CHelloTraceInterface::~CHelloTraceInterface()
+    {
+    delete iString;
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_DTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+EXPORT_C TVersion CHelloTraceInterface::Version()
+    {
+    const TInt KMajor = 1;
+    const TInt KMinor = 0;
+    const TInt KBuild = 1;
+    TVersion version = TVersion(KMajor, KMinor, KBuild);
+    OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION, "CHelloTraceInterface::Version = %S", version.Name());   
+    return version;
+    }
+
+EXPORT_C const TPtrC CHelloTraceInterface::String() const
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING, 
+                     "[0x%08x] Returned %S", (TUint32) this, *iString);   
+    return *iString;
+    }
+
+EXPORT_C void CHelloTraceInterface::AddCharL(const TChar& aChar)
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL, 
+                  "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+    if (iString->Length() >= KHelloTraceDllBufferLength)
+        {
+        OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR,
+                   "[0x%08x] Not enough space to add character", (TUint32) this);
+        User::Leave( KErrTooBig);
+        }
+    iString->Append(aChar);
+    }
+
+EXPORT_C void CHelloTraceInterface::RemoveLast()
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST, 
+                  "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+    if (iString->Length() > 0)
+        {
+        iString->SetLength(iString->Length() - 1);
+        }
+    else
+        {
+        OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN, "[0x%08x] String already empty", (TUint32) this);   
+        }
+    }
+
+EXPORT_C void CHelloTraceInterface::ResetString()
+    {
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+    if (iString == NULL)
+        {
+        iString = new (ELeave) THelloTraceDllExampleString;
+        }
+    else
+        {
+        iString->SetLength(0);
+        }
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/src/HelloTracePanic.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32std.h>		 // GLDEF_C
+
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTracePanicTraces.h"
+#endif
+
+GLDEF_C void Panic(THelloTraceDllPanic aPanic)
+    {
+    OstTrace1( TRACE_FATAL, PANIC, "Panic(%{THelloTraceDllPanic})", (TUint) aPanic );    
+    User::Panic(_L("HelloTraceDll"), aPanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/src/HelloTraceTypes.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include <e32std.h>
+
+#include "HelloTraceTypes.h"
+#include "HelloTraceTypesDup.h"
+#include "HelloTraceTypes.inl"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesTraces.h"
+#endif
+
+void HelloTraceTypes::SignedIntegers()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+void HelloTraceTypes::UnsignedIntegers()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+void HelloTraceTypes::Descriptors()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE, "16 bit descriptor: %S", KUnicode() );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/dll/traces/trace.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<trace_properties>
+<enum name="TFnEnum">
+<value id="0">EExample1</value>
+<value id="2">EExample2</value>
+</enum>
+<enum name="THelloTraceDllPanic">
+<value id="0">EHelloTraceDllExamplePanic</value>
+<value id="1">EHelloTraceDllNullPointer</value>
+</enum>
+<file>../incDup/HelloTraceInterfaceDup.h</file>
+<file>../incDup/HelloTraceInterface.inl</file>
+<file>../incDup/HelloTraceFnDup.h</file>
+<file>../incDup/HelloTraceFn.inl</file>
+<file>../incDup/HelloTraceTypesDup.h</file>
+<file>../incDup/HelloTraceTypes.inl</file>
+</trace_properties>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,19 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+#include "../dll/group/bld.inf"
+#include "../console/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/console/group/HelloTraceConsole.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceConsole.exe
+TARGETTYPE	  exe
+UID			  0 0xE40349E4
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE	   ../inc
+USERINCLUDE    ../../dll/inc
+USERINCLUDE    ../traces
+
+SOURCEPATH	  ../src
+SOURCE		  HelloTraceConsole.cpp
+
+LIBRARY		  euser.lib
+LIBRARY       HelloTraceDll.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/console/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotraceconsole.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotraceconsole.iby)
+
+PRJ_MMPFILES
+HelloTraceConsole.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/console/group/hellotraceconsole.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACECONSOLE_IBY
+#define HELLOTRACECONSOLE_IBY
+
+#include <core\os\hellotracedll.iby>
+
+file=ABI_DIR\BUILD_DIR\hellotraceconsole.exe    Sys\Bin\hellotraceconsole.exe
+
+#endif //HELLOTRACECONSOLE_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/console/inc/HelloTraceConsole.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACECONSOLE_H__
+#define __HELLOTRACECONSOLE_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+
+#endif  // __HELLOTRACECONSOLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/console/src/HelloTraceConsole.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32cons.h>			// Console
+
+#include "HelloTraceConsole.h"
+#include "HelloTraceExample.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceConsoleTraces.h"
+#endif
+
+
+_LIT(KTextConsoleTitle, "HelloTrace");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+LOCAL_C void DoExamples()
+    {
+    TInt err = KErrNone;
+
+    console->Printf(_L("Before main tracing examples ...\n"));
+
+    console->Printf(_L(" Before type examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::JustTypes());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+
+    console->Printf(_L(" Before Interface examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::Interface());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);
+    
+    console->Printf(_L(" Before FnEntryExit examples ..."));
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+    TRAP(err, HelloTraceExample::FnEntryExit());    
+    if (err)
+        console->Printf(_L(" Failed with error %d\n"), err);    
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    DoExamples();
+    
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    OstTraceFunctionEntry0( E32MAIN_ENTRY );
+    
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, 
+          console = Console::NewL(KTextConsoleTitle, 
+                                  TSize(KConsFullScreen, KConsFullScreen)));    
+    if (createError)
+        {
+        delete cleanup;
+        OstTrace1( TRACE_ERROR, E32MAIN_CREATE_ERROR, "Failed to create console error: %d", createError);
+        OstTraceFunctionExit0( E32MAIN_EXIT_ERR );
+        return createError;
+        }
+
+    TRAPD(mainError, DoStartL());    
+    if (mainError)
+        {
+        OstTrace1( TRACE_ERROR, E32MAIN_START_ERROR, "DoStartL failed with error: %d", mainError);
+        console->Printf(_L("DoStartL failed with error: %d\n\n"), mainError);
+        }
+    else 
+        {
+        console->Printf(_L("Before panic tracing example ..."));
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+    
+        OstTrace0( TRACE_FLOW, E32MAIN_BEFORE_PANIC, "About to cause a panic ..." );
+        HelloTraceExample::PanicTrace();
+        
+        console->Printf(KTextPressAnyKey);
+        console->Getch();
+        }
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    
+    OstTraceFunctionExit0( E32MAIN_EXIT );
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/bwins/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,14 @@
+EXPORTS
+	?Version@CHelloTraceInterface@@SA?AVTVersion@@XZ @ 1 NONAME ; class TVersion CHelloTraceInterface::Version(void)
+	?NewLC@CHelloTraceInterface@@SAPAV1@XZ @ 2 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewLC(void)
+	?JustTypes@HelloTraceExample@@SAXXZ @ 3 NONAME ; void HelloTraceExample::JustTypes(void)
+	?Interface@HelloTraceExample@@SAXXZ @ 4 NONAME ; void HelloTraceExample::Interface(void)
+	?FnEntryExit@HelloTraceExample@@SAXXZ @ 5 NONAME ; void HelloTraceExample::FnEntryExit(void)
+	?ResetString@CHelloTraceInterface@@QAEXXZ @ 6 NONAME ; void CHelloTraceInterface::ResetString(void)
+	?AddCharL@CHelloTraceInterface@@QAEXABVTChar@@@Z @ 7 NONAME ; void CHelloTraceInterface::AddCharL(class TChar const &)
+	?PanicTrace@HelloTraceExample@@SAXXZ @ 8 NONAME ; void HelloTraceExample::PanicTrace(void)
+	??1CHelloTraceInterface@@UAE@XZ @ 9 NONAME ; CHelloTraceInterface::~CHelloTraceInterface(void)
+	?String@CHelloTraceInterface@@QBE?BVTPtrC16@@XZ @ 10 NONAME ; class TPtrC16 const CHelloTraceInterface::String(void) const
+	?RemoveLast@CHelloTraceInterface@@QAEXXZ @ 11 NONAME ; void CHelloTraceInterface::RemoveLast(void)
+	?NewL@CHelloTraceInterface@@SAPAV1@XZ @ 12 NONAME ; class CHelloTraceInterface * CHelloTraceInterface::NewL(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/eabi/HelloTraceDllu.def	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,20 @@
+EXPORTS
+	_ZN17HelloTraceExample10PanicTraceEv @ 1 NONAME
+	_ZN17HelloTraceExample11FnEntryExitEv @ 2 NONAME
+	_ZN17HelloTraceExample9InterfaceEv @ 3 NONAME
+	_ZN17HelloTraceExample9JustTypesEv @ 4 NONAME
+	_ZN20CHelloTraceInterface10RemoveLastEv @ 5 NONAME
+	_ZN20CHelloTraceInterface11ResetStringEv @ 6 NONAME
+	_ZN20CHelloTraceInterface4NewLEv @ 7 NONAME
+	_ZN20CHelloTraceInterface5NewLCEv @ 8 NONAME
+	_ZN20CHelloTraceInterface7VersionEv @ 9 NONAME
+	_ZN20CHelloTraceInterface8AddCharLERK5TChar @ 10 NONAME
+	_ZN20CHelloTraceInterfaceD0Ev @ 11 NONAME
+	_ZN20CHelloTraceInterfaceD1Ev @ 12 NONAME
+	_ZN20CHelloTraceInterfaceD2Ev @ 13 NONAME
+	_ZNK20CHelloTraceInterface6StringEv @ 14 NONAME
+	_ZTI13CHelloTraceFn @ 15 NONAME
+	_ZTI20CHelloTraceInterface @ 16 NONAME
+	_ZTV13CHelloTraceFn @ 17 NONAME
+	_ZTV20CHelloTraceInterface @ 18 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/group/HelloTraceDll.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  HelloTraceDll.dll
+TARGETTYPE	  dll
+UID			  0x1000008d 0xE43DF43E
+CAPABILITY    ReadUserData
+
+OS_LAYER_SYSTEMINCLUDE
+USERINCLUDE  ../inc ../incDup
+USERINCLUDE  ../traces/HelloTraceDll_dll
+
+SOURCEPATH	 ../src
+SOURCE       HelloTraceExample.cpp 
+SOURCE       HelloTraceTypes.cpp
+SOURCE       HelloTraceInterface.cpp 
+SOURCE       HelloTraceFn.cpp 
+SOURCE       HelloTracePanic.cpp 
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+hellotracedll.iby             CORE_OS_LAYER_IBY_EXPORT_PATH(hellotracedll.iby)
+
+PRJ_MMPFILES
+HelloTraceDll.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/group/hellotracedll.iby	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,22 @@
+// 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:
+// ROM build file for tracecore project
+
+#ifndef HELLOTRACEDLL_IBY
+#define HELLOTRACEDLL_IBY
+
+file=ABI_DIR\BUILD_DIR\hellotracedll.dll        Sys\Bin\hellotracedll.dll
+
+#endif //HELLOTRACEDLL_IBY
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/inc/HelloTraceExample.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEEXAMPLE_H__
+#define __HELLOTRACEEXAMPLE_H__
+
+#include <e32std.h>
+
+class HelloTraceExample
+    {
+public:
+    IMPORT_C static void JustTypes();    
+    IMPORT_C static void Interface();    
+    IMPORT_C static void FnEntryExit();    
+    IMPORT_C static void PanicTrace();    
+
+    // @TODO add examples for state macros
+    // @TODO add examples for event macros
+    // @TODO add examples for OstTraceData
+    // @TODO add compile-time selector examples
+    // @TODO add macro wrapper examples
+    };
+
+#endif  // __HELLOTRACEEXAMPLE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/inc/HelloTraceFn.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFN_H_
+#define HELLOTRACEFN_H_
+
+#include <e32base.h>    // CBase
+
+class CHelloTraceFn : public CBase
+    {
+public:
+    
+    // Note the Trace Builder will only parse this if it's in a cpp file
+    // but not from here :(
+    // Also if you add a new enum you need to reparse the enum - it doesn't
+    // get automatically reparsed by the Trace Compiler :(
+    enum TFnEnum
+        {
+        EExample1,
+        EExample2 = 2, 
+        // EExample3 = EExample2 + 1, // The Trace Builder can't parse this :(
+        };
+    
+public:
+    static CHelloTraceFn* NewL();
+    static CHelloTraceFn* NewLC();
+    ~CHelloTraceFn();
+   
+public: // Fn entry / exit tracing examples 
+    void Simple();
+    void OutputsParams(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValue();
+    TInt64 OutputsTInt64ReturnValue();
+    TFnEnum OutputsTFnEnumReturnValue();
+
+    CActive* OutputsUnknownPtrType(CActive* aActive);
+    CActive& OutputsUnknownRefType(CActive& aActive);
+    
+    void OutputMissingParams(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFn(TInt aDbgParam);
+#else
+    void PreProcessedFn();
+#endif
+    
+    static void StaticOutputsParamsL(TInt aParam);  
+    
+    // duplicate all the function and put the impl in the header file HelloTraceFnDup.h
+    void SimpleDup();
+    void OutputsParamsDup(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup();
+    TInt64 OutputsTInt64ReturnValueDup();
+    TFnEnum OutputsTFnEnumReturnValueDup();
+
+    CActive* OutputsUnknownPtrTypeDup(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup(CActive& aActive);
+    
+    void OutputMissingParamsDup(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup(TInt aDbgParam);
+#else
+    void PreProcessedFnDup();
+#endif
+    static void StaticOutputsParamsDupL(TInt aParam);  
+    
+    // duplicate all the function again and put the impl in the header file HelloTraceFnDup2.h
+    void SimpleDup2();
+    void OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam);
+    void OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                               TInt32 aParam32, TInt64 aParam64);
+    void OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                 TUint32 aParam32, TUint64 aParam64);
+     
+    TInt OutputsTIntReturnValueDup2();
+    TInt64 OutputsTInt64ReturnValueDup2();
+    TFnEnum OutputsTFnEnumReturnValueDup2();
+
+    CActive* OutputsUnknownPtrTypeDup2(CActive* aActive);
+    CActive& OutputsUnknownRefTypeDup2(CActive& aActive);
+    
+    void OutputMissingParamsDup2(TInt aUsedParam, TInt aCommentParam, TInt aMissingParam);
+
+#ifdef _DEBUG    
+    void PreProcessedFnDup2(TInt aDbgParam);
+#else
+    void PreProcessedFnDup2();
+#endif
+    static void StaticOutputsParamsDup2L(TInt aParam);  
+
+
+private:
+    CHelloTraceFn();
+    };
+
+#endif /* HELLOTRACEFN_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/inc/HelloTraceInterface.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACE_H__
+#define __HELLOTRACEINTERFACE_H__
+
+#include <e32base.h>	// CBase
+#include <e32std.h>	 // TBuf
+
+const TInt KHelloTraceDllBufferLength = 10;
+typedef TBuf<KHelloTraceDllBufferLength> THelloTraceDllExampleString;
+
+class CHelloTraceInterface : public CBase
+    {
+public:
+    IMPORT_C static CHelloTraceInterface* NewL();
+    IMPORT_C static CHelloTraceInterface* NewLC();
+    IMPORT_C ~CHelloTraceInterface();
+
+public:
+    IMPORT_C static TVersion Version();
+    IMPORT_C const TPtrC String() const;
+    IMPORT_C void AddCharL(const TChar& aChar);
+    IMPORT_C void RemoveLast();
+    IMPORT_C void ResetString();
+    
+    IMPORT_C static TVersion VersionDup();
+    IMPORT_C const TPtrC StringDup() const;
+    IMPORT_C void AddCharDupL(const TChar& aChar);
+    IMPORT_C void RemoveLastDup();
+    IMPORT_C void ResetStringDup();
+
+    IMPORT_C static TVersion VersionDup2();
+    IMPORT_C const TPtrC StringDup2() const;
+    IMPORT_C void AddCharDup2L(const TChar& aChar);
+    IMPORT_C void RemoveLastDup2();
+    IMPORT_C void ResetStringDup2();
+private:
+    CHelloTraceInterface();
+    void ConstructL();
+
+private:
+    // data
+    THelloTraceDllExampleString* iString;
+    };
+
+#endif  // __HELLOTRACEINTERFACE_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/inc/HelloTracePanic.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEDLL_PAN__
+#define __HELLOTRACEDLL_PAN__
+
+//  Data Types
+
+enum THelloTraceDllPanic
+    {
+    EHelloTraceDllExamplePanic,
+    EHelloTraceDllNullPointer,
+    };
+
+//  Function Prototypes
+
+GLREF_C void Panic(THelloTraceDllPanic aPanic);
+
+#endif  // __HELLOTRACEDLL_PAN__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/inc/HelloTraceTypes.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPES_H__
+#define __HELLOTRACETYPES_H__
+
+class HelloTraceTypes
+    {
+public:
+    static void SignedIntegers();
+    static void UnsignedIntegers();
+    static void Descriptors();
+    
+    static void SignedIntegersDup();
+    static void UnsignedIntegersDup();
+    static void DescriptorsDup();
+        
+    static void SignedIntegersDup2();
+    static void UnsignedIntegersDup2();
+    static void DescriptorsDup2();
+    };
+
+#endif  // __HELLOTRACETYPES_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/incDup/HelloTraceFn.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNINL_H_
+#define HELLOTRACEFNINL_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnTraces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup2(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDup2L(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup2();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP2_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup2(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsUnsignedIntegersDup2(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP2_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup2()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP2_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup2(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP2_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup2(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP2_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup2(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP2_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup2(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup2()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup2();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP2_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNINL_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/incDup/HelloTraceFnDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2010 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 HELLOTRACEFNDUP_H_
+#define HELLOTRACEFNDUP_H_
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnDupTraces.h"
+#endif
+
+inline void CHelloTraceFn::SimpleDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::OutputsParamsDup(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_DUP_EXIT, this );
+    }
+
+inline void CHelloTraceFn::StaticOutputsParamsDupL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->SimpleDup();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_DUP_EXIT );    
+    }
+
+inline void CHelloTraceFn::OutputsSignedIntegersDup(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegersDup(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_DUP_EXIT, this );
+    }
+
+
+inline TInt CHelloTraceFn::OutputsTIntReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline TInt64 CHelloTraceFn::OutputsTInt64ReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_DUP_EXIT, this, ret );
+    return ret;
+    }
+
+inline CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValueDup()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_DUP_EXIT, this, ret );
+    return ret;    
+    }
+
+inline CActive* CHelloTraceFn::OutputsUnknownPtrTypeDup(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_DUP_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+inline CActive& CHelloTraceFn::OutputsUnknownRefTypeDup(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_DUP_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+inline void CHelloTraceFn::OutputMissingParamsDup(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_DUP_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+inline void CHelloTraceFn::PreProcessedFnDup(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+    inline void CHelloTraceFn::PreProcessedFnDup()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    SimpleDup();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_DUP_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
+#endif /* HELLOTRACEFNDUP_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/incDup/HelloTraceInterface.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEINL_H__
+#define __HELLOTRACEINTERFACEINL_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceTraces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup2()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP2, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup2() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP2, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDup2L(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP2, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP2,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup2()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP2, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP2, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup2()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP2, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEINL_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/incDup/HelloTraceInterfaceDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACEINTERFACEDUP_H__
+#define __HELLOTRACEINTERFACEDUP_H__
+
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceDupTraces.h"
+#endif
+
+ inline EXPORT_C TVersion CHelloTraceInterface::VersionDup()
+        {
+        const TInt KMajor = 1;
+        const TInt KMinor = 0;
+        const TInt KBuild = 1;
+        TVersion version = TVersion(KMajor, KMinor, KBuild);
+        OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION_DUP, "CHelloTraceInterface::Version = %S", version.Name());   
+        return version;
+        }
+
+ inline EXPORT_C const TPtrC CHelloTraceInterface::StringDup() const
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING_DUP, 
+                         "[0x%08x] Returned %S", (TUint32) this, *iString);   
+        return *iString;
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::AddCharDupL(const TChar& aChar)
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL_DUP, 
+                      "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+        if (iString->Length() >= KHelloTraceDllBufferLength)
+            {
+            OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR_DUP,
+                       "[0x%08x] Not enough space to add character", (TUint32) this);
+            User::Leave( KErrTooBig);
+            }
+        iString->Append(aChar);
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::RemoveLastDup()
+        {
+        __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST_DUP, 
+                      "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+        if (iString->Length() > 0)
+            {
+            iString->SetLength(iString->Length() - 1);
+            }
+        else
+            {
+            OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN_DUP, "[0x%08x] String already empty", (TUint32) this);   
+            }
+        }
+
+ inline EXPORT_C void CHelloTraceInterface::ResetStringDup()
+        {
+        OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING_DUP, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+        if (iString == NULL)
+            {
+            iString = new (ELeave) THelloTraceDllExampleString;
+            }
+        else
+            {
+            iString->SetLength(0);
+            }
+        }
+#endif  // __HELLOTRACEINTERFACEDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/incDup/HelloTraceTypes.inl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESINL_H__
+#define __HELLOTRACETYPESINL_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesTraces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup2()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP2_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup2()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP2_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup2()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP2, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP2, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESINL_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/incDup/HelloTraceTypesDup.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2010 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 __HELLOTRACETYPESDUP_H__
+#define __HELLOTRACETYPESDUP_H__
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesDupTraces.h"
+#endif
+
+inline void HelloTraceTypes::SignedIntegersDup()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERSDUP_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::UnsignedIntegersDup()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERSDUP_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+inline void HelloTraceTypes::DescriptorsDup()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCIIDUP, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODEDUP, "16 bit descriptor: %S", KUnicode() );
+    }
+
+#endif  // __HELLOTRACETYPESDUP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/src/HelloTraceExample.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceExample.h"
+#include "HelloTraceTypes.h"
+#include "HelloTraceInterface.h"
+#include "HelloTraceFn.h"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceExampleTraces.h"
+#endif
+
+EXPORT_C void HelloTraceExample::JustTypes()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_JUSTTYPES, "*********************************************** " );
+    
+    HelloTraceTypes::SignedIntegers();
+    HelloTraceTypes::UnsignedIntegers();
+    HelloTraceTypes::Descriptors();    
+    }
+
+EXPORT_C void HelloTraceExample::Interface()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_INTERFACE, "*********************************************** " );
+    
+    TVersion version = CHelloTraceInterface::Version();   
+    if (version.iMajor >= 1) 
+        {
+        CHelloTraceInterface* example = CHelloTraceInterface::NewLC();
+        example->AddCharL('H');
+        example->AddCharL('e');
+        example->AddCharL('l');
+        example->AddCharL('l');
+        example->AddCharL('o');
+        example->AddCharL('T');        
+        example->RemoveLast();        
+        example->AddCharL(' ');
+        example->AddCharL('T');
+        example->AddCharL('r');
+        example->AddCharL('a');
+        example->AddCharL('c');
+        example->AddCharL('e');
+        example->AddCharL('!');
+        CleanupStack::PopAndDestroy(example);
+        }
+    else
+        {
+        OstTrace0( TRACE_ERROR, HELLOTRACEEXAMPLE_UNSUPPORTED_VERSION, "Unsupported version!");
+        }
+    }
+
+EXPORT_C void HelloTraceExample::FnEntryExit()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_FNENTRYEXIT, "*********************************************** " );
+       
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    CIdle* idle = CIdle::NewL(CActive::EPriorityIdle);
+    CleanupStack::PushL(idle);
+
+    CHelloTraceFn::StaticOutputsParamsL(1);
+   
+    example->Simple();
+    example->OutputsParams(2, CHelloTraceFn::EExample1);
+    example->OutputsParams(3, CHelloTraceFn::EExample2);
+    example->OutputsSignedIntegers(-4, -5, -6, -7);
+    example->OutputsUnsignedIntegers(8, 9, 10, 11);
+    example->OutputsTIntReturnValue();    
+    example->OutputsTInt64ReturnValue(); 
+    example->OutputsTFnEnumReturnValue();
+    example->OutputsUnknownPtrType(idle);    
+    example->OutputsUnknownRefType(*idle);
+#ifdef _DEBUG
+    example->PreProcessedFn(12);
+#else
+    example->PreProcessedFn();
+#endif
+    example->OutputMissingParams(13, 14, 15);
+
+    CleanupStack::PopAndDestroy(idle);
+    CleanupStack::PopAndDestroy(example);
+    }
+
+EXPORT_C void HelloTraceExample::PanicTrace()
+    {
+    OstTrace0( TRACE_EXAMPLE, HELLOTRACEEXAMPLE_PANIC, "*********************************************** " );
+
+    Panic(EHelloTraceDllExamplePanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/src/HelloTraceFn.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+ 
+#include "HelloTraceFn.h"
+#include "HelloTraceFnDup.h"
+#include "HelloTraceFn.inl"
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceFnTraces.h"
+#endif
+
+CHelloTraceFn* CHelloTraceFn::NewLC()
+    {
+    CHelloTraceFn* self = new (ELeave) CHelloTraceFn;
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+CHelloTraceFn* CHelloTraceFn::NewL()
+    {
+    CHelloTraceFn* self = CHelloTraceFn::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceFn::CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_CTOR, "[0x%08x] Constructor", this );    
+    }
+
+CHelloTraceFn::~CHelloTraceFn()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEFN_CHELLOTRACEFN_DTOR, "[0x%08x] Destructor", this );    
+    }
+
+void CHelloTraceFn::Simple()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_SIMPLE_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_SIMPLE_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsParams(TInt aParam, TFnEnum aEnumParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSPARAMS_ENTRY, this );
+    Simple();
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSPARAMS_EXIT, this );
+    }
+
+void CHelloTraceFn::StaticOutputsParamsL(TInt aParam)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_STATICOUTPUTSPARAMS_ENTRY, NULL );
+    CHelloTraceFn* example = CHelloTraceFn::NewLC();
+    example->Simple();    
+    CleanupStack::PopAndDestroy(example);
+    OstTraceFunctionExit0( CHELLOTRACEFN_STATICOUTPUTSPARAMS_EXIT );    
+    }
+
+void CHelloTraceFn::OutputsSignedIntegers(TInt8 aParam8,   TInt16 aParam16, 
+                                          TInt32 aParam32, TInt64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSSIGNEDINTEGERS_EXIT, this );
+    }
+
+void CHelloTraceFn::OutputsUnsignedIntegers(TUint8 aParam8,   TUint16 aParam16, 
+                                            TUint32 aParam32, TUint64 aParam64)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTSUNSIGNEDINTEGERS_EXIT, this );
+    }
+
+
+TInt CHelloTraceFn::OutputsTIntReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_ENTRY, this );
+    TInt ret = KErrNone;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINTRETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+TInt64 CHelloTraceFn::OutputsTInt64ReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_ENTRY, this );
+    TInt64 ret = (TInt64) 2 << 40;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTINT64RETURNVALUE_EXIT, this, ret );
+    return ret;
+    }
+
+CHelloTraceFn::TFnEnum CHelloTraceFn::OutputsTFnEnumReturnValue()
+    {
+    OstTraceFunctionEntry1( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_ENTRY, this );
+    TFnEnum ret = EExample1;
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSTFNENUMRETURNVALUE_EXIT, this, ret );
+    return ret;    
+    }
+
+CActive* CHelloTraceFn::OutputsUnknownPtrType(CActive* aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_ENTRY, this );    
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNPTRTYPE_EXIT, this, (TUint) aActive );
+    return aActive;
+    }
+
+CActive& CHelloTraceFn::OutputsUnknownRefType(CActive& aActive)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_ENTRY, this );
+    // ...
+    OstTraceFunctionExitExt( CHELLOTRACEFN_OUTPUTSUNKNOWNREFTYPE_EXIT, this, (TUint) &aActive );    
+    return aActive;
+    }
+
+// The following doesn't compile as the Trace Compiler doesn't generate
+// the correct OstTraceGenExt(...) function for it
+//void CHelloTraceFn::OutputMissingParamsBug(TInt /*aCommentParam*/, TInt)
+//    {
+//    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_ENTRY, this );
+//    // ...
+//    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMSBUG_EXIT, this );    
+//    }
+
+// The following compiles and works but outputs the following warning
+// warning: HelloTraceFn.cpp, line xxx: Parameter did not have a name and was not added to trace
+// The fact that this cannot be suppressed is a known problem we're working on.
+void CHelloTraceFn::OutputMissingParams(TInt aUsedParam, TInt /*aCommentParam*/, TInt)
+    {
+    OstTraceFunctionEntryExt( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_ENTRY, this );
+    // ...
+    OstTraceFunctionExit1( CHELLOTRACEFN_OUTPUTMISSINGPARAMS_EXIT, this );
+    }
+
+// The following doesn't work as the Trace Compiler outputs:
+// error: HelloTraceFn.cpp, line xxx: Class / function name for trace could not be determined x3
+//#ifdef _DEBUG
+//void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+//    {
+//    OstTraceFunctionEntryExt( PRE_PROCESSED_ENTRTY_1, this );
+//#else
+//void CHelloTraceFn::PreProcessedFn()
+//    {
+//    OstTraceFunctionEntry1( PRE_PROCESSED_ENTRTY_2, this );
+//#endif
+//    Simple();
+//    OstTraceFunctionExit1( CHELLOTRACEFN_PREPROCESSEDFN_EXIT, this );
+//    }
+
+// Workaround example code until a proper fix is provided
+#ifdef _DEBUG
+void CHelloTraceFn::PreProcessedFn(TInt aDbgParam)
+    {
+    OstTraceExt2( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_1, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;aDbgParam=%d;this=%x", (TInt) aDbgParam, (TUint) this);
+#else
+void CHelloTraceFn::PreProcessedFn()
+    {
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_ENTRY_2, "CHelloTraceFn::PreProcessedFn: > CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+#endif
+    Simple();
+    OstTrace1( TRACE_FLOW, CHELLOTRACEFN_PREPROCESSEDFN_EXIT, "CHelloTraceFn::PreProcessedFn: < CHelloTraceFn::PreProcessedFn;this=%x", (TUint) this);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/src/HelloTraceInterface.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "HelloTraceInterface.h"
+#include "HelloTraceInterfaceDup.h"
+#include "HelloTraceInterface.inl"
+#include "HelloTracePanic.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceInterfaceTraces.h"
+#endif
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewLC()
+    {
+    CHelloTraceInterface* self = new (ELeave) CHelloTraceInterface;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+EXPORT_C CHelloTraceInterface* CHelloTraceInterface::NewL()
+    {
+    CHelloTraceInterface* self = CHelloTraceInterface::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CHelloTraceInterface::CHelloTraceInterface()
+    {
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_CTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+void CHelloTraceInterface::ConstructL()
+    {
+    iString = new (ELeave) THelloTraceDllExampleString;
+    }
+
+EXPORT_C CHelloTraceInterface::~CHelloTraceInterface()
+    {
+    delete iString;
+    OstTrace1( TRACE_NORMAL, CHELLOTRACEDLL_CHELLOTRACEDLL_DTOR, "[0x%08x]", (TUint32) this );    
+    }
+
+EXPORT_C TVersion CHelloTraceInterface::Version()
+    {
+    const TInt KMajor = 1;
+    const TInt KMinor = 0;
+    const TInt KBuild = 1;
+    TVersion version = TVersion(KMajor, KMinor, KBuild);
+    OstTraceExt1( TRACE_BORDER, CHELLOTRACEDLL_VERSION, "CHelloTraceInterface::Version = %S", version.Name());   
+    return version;
+    }
+
+EXPORT_C const TPtrC CHelloTraceInterface::String() const
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CHELLOTRACEDLL_STRING, 
+                     "[0x%08x] Returned %S", (TUint32) this, *iString);   
+    return *iString;
+    }
+
+EXPORT_C void CHelloTraceInterface::AddCharL(const TChar& aChar)
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt3( TRACE_BORDER, CHELLOTRACEDLL_ADDCHARL, 
+                  "[0x%08x] Adding %d to %S", (TUint32) this, (TInt32) aChar, *iString);   
+    if (iString->Length() >= KHelloTraceDllBufferLength)
+        {
+        OstTrace1( TRACE_ERROR, CHELLOTRACEDLL_ADDCHARL_ERR,
+                   "[0x%08x] Not enough space to add character", (TUint32) this);
+        User::Leave( KErrTooBig);
+        }
+    iString->Append(aChar);
+    }
+
+EXPORT_C void CHelloTraceInterface::RemoveLast()
+    {
+    __ASSERT_ALWAYS(iString != NULL, Panic(EHelloTraceDllNullPointer));
+
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_REMOVELAST, 
+                  "[0x%08x] Attempting to remove last character from %S", (TUint32) this, *iString);
+    if (iString->Length() > 0)
+        {
+        iString->SetLength(iString->Length() - 1);
+        }
+    else
+        {
+        OstTrace1( TRACE_WARNING, CHELLOTRACEDLL_REMOVELAST_WARN, "[0x%08x] String already empty", (TUint32) this);   
+        }
+    }
+
+EXPORT_C void CHelloTraceInterface::ResetString()
+    {
+    OstTraceExt2( TRACE_BORDER, CHELLOTRACEDLL_RESETSTRING, "[0x%08x] Reseting string %S", (TUint32) this, *iString);
+    if (iString == NULL)
+        {
+        iString = new (ELeave) THelloTraceDllExampleString;
+        }
+    else
+        {
+        iString->SetLength(0);
+        }
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/src/HelloTracePanic.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include <e32std.h>		 // GLDEF_C
+
+#include "HelloTracePanic.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTracePanicTraces.h"
+#endif
+
+GLDEF_C void Panic(THelloTraceDllPanic aPanic)
+    {
+    OstTrace1( TRACE_FATAL, PANIC, "Panic(%{THelloTraceDllPanic})", (TUint) aPanic );    
+    User::Panic(_L("HelloTraceDll"), aPanic);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/src/HelloTraceTypes.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include <e32std.h>
+
+#include "HelloTraceTypes.h"
+#include "HelloTraceTypesDup.h"
+#include "HelloTraceTypes.inl"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "HelloTraceTypesTraces.h"
+#endif
+
+void HelloTraceTypes::SignedIntegers()
+    {
+    TInt8  eightBit     = - (TInt8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_8, 
+                  "8 bit signed: %hhd", eightBit );
+    
+    TInt16 sixteenBit   = - (TInt16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_16, 
+                  "16 bit signed: %hd", sixteenBit );
+
+    TInt32 thirtyTwoBit = - (TInt32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_32, 
+               "32 bit signed: %d", thirtyTwoBit );
+
+    TInt64 sixtyFourBit = - (TInt64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_SIGNEDINTEGERS_64, 
+                  "64 bit signed: %Ld", sixtyFourBit );
+    }
+
+void HelloTraceTypes::UnsignedIntegers()
+    {
+    TUint8  eightBit     = (TUint8)  1 << 6;
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_8, 
+                  "8 bit unsigned: %hhu", eightBit );
+    
+    TUint16 sixteenBit   = (TUint16) 1 << 14; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_16, 
+                  "16 bit unsigned: %hu", sixteenBit );
+
+    TUint32 thirtyTwoBit = (TUint32) 1 << 30; 
+    OstTrace1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_32, 
+               "32 bit unsigned: %u", thirtyTwoBit );
+
+    TUint64 sixtyFourBit = (TUint64) 1 << 62; 
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNSIGNEDINTEGERS_64, 
+                  "64 bit unsigned: %Lu", sixtyFourBit );
+    }
+
+void HelloTraceTypes::Descriptors()
+    {
+    _LIT8(KAscii, "Some ASCII text");
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_ASCII, "8 bit descriptor: %s", KAscii() );
+
+    _LIT16(KUnicode, "Some unicode text");    
+    OstTraceExt1( TRACE_INTERNALS, HELLOTRACETYPES_UNICODE, "16 bit descriptor: %S", KUnicode() );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/dll/traces/hellotracedll_dll/trace.properties	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<trace_properties>
+<enum name="TFnEnum">
+<value id="0">EExample1</value>
+<value id="2">EExample2</value>
+</enum>
+<enum name="THelloTraceDllPanic">
+<value id="0">EHelloTraceDllExamplePanic</value>
+<value id="1">EHelloTraceDllNullPointer</value>
+</enum>
+<file>../../incDup/HelloTraceInterfaceDup.h</file>
+<file>../../incDup/HelloTraceInterface.inl</file>
+<file>../../incDup/HelloTraceFnDup.h</file>
+<file>../../incDup/HelloTraceFn.inl</file>
+<file>../../incDup/HelloTraceTypesDup.h</file>
+<file>../../incDup/HelloTraceTypes.inl</file>
+</trace_properties>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/TracesInHeadersApps/singlemmp_samenames_tracesplus/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,19 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+#include "../dll/group/bld.inf"
+#include "../console/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,29 @@
+/*
+* 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: 
+*
+* TraceCompiler
+*/
+
+prj_platforms
+TOOLS2
+
+
+
+
+prj_testextensions
+start   extension   tools\ant_launch
+option  build_xml   build.xml
+end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/group/build.xml	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,235 @@
+<project name="OstTraceCompilerTest" default="build" basedir="..">
+
+<condition property="isLinux">
+    <os name="linux"/>
+</condition>
+
+<condition property="isWindows">
+	<not>
+		<os name="linux"/>
+	</not>
+</condition>
+
+<!-- EMMA configuration -->
+<path id="emma.lib" >
+	<pathelement location="${ant.home}/lib/emma.jar" />
+	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+</path>
+
+<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+
+<target name="init_windows_epocroot" if="isWindows">
+	<property environment="env" />
+	<echo message="Init Windows epocroot"/>
+	<property name="epoc.root" value="${env.EPOCROOT}"/>
+</target>
+
+<target name="init_linux_epocroot" if="isLinux">
+	<property environment="env" />
+	<echo message="Init Linux epocroot"/>
+	<property name="epoc.root" value="${env.EPOCROOT}//" />
+</target>
+
+<target name="init" depends="init_windows_epocroot, init_linux_epocroot">
+	<property name="src.dir" value="src" />
+	<property name="build.dir" value="build" />
+	<property name="jar.dir" value="jar" />
+	<property name="instr.dir" location="instr"/>
+	<property name="testdata.dir" location="${epoc.root}testdata"/>
+	<property name="reports.dir" value="${epoc.root}testdata/reports" />	
+	<property name="emma.dir" location="${epoc.root}testdata/reports/emma"/>
+	<property name="tools.dir" location="${epoc.root}epoc32/tools"/>
+</target>
+
+<target name="clean" depends="init">
+	<echo>Cleaning the ${build.dir}</echo>
+	<delete dir="${build.dir}"/>
+	<echo>Creating the ${build.dir} directory</echo>
+	<mkdir dir="${build.dir}"/>
+	<echo>Cleaning the ${reports.dir}</echo>
+	<delete dir="${reports.dir}"/>
+	<echo>Creating the ${reports.dir} directory</echo>
+	<mkdir dir="${reports.dir}"/>
+	<echo>Cleaning the ${instr.dir}</echo>
+	<delete dir="${instr.dir}"/>
+	<echo>Creating the ${instr.dir} directory</echo>
+	<mkdir dir="${instr.dir}"/>
+	<echo>Deleting test exports</echo>
+	<delete file="${epoc.root}epoc32/include/platform/test_opensystemtrace_types.h"/>
+	<delete file="${epoc.root}epoc32/build/buildlog_tc.txt"/>
+	<delete file="${epoc.root}epoc32/build/parsedlogs_tc.txt"/>
+	<delete file="${epoc.root}epoc32/build/buildlog_sbs.txt"/>
+	<delete file="${epoc.root}epoc32/build/parsedlogs_sbs.txt"/>
+	<delete file="${epoc.root}epoc32/build/buildlog_mult_cpp.txt"/>
+	<delete file="${epoc.root}epoc32/build/parsedlogs_mult_cpp.txt"/>
+	<delete file="${epoc.root}epoc32/build/buildlog_mult_mmp.txt"/>
+	<delete file="${epoc.root}epoc32/build/parsedlogs_mult_mmp.txt"/>	
+	<delete dir="${testdata.dir}/TraceErrorApp"/>
+	<delete dir="${testdata.dir}/MultipleCppTraceErrorApp"/>
+	<delete dir="${testdata.dir}/MultipleMmpTraceErrorApps"/>
+	<delete dir="${testdata.dir}/FixedIdDefinitionsTestApp"/>
+	<delete dir="${testdata.dir}/MultipleMmpTestCases"/>
+	<delete dir="${epoc.root}testdata/MultipleMmpTestCases"/>
+	<delete dir="${testdata.dir}TracesInHeadersApps"/>
+	<delete dir="${epoc.root}epoc32/build/testdata/MultipleMmpTestCases"/>
+	<delete dir="${epoc.root}epoc32/build/testdata/MultipleCppTraceErrorApp"/>
+	<delete dir="${epoc.root}epoc32/build/testdata/TracesInHeadersApps"/>
+</target>
+
+<target name="build" depends="clean">
+	<property name="classpath" value="${build.dir}:lib/junit-4.7.jar:../jar/tracecompiler.jar" />
+	<copy todir="${epoc.root}epoc32/include/platform">
+		<fileset dir="testdata"/>
+	</copy>
+	<copy todir="${epoc.root}testdata/TraceErrorApp">
+		<fileset dir="TraceErrorApp"/>
+	</copy>	
+	<copy todir="${epoc.root}testdata/MultipleCppTraceErrorApp">
+		<fileset dir="MultipleCppTraceErrorApp"/>
+	</copy>	
+	<copy todir="${epoc.root}testdata/MultipleMmpTraceErrorApps">
+		<fileset dir="MultipleMmpTraceErrorApps"/>
+	</copy>
+	<copy todir="${epoc.root}testdata/FixedIdDefinitionsTestApp">
+		<fileset dir="FixedIdDefinitionsTestApp"/>
+	</copy>			
+	<copy todir="${epoc.root}testdata/MultipleMmpTestCases">
+		<fileset dir="MultipleMmpTestCases"/>
+	</copy>
+    	<copy todir="${epoc.root}testdata/TracesInHeadersApps">
+		<fileset dir="TracesInHeadersApps"/>
+	</copy>
+	<javac  classpath="${classpath}" srcdir="${src.dir}" destdir="${build.dir}" debug="false" target="1.5" >
+	</javac>
+</target>
+
+<target name="run" depends="build" description="run the junit tests">
+
+	<echo>---- Note ANT 1.7 or greater is required for the junit task ----</echo>
+
+	<!-- generate classpath -->
+	<path id="lib.path.ref">
+		<pathelement location="build"/>
+   		<fileset dir="lib" includes="*.jar"/>
+   		<fileset dir="../jar" includes="*.jar"/>
+ 	</path>
+	
+	<junit printsummary="yes" haltonfailure="yes">		
+	 	<classpath path="${toString:lib.path.ref}"/>
+	 	<formatter type="plain"/>
+	
+		<!--complete test code should be in the $src.dir so run all of them except ErrorLogsTestBase.java-->
+		<!--that is the base class of ErrorLogsTestUnit.java and ErrorLogsTestSystem.java-->	 	 	
+	 	<batchtest fork="yes" todir="${reports.dir}">
+	 		<fileset dir="${src.dir}">
+	      		<include name="*.java"/>
+	      		<exclude name="ErrorLogsTestBase.java"/>
+	 		</fileset>
+	 	</batchtest>	
+	</junit>
+
+</target>
+
+<!-- Instrumentation target, depends on JAR -->
+<target name="instr" depends="build">
+	<!-- Instrument the source code -->
+	<emma>
+		<instr instrpath="${tools.dir}/tracecompiler" metadatafile="${emma.dir}/metadata.emma" merge="true" mode="overwrite"/>
+	</emma>
+</target>
+
+<!--target to execute pure unit tests and measure test coverage-->		 
+<target name="run_unit_emma" depends="instr" description="run the TraceCompiler unit tests and measure test coverage">
+	<echo>---- Note ANT 1.7 or greater is required for the junit task ----</echo>
+
+	<!-- generate classpath -->
+	<path id="lib.path.ref">
+		<!-- Instrumented class files -->
+		<pathelement location="${epoc.root}epoc32/tools/tracecompiler"/>
+		<pathelement location="build"/>
+		<fileset dir="${instr.dir}" includes="*.class"/>
+		<fileset dir="lib" includes="*.jar"/>
+
+		<!-- EMMA -->
+		<pathelement path="${ant.home}/lib/emma.jar"/>
+ 	</path>
+	
+	<echo>${toString:lib.path.ref}</echo> 
+	
+	<junit printsummary="yes" haltonfailure="yes">		
+	 	<classpath path="${toString:lib.path.ref}"/>
+	 	<formatter type="plain"/>
+		<formatter type="xml"/>
+
+		<!-- Instrumentation arguments to JVM -->
+		<jvmarg value="-Demma.coverage.out.file=${emma.dir}/coverage.emma" />
+		<jvmarg value="-Demma.coverage.out.merge=true" />
+
+		<!--complete test code should be in the $src.dir so run all of them except ErrorLogsTestSystem.java, MultipleMmpTest.java and-->
+		<!--ErrorLogsTestBase.java that is the base class of ErrorLogsTestUnit.java and ErrorLogsTestSystem.java-->		 	
+	 	<batchtest fork="yes" todir="${reports.dir}">
+	 		<fileset dir="${src.dir}">
+	      		<include name="*.java"/>
+	      		<exclude name="ErrorLogsTestSystem.java"/>
+	      		<exclude name="ErrorLogsTestBase.java"/>
+	      		<exclude name="MultipleMmpTest.java"/>
+	      		<exclude name="TracesInHeadersTest.java"/>	      		
+                <exclude name="TraceHeadersLicenceTest.java"/>
+	 		</fileset>
+		</batchtest>
+	</junit>
+		
+	<!-- Create EMMA report -->
+	<emma>
+		<report sourcepath="src/" >
+			<fileset dir="${emma.dir}" >
+				<include name="*.emma" />
+			</fileset>
+			<xml outfile="${emma.dir}/coverage.xml" />
+		</report>
+	</emma>
+</target>
+
+<!--target to execute pure unit tests-->		 
+<target name="run_unit" depends="build" description="run the TraceCompiler unit tests">
+
+	<echo>---- Note ANT 1.7 or greater is required for the junit task ----</echo>
+
+	<!-- generate classpath -->
+	<path id="lib.path.ref">
+		<pathelement location="build"/>
+   		<fileset dir="lib" includes="*.jar"/>
+   		<fileset dir="../jar" includes="*.jar"/>
+ 	</path>
+	
+	<junit printsummary="yes" haltonfailure="yes">		
+	 	<classpath path="${toString:lib.path.ref}"/>
+	 	<formatter type="plain"/>
+	 	<formatter type="xml"/>
+	
+		<!--complete test code should be in the $src.dir so run all of them except ErrorLogsTestBase.java-->
+		<!--that is the base class of ErrorLogsTestUnit.java and ErrorLogsTestSystem.java-->	 	 	
+	 	<batchtest fork="yes" todir="${reports.dir}">
+	 		<fileset dir="${src.dir}">
+	      		<include name="*.java"/>
+	      		<exclude name="ErrorLogsTestSystem.java"/>
+	      		<exclude name="ErrorLogsTestBase.java"/>
+	      		<exclude name="MultipleMmpTest.java"/>
+	      		<exclude name="TracesInHeadersTest.java"/>	 
+	      		<exclude name="TraceHeadersLicenceTest.java"/>                
+	 		</fileset>
+	 	</batchtest>	
+	</junit>
+
+</target>
+
+<target name="jar" depends="build">
+	<mkdir dir="${jar.dir}"/>
+        <jar destfile="${jar.dir}/tests.jar" basedir="${build.dir}">
+            <manifest>
+                <attribute name="Main-Class" value="GroupNamesTest"/>
+            </manifest>
+        </jar>
+</target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/group/ccbuild.xml	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.tracecompiler" default="cc" basedir="..">
+
+	<target name="cc" depends="init, test, analyze" description="Run unit tests and analyze code"/>
+
+	<property name="javacVerbose" value="false"/>
+
+
+	<!-- declare ant4eclipse -->
+	<taskdef resource="net/sf/ant4eclipse/antlib.xml" />
+
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+
+	<!-- Init target -->
+	<target name="init">
+		<property environment="env"/>
+		<property name="testdata.dir" location="${env.EPOCROOT}testdata"/>
+		<property name="reports.dir" location="${env.EPOCROOT}testdata/reports"/>
+		<property name="hudson_reports.dir" location="reports"/>
+		
+		<echo>Cleaning the ${hudson_reports.dir}</echo>
+		<delete dir="${hudson_reports.dir}"/>
+		<echo>Creating the ${hudson_reports.dir} directory</echo>
+		<mkdir dir="${hudson_reports.dir}"/>
+	</target>
+
+	<!-- Test target -->
+	<target name="test" depends="init">
+		<ant antfile="group/build.xml" target="run_unit"/>
+		
+		<!-- Copy reports folder to reports forder in Hudson workspace, so reports can be used in Hudson -->
+		<copy todir="${hudson_reports.dir}">
+			<fileset dir="${reports.dir}"/>
+		</copy>
+	</target>
+
+	<!-- Analyze target -->
+	<target name="analyze" depends="init">
+		<!-- PMD -->
+		<pmd>
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			<ruleset>unusedcode</ruleset>
+			
+			<!-- Output PMD report directly to reports forder in Hudson workspace, so report can be used in Hudson -->
+			<formatter type="xml" toFile="${hudson_reports.dir}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<fileset dir="../src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</pmd>
+	</target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/group/readme.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,6 @@
+build.xml adds ant support for running and building the tests
+
+
+ant build - builds test code
+ant run builds & runs test code
+ant jar generates executable jar file
Binary file tracefw/tracecompiler/test/lib/junit-4.7.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+#include "../mmp_traces/group/bld.inf"
+#include "../mmp_traces_mmpname/group/bld.inf"
+#include "../mmp_traces_slash_target_ext/group/bld.inf"
+#include "../mmp_traces_target_type/group/bld.inf"
+#include "../mmp_traces_mixed/group/bld.inf"
+#include "../mmp_traces_slash_target_ext_commonsource/group/bld.inf"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+mmp_traces1.mmp
+mmp_traces2.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/group/mmp_traces1.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  target1.exe
+TARGETTYPE	  exe
+UID			 0 0xE8576D96
+
+USERINCLUDE	 ../inc
+USERINCLUDE  ../traces
+
+APP_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE   /epoc32/include
+
+SOURCEPATH	  ../src
+SOURCE		  MultipleMmpApp1.cpp 
+SOURCE 		  ExtraCppFile1.cpp
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/group/mmp_traces2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  target2.exe
+TARGETTYPE	  exe
+UID			 0 0xE8576D95
+
+USERINCLUDE	 ../inc
+USERINCLUDE  ../traces
+
+APP_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE   /epoc32/include
+
+SOURCEPATH	  ../src
+SOURCE		  MultipleMmpApp2.cpp 
+SOURCE		  ExtraCppFile2.cpp
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/inc/MultipleMmpApp.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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 __MULTIPLEMMPAPP_H__
+#define __MULTIPLEMMPAPP_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+void CallSomeMoreTraceStatements();
+
+#endif  // __MULTIPLEMMPAPP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/src/ExtraCppFile1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyriight (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile1Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+
+    OstTrace1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTrace1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/src/ExtraCppFile2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,45 @@
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile2Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+
+    OstTrace1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTrace1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/src/MultipleMmpApp1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,77 @@
+
+//  Include Files  
+
+#include "MultipleMmpApp.h"
+#include <e32base.h>
+#include <e32std.h>
+#include <e32cons.h>			// Console
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpApp1Traces.h"
+#endif
+
+//  Constants
+
+_LIT(KTextConsoleTitle, "Console");
+_LIT(KTextFailed, " failed, leave code = %d");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+//  Global Variables
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+
+//  Local Functions
+
+LOCAL_C void MainL()
+    {
+    /****************************TRACE STATEMENTS*********************************/
+    OstTrace0( TRACE_FLOW, TEST1_MAINL, "MainL()" );
+    OstTrace0( TRACE_FLOW, TEST2_MAINL, "MainL()" );    
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    console->Write(_L("Hello, world!\n"));
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    MainL();
+
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(
+            KConsFullScreen, KConsFullScreen)));
+    if (createError)
+        return createError;
+
+    // Run application code inside TRAP harness, wait keypress when terminated
+    TRAPD(mainError, DoStartL());
+    if (mainError)
+        console->Printf(KTextFailed, mainError);
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces/src/MultipleMmpApp2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,94 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleMmpApp.h"
+#include <e32base.h>
+#include <e32std.h>
+#include <e32cons.h>			// Console
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpApp2Traces.h"
+#endif
+
+//  Constants
+
+_LIT(KTextConsoleTitle, "Console");
+_LIT(KTextFailed, " failed, leave code = %d");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+//  Global Variables
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+
+//  Local Functions
+
+LOCAL_C void MainL()
+    {
+    /****************************TRACE STATEMENTS*********************************/
+    OstTrace0( TRACE_FLOW, TEST1_MAINL, "MainL()" );
+    OstTrace0( TRACE_FLOW, TEST2_MAINL, "MainL()" );    
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    console->Write(_L("Hello, world!\n"));
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    MainL();
+
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(
+            KConsFullScreen, KConsFullScreen)));
+    if (createError)
+        return createError;
+
+    // Run application code inside TRAP harness, wait keypress when terminated
+    TRAPD(mainError, DoStartL());
+    if (mainError)
+        console->Printf(KTextFailed, mainError);
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+mmp_traces_mixed1.mmp
+mmp_traces_mixed2.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/group/mmp_traces_mixed1.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+TARGET		  target3.dll
+TARGETTYPE	  kext
+UID			 0 0xE8576D96
+
+USERINCLUDE	 ..\inc
+USERINCLUDE  ..\traces
+USERINCLUDE  ..\traces_target3_kext
+USERINCLUDE  ..\traces\target3_dll //traces should be generated here
+
+OS_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE   \epoc32\include
+
+SOURCEPATH	  ..\src
+SOURCE		  MultipleMmpApp1.cpp 
+SOURCE 		  ExtraCppFile1.cpp
+
+#include "kernel/kern_ext.mmh"
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/group/mmp_traces_mixed2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+TARGET		  target4.dll
+TARGETTYPE	  kext
+UID			 0 0xE8576D95
+
+USERINCLUDE	 ..\inc
+USERINCLUDE  ..\traces
+USERINCLUDE  ..\traces_target4_kext //traces should be generated here
+
+OS_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE   \epoc32\include
+
+SOURCEPATH	  ..\src
+SOURCE		  MultipleMmpApp2.cpp 
+SOURCE		  ExtraCppFile2.cpp
+
+#include "kernel/kern_ext.mmh"
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/inc/MultipleMmpApp.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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 __MULTIPLEMMPAPP_H__
+#define __MULTIPLEMMPAPP_H__
+
+//  Include Files
+
+#include <e32def.h>
+
+
+//  Function Prototypes
+
+void CallSomeMoreTraceStatements();
+
+#endif  // __MULTIPLEMMPAPP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/src/ExtraCppFile1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile1Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+
+    OstTrace1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTrace1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/src/ExtraCppFile2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile2Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+
+    OstTrace1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTrace1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/src/MultipleMmpApp1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleMmpApp.h"
+#include <kernel/kernel.h>
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpApp1Traces.h"
+#endif
+
+
+
+DECLARE_STANDARD_EXTENSION()
+    {
+    /****************************TRACE STATEMENTS*********************************/
+    OstTrace0( TRACE_FLOW, TEST1_DECLARE_STANDARD_EXTENSION, "DECLARE_STANDARD_EXTENSION()" );
+    OstTrace0( TRACE_FLOW, TEST2_DECLARE_STANDARD_EXTENSION, "DECLARE_STANDARD_EXTENSION()" );    
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    return 0;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mixed/src/MultipleMmpApp2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleMmpApp.h"
+#include <kernel/kernel.h>
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpApp2Traces.h"
+#endif
+
+
+DECLARE_STANDARD_EXTENSION()
+    {
+    /****************************TRACE STATEMENTS*********************************/
+    OstTrace0( TRACE_FLOW, TEST1_MAINL, "MainL()" );
+    OstTrace0( TRACE_FLOW, TEST2_MAINL, "MainL()" );    
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    return 0;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+mmp_traces_mmpname1.mmp
+mmp_traces_mmpname2.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/group/mmp_traces_mmpname1.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  target5.exe
+TARGETTYPE	  exe
+UID			 0 0xE8576D96
+
+USERINCLUDE	 ../inc
+USERINCLUDE  ../traces
+USERINCLUDE  ../traces_mmp_traces_mmpname1
+
+APP_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE   /epoc32/include
+
+SOURCEPATH	  ../src
+SOURCE		  MultipleMmpApp1.cpp 
+SOURCE 		  ExtraCppFile1.cpp
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/group/mmp_traces_mmpname2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  target6.exe
+TARGETTYPE	  exe
+UID			 0 0xE8576D95
+
+USERINCLUDE	 ../inc
+USERINCLUDE  ../traces
+USERINCLUDE  ../traces_mmp_traces_mmpname2
+
+APP_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE  /epoc32/include
+
+SOURCEPATH	  ../src
+SOURCE		  MultipleMmpApp2.cpp 
+SOURCE		  ExtraCppFile2.cpp
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/inc/MultipleMmpApp.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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 __MULTIPLEMMPAPP_H__
+#define __MULTIPLEMMPAPP_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+void CallSomeMoreTraceStatements();
+
+#endif  // __MULTIPLEMMPAPP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/src/ExtraCppFile1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile1Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+
+    OstTrace1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTrace1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/src/ExtraCppFile2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile2Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+
+    OstTrace1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTrace1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/src/MultipleMmpApp1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,94 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleMmpApp.h"
+#include <e32base.h>
+#include <e32std.h>
+#include <e32cons.h>			// Console
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpApp1Traces.h"
+#endif
+
+//  Constants
+
+_LIT(KTextConsoleTitle, "Console");
+_LIT(KTextFailed, " failed, leave code = %d");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+//  Global Variables
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+
+//  Local Functions
+
+LOCAL_C void MainL()
+    {
+    /****************************TRACE STATEMENTS*********************************/
+    OstTrace0( TRACE_FLOW, TEST1_MAINL, "MainL()" );
+    OstTrace0( TRACE_FLOW, TEST2_MAINL, "MainL()" );    
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    console->Write(_L("Hello, world!\n"));
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    MainL();
+
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(
+            KConsFullScreen, KConsFullScreen)));
+    if (createError)
+        return createError;
+
+    // Run application code inside TRAP harness, wait keypress when terminated
+    TRAPD(mainError, DoStartL());
+    if (mainError)
+        console->Printf(KTextFailed, mainError);
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_mmpname/src/MultipleMmpApp2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,94 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleMmpApp.h"
+#include <e32base.h>
+#include <e32std.h>
+#include <e32cons.h>			// Console
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpApp2Traces.h"
+#endif
+
+//  Constants
+
+_LIT(KTextConsoleTitle, "Console");
+_LIT(KTextFailed, " failed, leave code = %d");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+//  Global Variables
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+
+//  Local Functions
+
+LOCAL_C void MainL()
+    {
+    /****************************TRACE STATEMENTS*********************************/
+    OstTrace0( TRACE_FLOW, TEST1_MAINL, "MainL()" );
+    OstTrace0( TRACE_FLOW, TEST2_MAINL, "MainL()" );    
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    console->Write(_L("Hello, world!\n"));
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    MainL();
+
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(
+            KConsFullScreen, KConsFullScreen)));
+    if (createError)
+        return createError;
+
+    // Run application code inside TRAP harness, wait keypress when terminated
+    TRAPD(mainError, DoStartL());
+    if (mainError)
+        console->Printf(KTextFailed, mainError);
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,24 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+mmp_traces_slash_target_ext1.mmp
+mmp_traces_slash_target_ext2.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/group/mmp_traces_slash_target_ext1.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  target7.dll
+TARGETTYPE	  kext
+UID			 0 0xE8576D96
+
+USERINCLUDE	 ..\inc
+USERINCLUDE  ..\traces\target7_dll
+
+OS_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE   \epoc32\include
+
+SOURCEPATH	  ..\src
+SOURCE		  MultipleMmpApp1.cpp 
+SOURCE 		  ExtraCppFile1.cpp
+
+#include "kernel/kern_ext.mmh"
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/group/mmp_traces_slash_target_ext2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  target8.dll
+TARGETTYPE	  kext
+UID			 0 0xE8576D95
+
+USERINCLUDE	 ..\inc
+USERINCLUDE  ..\traces\target8_dll
+
+OS_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE   \epoc32\include
+
+SOURCEPATH	  ..\src
+SOURCE		  MultipleMmpApp2.cpp 
+SOURCE		  ExtraCppFile2.cpp
+
+#include "kernel/kern_ext.mmh"
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/inc/MultipleMmpApp.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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 __MULTIPLEMMPAPP_H__
+#define __MULTIPLEMMPAPP_H__
+
+//  Include Files
+
+#include <e32def.h>
+
+
+//  Function Prototypes
+
+void CallSomeMoreTraceStatements();
+
+#endif  // __MULTIPLEMMPAPP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/src/ExtraCppFile1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile1Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+
+    OstTrace1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTrace1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/src/ExtraCppFile2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile2Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+
+    OstTrace1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTrace1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/src/MultipleMmpApp1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleMmpApp.h"
+#include <kernel/kernel.h>
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpApp1Traces.h"
+#endif
+
+
+
+DECLARE_STANDARD_EXTENSION()
+    {
+    /****************************TRACE STATEMENTS*********************************/
+    OstTrace0( TRACE_FLOW, TEST1_DECLARE_STANDARD_EXTENSION, "DECLARE_STANDARD_EXTENSION()" );
+    OstTrace0( TRACE_FLOW, TEST2_DECLARE_STANDARD_EXTENSION, "DECLARE_STANDARD_EXTENSION()" );    
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    return 0;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext/src/MultipleMmpApp2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleMmpApp.h"
+#include <kernel/kernel.h>
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpApp2Traces.h"
+#endif
+
+
+DECLARE_STANDARD_EXTENSION()
+    {
+    /****************************TRACE STATEMENTS*********************************/
+    OstTrace0( TRACE_FLOW, TEST1_MAINL, "MainL()" );
+    OstTrace0( TRACE_FLOW, TEST2_MAINL, "MainL()" );    
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    return 0;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext_commonsource/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+mmp_traces_slash_target_cs_ext1.mmp
+mmp_traces_slash_target_cs_ext2.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext_commonsource/group/mmp_traces_slash_target_cs_ext1.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  target9.dll
+TARGETTYPE	  kext
+UID			 0 0xE8576D96
+
+USERINCLUDE	 ..\inc
+USERINCLUDE  ..\traces\target9_dll
+
+OS_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE   \epoc32\include
+
+SOURCEPATH	  ..\src
+SOURCE		  MultipleMmpApp1.cpp 
+SOURCE 		  ExtraCppFile1.cpp
+
+#include "kernel/kern_ext.mmh"
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext_commonsource/group/mmp_traces_slash_target_cs_ext2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  target10.dll
+TARGETTYPE	  kext
+UID			 0 0xE8576D95
+
+USERINCLUDE	 ..\inc
+USERINCLUDE  ..\traces\target10_dll
+
+OS_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE   \epoc32\include
+
+SOURCEPATH	  ..\src
+SOURCE		  MultipleMmpApp1.cpp 
+SOURCE		  ExtraCppFile1.cpp
+
+#include "kernel/kern_ext.mmh"
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext_commonsource/inc/MultipleMmpApp.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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 __MULTIPLEMMPAPP_H__
+#define __MULTIPLEMMPAPP_H__
+
+//  Include Files
+
+#include <e32def.h>
+
+
+//  Function Prototypes
+
+void CallSomeMoreTraceStatements();
+
+#endif  // __MULTIPLEMMPAPP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext_commonsource/src/ExtraCppFile1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile1Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+
+    OstTrace1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTrace1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_slash_target_ext_commonsource/src/MultipleMmpApp1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleMmpApp.h"
+#include <kernel/kernel.h>
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpApp1Traces.h"
+#endif
+
+
+
+DECLARE_STANDARD_EXTENSION()
+    {
+    /****************************TRACE STATEMENTS*********************************/
+    OstTrace0( TRACE_FLOW, TEST1_DECLARE_STANDARD_EXTENSION, "DECLARE_STANDARD_EXTENSION()" );
+    OstTrace0( TRACE_FLOW, TEST2_DECLARE_STANDARD_EXTENSION, "DECLARE_STANDARD_EXTENSION()" );    
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    return 0;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/group/bld.inf	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+mmp_traces_target_type1.mmp
+mmp_traces_target_type2.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/group/mmp_traces_target_type1.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		  target11.exe
+TARGETTYPE	exe
+UID			 0 0xE8576D96
+
+USERINCLUDE	 ..\inc
+USERINCLUDE  ..\traces_target11_exe
+
+APP_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE   \epoc32\include
+
+SOURCEPATH	  ..\src
+SOURCE		  MultipleMmpApp1.cpp 
+SOURCE 		  ExtraCppFile1.cpp
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/group/mmp_traces_target_type2.mmp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+
+TARGET		   target12.exe
+TARGETTYPE	  exe
+UID			 0 0xE8576D95
+
+USERINCLUDE	 ..\inc
+USERINCLUDE  ..\traces_target12_exe
+
+APP_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE   \epoc32\include
+
+SOURCEPATH	  ..\src
+SOURCE		  MultipleMmpApp2.cpp 
+SOURCE		  ExtraCppFile2.cpp
+
+LIBRARY		 euser.lib
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/inc/MultipleMmpApp.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2010 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 __MULTIPLEMMPAPP_H__
+#define __MULTIPLEMMPAPP_H__
+
+//  Include Files
+
+#include <e32base.h>
+
+//  Function Prototypes
+
+GLDEF_C TInt E32Main();
+void CallSomeMoreTraceStatements();
+
+#endif  // __MULTIPLEMMPAPP_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/src/ExtraCppFile1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile1Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+
+    OstTrace1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTrace1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/src/ExtraCppFile2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+/*
+ * ExtraCppFile.cpp
+ *
+ *  Created on: Dec 7, 2009
+ *      Author: cajagu
+ */
+
+#include "MultipleMmpApp.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ExtraCppFile2Traces.h"
+#endif
+
+void CallSomeMoreTraceStatements()
+    {
+    TInt32 x = 555;
+    TUint32 y = 666;
+
+    OstTrace1( TRACE_FLOW, TEST1_CALLMORE, "CallSomeMoreTraceStatements(): x=%d" , x );
+    OstTrace1( TRACE_FLOW, TEST2_CALLMORE, "CallSomeMoreTraceStatements(): y=%u" , y );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/src/MultipleMmpApp1.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,94 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleMmpApp.h"
+#include <e32base.h>
+#include <e32std.h>
+#include <e32cons.h>			// Console
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpApp1Traces.h"
+#endif
+
+//  Constants
+
+_LIT(KTextConsoleTitle, "Console");
+_LIT(KTextFailed, " failed, leave code = %d");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+//  Global Variables
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+
+//  Local Functions
+
+LOCAL_C void MainL()
+    {
+    /****************************TRACE STATEMENTS*********************************/
+    OstTrace0( TRACE_FLOW, TEST1_MAINL, "MainL()" );
+    OstTrace0( TRACE_FLOW, TEST2_MAINL, "MainL()" );    
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    console->Write(_L("Hello, world!\n"));
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    MainL();
+
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(
+            KConsFullScreen, KConsFullScreen)));
+    if (createError)
+        return createError;
+
+    // Run application code inside TRAP harness, wait keypress when terminated
+    TRAPD(mainError, DoStartL());
+    if (mainError)
+        console->Printf(KTextFailed, mainError);
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/multipleMmpTestCases/mmp_traces_target_type/src/MultipleMmpApp2.cpp	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,94 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+//  Include Files  
+
+#include "MultipleMmpApp.h"
+#include <e32base.h>
+#include <e32std.h>
+#include <e32cons.h>			// Console
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "MultipleMmpApp2Traces.h"
+#endif
+
+//  Constants
+
+_LIT(KTextConsoleTitle, "Console");
+_LIT(KTextFailed, " failed, leave code = %d");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+//  Global Variables
+
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+
+//  Local Functions
+
+LOCAL_C void MainL()
+    {
+    /****************************TRACE STATEMENTS*********************************/
+    OstTrace0( TRACE_FLOW, TEST1_MAINL, "MainL()" );
+    OstTrace0( TRACE_FLOW, TEST2_MAINL, "MainL()" );    
+    /*****************************************************************************/
+    
+    CallSomeMoreTraceStatements();
+    
+    console->Write(_L("Hello, world!\n"));
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    MainL();
+
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(
+            KConsFullScreen, KConsFullScreen)));
+    if (createError)
+        return createError;
+
+    // Run application code inside TRAP harness, wait keypress when terminated
+    TRAPD(mainError, DoStartL());
+    if (mainError)
+        console->Printf(KTextFailed, mainError);
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/src/ErrorLogsTestBase.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,269 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+import static org.junit.Assert.fail;
+
+import java.io.BufferedReader;
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+
+public class ErrorLogsTestBase {
+	
+	/****************************************************UTILITY FUNCTIONS FOR TESTS************************************************************/
+	
+	/**
+	 * This function gets an environment variable value given the name.
+	 * @param variablename The name of the variable for which the value is required.
+	 * @return The variable value.
+	 */
+	public String GetEnvironmentVariablePath(String variablename) {
+		String variablevalue = System.getenv(variablename);
+		if(variablevalue == null || (variablevalue.length()==0)){
+			fail();
+		}
+		
+		// need to check that the path ends in a backslash
+		if(!variablevalue.endsWith(File.separator)){ 
+			variablevalue += File.separator; 
+		}
+		return variablevalue;
+	}
+	
+	/**
+	 * This function invokes the desired compiler for a particular test case depending
+	 * on the string passed
+	 * @param compiler String specifying the compiler to run, and also specifying where
+	 * 		  		   the logs should be stored.
+	 */
+	public void InvokeCompiler(String compiler) {
+		System.out.println ("InvokeCompiler()");
+		//get epocroot location
+		String e32=GetEnvironmentVariablePath("EPOCROOT");
+		
+		String TraceErrorAppPath = e32 + "testdata" + File.separator + "TraceErrorApp" + File.separator;
+		try{
+			File compilerpath = new File (e32 + "epoc32" + File.separator + "tools" + File.separator + "tracecompiler" + File.separator);
+			
+			if (compiler.compareTo("_sbs")==0){//raptor
+				compilerpath = new File (e32 + "testdata" + File.separator + "TraceErrorApp" + File.separator +"group" + File.separator);
+			}
+			else if (compiler.compareTo("_mult_cpp")==0){//raptor compiling project with multiple source files
+				compilerpath = new File (e32 + "testdata" + File.separator + "MultipleCppTraceErrorApp" + File.separator + "group" + File.separator);
+			}
+			else if (compiler.compareTo("_mult_mmp")==0){//raptor compiling project with multiple source files
+				compilerpath = new File (e32 + "testdata" + File.separator + "MultipleMmpTraceErrorApps" + File.separator + "group" + File.separator);
+			}
+			else if (compiler.compareTo("_tc")!=0){
+				System.out.println("Error: Unrecognised test case. Use either _tc, _sbs, _mult_cpp or _mult_mmp");
+				fail();
+			}
+			
+			//set up the process builder object
+	 		ProcessBuilder pb; 
+	 		//commands to be used to invoke the compiler
+	 		if (compiler.compareTo("_tc")==0){//tracecompiler
+	 			// These EMMA flags are added, because of EMMA reporting in Hudson
+				// EMMA lfags are commented out, because it does not work in Hudson at the moment
+//	 			String emmaOutputFileFlag = "-Demma.coverage.out.file=" + e32 + "testdata" + File.separator + "reports" + File.separator + "emma" + File.separator + "coverage.emma";
+//	 			String emmaOutputMergeFlag = "-Demma.coverage.out.merge=true";
+	 			String emmaOutputFileFlag = "";
+	 			String emmaOutputMergeFlag = "";
+	 			pb = new ProcessBuilder("java", emmaOutputFileFlag, emmaOutputMergeFlag, "-classpath",".", "com.nokia.tracecompiler.TraceCompiler", "E8576D92", "TraceErrorApp",TraceErrorAppPath+"group"+File.separator+"TraceErrorApp.mmp",TraceErrorAppPath+"src"+File.separator+"TraceErrorApp.cpp");
+	 		}
+	 		else /*if (compiler.compareTo("_sbs")==0)*/{//for all other raptor cases
+	 			pb = new ProcessBuilder("sbs.bat","-c","armv5.tracecompiler");
+	 		}
+	 		
+			pb.directory(compilerpath);
+			pb.redirectErrorStream(true);
+			
+			//start the compiler
+			Process p = pb.start();
+			InputStream inp = p.getInputStream();
+	        int c = -1;
+	        
+	        
+	        String str = "";
+	        
+	        /*
+	        //read the output from the compiler into the input stream
+	        while ((c = inp.read()) != -1) {
+	            str= str +((char)c);
+	        }
+	        */
+	        
+	        StringBuilder sb = new StringBuilder();
+	        //read the output from the compiler into the input stream
+	        while ((c = inp.read()) != -1) {
+	        	sb.append(((char)c));
+	        }
+	        str = sb.toString();
+	        
+	        
+	    	//Declare output file to write logs to
+	    	FileOutputStream outstream; 
+			PrintStream ps; 
+			System.out.println ("creating output logs in buildlog"+compiler+".txt");
+			outstream = new FileOutputStream(e32+"epoc32"+File.separator+"build"+File.separator+"buildlog"+compiler+".txt");
+			ps = new PrintStream( outstream );
+			ps.println (str);
+			
+			//check return code if tracecompiler.. we don't check error code for raptor:
+			int ret = p.exitValue();
+			if ((ret==0)&&(compiler.compareTo("_tc")==0)){
+				System.out.println("FAIL: TraceCompiler does not exit with error");
+				fail();
+			}
+			inp.close();
+			outstream.close();
+		}
+		
+    	catch (IOException e){//Catch IOException
+    		System.err.println("Error: " + e.getMessage());
+    		fail();
+        }
+		
+	}
+	
+	/**
+	 * This function parses the log files (as specified by the passed string) for errors and warnings
+	 *  and stores them in a separate file (also specified by the same passed string)
+	 * 
+	 * @param pathext  String specifying the part of the name of the build log file to parse which is 
+	 * 				   also part of the name of the file where parsed logs are written to.	  		   
+	 */
+	public void ParseLogFile(String pathext) {
+		System.out.println ("ParseLogFile()");
+		//get epocroot location
+		String e32=GetEnvironmentVariablePath("EPOCROOT");
+		
+		
+	    try{
+	    	// Open the file
+	    	System.out.println ("opening buildlog"+pathext+".txt");
+	    	FileInputStream fstream = new FileInputStream(e32+"epoc32"+File.separator+"build"+File.separator+"buildlog"+pathext+".txt");
+
+	    	// Get the object of DataInputStream
+	    	//System.out.println ("creating input stream");
+	    	DataInputStream in = new DataInputStream(fstream);
+	        BufferedReader br = new BufferedReader(new InputStreamReader(in));
+	    	String strLine;
+	    	
+	    	//Declare output file to write parsed logs to
+	    	FileOutputStream out; 
+			PrintStream p; 
+			//System.out.println ("creating output stream");
+			out = new FileOutputStream(e32+"epoc32"+File.separator+"build"+File.separator+"parsedlogs"+pathext+".txt");
+			p = new PrintStream( out );
+	    	
+	    	//Read File Line By Line and write to parsedlogs.txt
+	    	System.out.println ("Writing to parsedlogs"+pathext+".txt");
+	    	while ((strLine = br.readLine()) != null&&(strLine.length()) >= 9)   {
+	    		//remove any leading white spaces because there are spaces when printed to standard output.
+	    		strLine=strLine.trim();
+		    	if((strLine.startsWith("error:")==true)||(strLine.startsWith("warning:")==true)){
+			    	// Write to a separate file
+			    	p.println (strLine);
+	    	}
+      	
+    	}
+    	
+    	//Close the input and output streams
+    	in.close();
+    	out.close();
+    	}
+    	
+    	catch (IOException e){//Catch IOException
+    		System.err.println("Error: " + e.getMessage());
+    		fail();
+    	}
+	
+	}
+	
+	/**
+	 * This function validates the parsed log file by comparing it to a reference file containg
+	 * the knows warnings and errors 
+	 * @param project String specifying the name of the project folder that was compiled.
+	 * @param pathext String specifying the part of the name of the parsed log file to validate.	   
+	 */
+	public void ValidateLogs(String project, String pathext) {
+		System.out.println ("ValidateLogs()");
+		//get epocroot location
+		String e32=GetEnvironmentVariablePath("EPOCROOT");
+		
+	try{
+		// Open the files
+		System.out.println ("opening referencelog.txt and parsedlogs"+pathext+".txt");
+		FileInputStream fstream1 = new FileInputStream(e32+"testdata"+File.separator+project+File.separator+"data"+File.separator+"referencelog.txt");
+		FileInputStream fstream2 = new FileInputStream(e32+"epoc32"+File.separator+"build"+File.separator+"parsedlogs"+pathext+".txt");
+	
+		// Get the objects of DataInputStream
+		//System.out.println ("creating input streams");
+		DataInputStream in1 = new DataInputStream(fstream1);
+		DataInputStream in2 = new DataInputStream(fstream2);
+		//System.out.println ("creating buffered readers");
+	    BufferedReader br1 = new BufferedReader(new InputStreamReader(in1));
+	    BufferedReader br2 = new BufferedReader(new InputStreamReader(in2));
+		String strLine1;
+		String strLine2;
+		int i=1;
+		
+		//compare the two files
+		while (((strLine1 = br1.readLine()) != null)&&(((strLine2 = br2.readLine()) != null)))   {
+			if (pathext.compareTo("_mult_mmp")!=0){//if this is not the multiple mmp test, then compare the whole error string
+				if(strLine1.compareTo(strLine2)==0){
+					System.out.println ("Validated line "+i+": "+strLine1);
+				}
+				else{
+					System.out.println ("Line "+i+" ("+strLine2+") is not correct.");
+					fail();
+				}
+			}
+			else{//else if this is the multiple mmp test, compare only the last 40 characters of the string because
+				//raptor does not have a specified order in which it compiles mmps using trace compiler so we can't validate exactly
+				if(strLine1.substring(strLine1.length()-40, strLine1.length()).compareTo(strLine2.substring(strLine1.length()-40, strLine2.length()))==0){
+					System.out.println ("Validated line "+i+": "+strLine1);
+				}
+				else{
+					System.out.println ("Line "+i+" ("+strLine2+") is not correct.");
+					fail();
+				}			
+			}
+		i++;
+		}
+		
+		if (i==1) {//never entered loop therefore there were no errors or warnings in the build logs
+			System.out.println("FAIL: Compiler did not output any correct errors to logs");
+			fail();
+		}
+		in1.close();
+		in2.close();
+	}
+	
+	catch (IOException e){//Catch IOException
+		System.err.println("Error: " + e.getMessage());
+		fail();
+    }
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/src/ErrorLogsTestSystem.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+import org.junit.Test;
+
+public class ErrorLogsTestSystem extends ErrorLogsTestBase{
+	
+	public static void main(String args[]) {		
+	      	org.junit.runner.JUnitCore.main(ErrorLogsTestSystem.class.getName());
+	    }
+	
+	/**
+	 * This test calls Trace Compiler via Raptor and invokes it against a simple c++ project with one mmp file containing one cpp 
+	 * The logs from Raptor (written to std::out) are checked to ensure the errors and warnings from traceCompiler are correct.
+	 */
+	@Test
+	public void SystemTestTraceCompilerAndRaptor (){
+		System.out.println ("****************SystemTestTraceCompilerAndRaptor()**********************");
+		//Call Raptor
+		InvokeCompiler("_sbs");
+		
+		//Parse the Raptor log files (from standard output)
+		ParseLogFile("_sbs");
+		
+		//Validate the Raptor log files
+		ValidateLogs("TraceErrorApp","_sbs");		
+	}
+	
+	/**
+	 * This test calls Trace Compiler via Raptor and invokes it against a c++ project with one mmp file containing two cpp files.
+	 * The logs from Raptor (written to std::out) are checked to ensure the errors and warnings from traceCompiler are correct.
+	 * It is expected that all errors from all ccp files are written to the logs.
+	 */
+	@Test
+	public void SystemTestTraceCompilerAndRaptorMultipleCpps (){
+		System.out.println ("**********SystemTestTraceCompilerAndRaptorMultipleCpps()****************");
+		//Call Raptor
+		InvokeCompiler("_mult_cpp");
+		
+		//Parse the Raptor log files (from standard output)
+		ParseLogFile("_mult_cpp");
+		
+		//Validate the Raptor log files
+		ValidateLogs("MultipleCppTraceErrorApp","_mult_cpp");		
+	}
+	
+	/**
+	 * This test calls Trace Compiler via Raptor and invokes it against a c++ project with two mmp files each containing two cpp files.
+	 * The logs from Raptor (written to std::out) are checked to ensure the erros and warnings from traceCompiler are correct.
+	 * It is expected that all errors from all cpp files in the first mmp which is compiled are written to the logs. Any mmp after that
+	 * point is not compiled.
+	 */
+	@Test
+	public void SystemTestTraceCompilerAndRaptorMultipleMmps (){
+		System.out.println ("**********SystemTestTraceCompilerAndRaptorMultipleMmps()****************");
+		//Call Raptor
+		InvokeCompiler("_mult_mmp");
+		
+		//Parse the Raptor log files (from standard output)
+		ParseLogFile("_mult_mmp");
+		
+		//Validate the Raptor log files
+		ValidateLogs("MultipleMmpTraceErrorApps","_mult_mmp");	
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/src/ErrorLogsTestUnit.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+import org.junit.Test;
+
+public class ErrorLogsTestUnit extends ErrorLogsTestBase {
+	
+	public static void main(String args[]) {		
+	      	org.junit.runner.JUnitCore.main(ErrorLogsTestUnit.class.getName());
+	    }
+	
+	/**
+	 * This test calls Trace Compiler directly and invokes it against a simple c++ project with one cpp and one mmp file
+	 * The exit code from tracecompiler is checked to ensure an error is indicated and the logs are also checked
+	 */
+	@Test
+	public void UnitTestTraceCompiler (){
+		System.out.println ("*********************UnitTestTraceCompiler()****************************");
+		//Call Trace Compiler
+		InvokeCompiler("_tc");
+		
+		//Parse the Trace Compiler log files
+		ParseLogFile("_tc");
+		
+		//Validate the Trace Compiler log files
+		ValidateLogs("TraceErrorApp","_tc");		
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/src/FixedIdDefinitionsTest.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,597 @@
+/*
+ * 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:
+ *
+ * JUnit tests for fixed_id.definitions file
+ *
+ */
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Writer;
+
+import junit.framework.TestCase;
+
+import org.junit.Test;
+
+import com.nokia.tracecompiler.file.FileUtils;
+import com.nokia.tracecompiler.source.SourceDocumentFactory;
+
+public class FixedIdDefinitionsTest extends TestCase {
+
+	/**
+	 * EMMA output prefix
+	 */
+	private static final String EMMA_OUTPUT_PREFIX = "EMMA: "; //$NON-NLS-1$
+	
+	/**
+	 * Fixed id definitions test app took note prefix
+	 */
+	private static final String FIXED_ID_DEFINITIONS_TEST_APP_TOOK_NOTE_PREFIX = "FixedIdDefinitionsTestApp took"; //$NON-NLS-1$
+
+	/**
+	 * UID3 of FixedIdDefinitionsTestApp
+	 */
+	private static final String FIXED_ID_DEFINITIONS_TEST_APP_UID3 = "E8576D92"; //$NON-NLS-1$
+
+	/**
+	 * txt extension
+	 */
+	private static final String TXT_EXTENSION = ".txt"; //$NON-NLS-1$
+
+	/**
+	 * Reference fid file name prefix
+	 */
+	private static final String REFERENCE_FID_FILE_NAME_PREFIX = "reference_fid_file_"; //$NON-NLS-1$
+
+	/**
+	 * Reference fid file name prefix
+	 */
+	private static final String REFERENCE_TC_OUTPUT_NAME_PREFIX = "reference_tc_output_"; //$NON-NLS-1$	
+
+	/**
+	 * data directory name
+	 */
+	private static final String DATA_DIRECTORY = "data"; //$NON-NLS-1$
+
+	/**
+	 * traces directory name
+	 */
+	private static final String TRACES_DIRECTORY = "traces"; //$NON-NLS-1$
+
+	/**
+	 * fixed_id.definitions file name
+	 */
+	private static final String FIXED_ID_DEFINITIONS_FILE_NAME = "fixed_id.definitions"; //$NON-NLS-1$
+
+	/**
+	 * Line comment tag
+	 */
+	private static final String LINE_COMMENT_TAG = "//"; //$NON-NLS-1$
+
+	/**
+	 * TRACE_USED_IN_TEST_CASE tag
+	 */
+	private static final String TRACE_USED_IN_TEST_CASE_TAG = "TRACE_USED_IN_TEST_CASE"; //$NON-NLS-1$
+
+	/**
+	 * Error text prefix
+	 */
+	private static final String ERROR_TEXT_PREFIX = "Error: "; //$NON-NLS-1$
+
+	/**
+	 * src directory name
+	 */
+	private static final String SRC_DIRECTORY = "src"; //$NON-NLS-1$
+
+	/**
+	 * .cpp extension
+	 */
+	private static final String CPP_EXTENSION = ".cpp"; //$NON-NLS-1$
+
+	/**
+	 * FixedIdDefinitionsTestApp
+	 */
+	private static final String FIXED_ID_DEFINITIONS_TEST_APP = "FixedIdDefinitionsTestApp"; //$NON-NLS-1$
+
+	/**
+	 * Variable for epocroot
+	 */
+	String e32;
+
+	/**
+	 * Path to FixedIdDefinitionsTestApp application
+	 */
+	String fixedIdDefinitionsTestAppPath;
+
+	/**
+	 * Process builder
+	 */
+	ProcessBuilder pb = null;
+
+	/**
+	 * Compiler path
+	 */
+	File compilerPath = null;
+
+	/**
+	 * Line separator
+	 */
+	String lineSeparator;
+
+	/**
+	 * Source file name with full path
+	 */
+	String sourceFileNameWithFullPath;
+
+	/**
+	 * fixed_id.definitions file name with full path
+	 */
+	String fixedIdDefinitionsFileNameWithFullPath;
+
+	/**
+	 * SourceDocumentFactory
+	 */
+	SourceDocumentFactory factory = null;
+
+	public static void main(String[] args) {
+		org.junit.runner.JUnitCore.main(FixedIdDefinitionsTest.class.getName());
+	}
+
+	/**
+	 * setup
+	 */
+	@Test
+	public void setUp() {
+		System.out.println("Setup class variables"); //$NON-NLS-1$
+
+		e32 = System.getenv("EPOCROOT"); //$NON-NLS-1$
+
+		if (!e32.endsWith(File.separator)) {
+			e32 += File.separator;
+		}
+
+		fixedIdDefinitionsTestAppPath = e32 + "testdata" + File.separator //$NON-NLS-1$
+				+ FIXED_ID_DEFINITIONS_TEST_APP + File.separator;
+				
+		// These EMMA flags are added, because of EMMA reporting in Hudson
+		String emmaOutputFileFlag = "-Demma.coverage.out.file=" + e32 + "testdata" + File.separator + "reports" + File.separator + "emma" + File.separator + "coverage.emma";
+		String emmaOutputMergeFlag = "-Demma.coverage.out.merge=true";
+
+		pb = new ProcessBuilder("java", emmaOutputFileFlag, emmaOutputMergeFlag, "-classpath", ".", //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
+				"com.nokia.tracecompiler.TraceCompiler", FIXED_ID_DEFINITIONS_TEST_APP_UID3, //$NON-NLS-1$
+				FIXED_ID_DEFINITIONS_TEST_APP, fixedIdDefinitionsTestAppPath
+						+ "group" + File.separator //$NON-NLS-1$
+						+ FIXED_ID_DEFINITIONS_TEST_APP + ".mmp", //$NON-NLS-1$
+				fixedIdDefinitionsTestAppPath + SRC_DIRECTORY + File.separator
+						+ FIXED_ID_DEFINITIONS_TEST_APP + CPP_EXTENSION);
+
+		compilerPath = new File(e32 + "epoc32" + File.separator + "tools" //$NON-NLS-1$//$NON-NLS-2$
+				+ File.separator + "tracecompiler" + File.separator); //$NON-NLS-1$
+
+		lineSeparator = System.getProperty("line.separator"); //$NON-NLS-1$
+
+		sourceFileNameWithFullPath = fixedIdDefinitionsTestAppPath
+				+ SRC_DIRECTORY + File.separator
+				+ FIXED_ID_DEFINITIONS_TEST_APP + CPP_EXTENSION;
+
+		fixedIdDefinitionsFileNameWithFullPath = fixedIdDefinitionsTestAppPath
+				+ TRACES_DIRECTORY + File.separator
+				+ FIXED_ID_DEFINITIONS_FILE_NAME;
+	}
+
+	/**
+	 * Check if fixed id file is created correctly when it doesn't already exist
+	 */
+	@Test
+	public void testFixedIdDefinitionsFunctionalityTestCase_1() {
+		int testCaseNumber = 1;
+		System.out
+				.println("*** Check if fixed id file is created correctly when it doesn't already exist ***"); //$NON-NLS-1$
+		executeTestCase(testCaseNumber, 0);
+	}
+
+	/**
+	 * Check new trace points are assigned values correctly (i.e. existing ones
+	 * don't change)
+	 */
+	@Test
+	public void testFixedIdDefinitionsFunctionalityTestCase_2() {
+		int testCaseNumber = 2;
+		System.out
+				.println("*** Check new trace points are assigned values correctly (i.e. existing ones don't change) ***"); //$NON-NLS-1$
+		executeTestCase(testCaseNumber, 0);
+	}
+
+	/**
+	 * Check removed trace points / user-defined groups are obsoleted correctly
+	 */
+	@Test
+	public void testFixedIdDefinitionsFunctionalityTestCase_3() {
+		int testCaseNumber = 3;
+		System.out
+				.println("*** Check removed trace points / user-defined groups are obsoleted correctly ***"); //$NON-NLS-1$
+		executeTestCase(testCaseNumber, 0);
+	}
+
+	/**
+	 * Check that adding a trace point with an obsoleted name is given a new
+	 * value.
+	 */
+	@Test
+	public void testFixedIdDefinitionsFunctionalityTestCase_4() {
+		int testCaseNumber = 4;
+		System.out
+				.println("*** Check that adding a trace point with an obsoleted name is given a new value. ***"); //$NON-NLS-1$
+		executeTestCase(testCaseNumber, 0);
+	}
+
+	/**
+	 * Check that obsoleting all trace points in a component that refer to a
+	 * common group id (e.g. TRACE_FLOW) does NOT mark group as obsolete
+	 */
+	@Test
+	public void testFixedIdDefinitionsFunctionalityTestCase_5() {
+		int testCaseNumber = 5;
+		System.out
+				.println("*** Check that obsoleting all trace points in a component that refer to a common group id (e.g. TRACE_FLOW) does NOT mark group as obsolete ***"); //$NON-NLS-1$
+		executeTestCase(testCaseNumber, 0);
+	}
+
+	/**
+	 * Check that repeatedly obsoleting a trace point does not mess
+	 * TraceCompiler.
+	 */
+	@Test
+	public void testFixedIdDefinitionsFunctionalityTestCase_6() {
+		int testCaseNumber = 6;
+		int subTestNumber = 1;
+		System.out
+				.println("*** Check that repeatedly obsoleting a trace point does not mess TraceCompiler. ***"); //$NON-NLS-1$
+		int numberOfSubTests = 4;
+		while (subTestNumber < numberOfSubTests) {
+			executeTestCase(testCaseNumber, subTestNumber);
+			subTestNumber++;
+		}
+	}
+
+	/**
+	 * Check that repeatedly changing group of the trace point does not mess
+	 * TraceCompiler.
+	 */
+	@Test
+	public void testFixedIdDefinitionsFunctionalityTestCase_7() {
+		int testCaseNumber = 7;
+		int subTestNumber = 1;
+		System.out
+				.println("*** Check that repeatedly changing group of the trace point does not mess TraceCompiler. ***"); //$NON-NLS-1$
+		int numberOfSubTests = 3;
+		while (subTestNumber < numberOfSubTests) {
+			executeTestCase(testCaseNumber, subTestNumber);
+			subTestNumber++;
+		}
+	}
+
+	/**
+	 * Check that a OSTv1 common group id values results in new fixed id file.
+	 */
+	@Test
+	public void testFixedIdDefinitionsFunctionalityTestCase_8() {
+		int testCaseNumber = 8;
+		System.out
+				.println("*** Check that a OSTv1 common group id values results in new fixed id file. ***"); //$NON-NLS-1$
+		executeTestCaseWithTraceCompilerOutputCheck(testCaseNumber, 0);
+	}
+
+	/**
+	 * Check that a OSTv1 user group id values results in new fixed id file.
+	 */
+	@Test
+	public void testFixedIdDefinitionsFunctionalityTestCase_9() {
+		int testCaseNumber = 9;
+		System.out
+				.println("*** Check that a OSTv1 user group id values results in new fixed id file. ***"); //$NON-NLS-1$
+		executeTestCaseWithTraceCompilerOutputCheck(testCaseNumber, 0);
+	}
+
+	/**
+	 * Sub function to execute test case with TraceCompiler output check
+	 * 
+	 * @param testCaseNumber
+	 *            Test case number
+	 */
+	private void executeTestCaseWithTraceCompilerOutputCheck(
+			int testCaseNumber, int subTestNumber) {
+		System.out
+				.println("Start to execute test case with TraceCompiler output check."); //$NON-NLS-1$
+		modifyFixedIdDefinitionsTestApp(testCaseNumber, subTestNumber);
+		InputStream traceCompilerOutput = runTraceCompiler();
+		verifyTraceCompilerOutput(testCaseNumber, subTestNumber,
+				traceCompilerOutput);
+		verifyTestResults(testCaseNumber, subTestNumber);
+	}
+
+	/**
+	 * Sub function to execute test case
+	 * 
+	 * @param testCaseNumber
+	 *            Test case number
+	 */
+	private void executeTestCase(int testCaseNumber, int subTestNumber) {
+		System.out.println("Start to execute test case."); //$NON-NLS-1$
+		modifyFixedIdDefinitionsTestApp(testCaseNumber, subTestNumber);
+		if (testCaseNumber > 1) {
+			initializeFixedIDDefinitionsFile(testCaseNumber, subTestNumber);
+		}
+		runTraceCompiler();
+		verifyTestResults(testCaseNumber, subTestNumber);
+	}
+
+	/**
+	 * Initialize fixed_id.defitions file
+	 * 
+	 * @param testCaseNumber
+	 *            Test case number
+	 */
+	private void initializeFixedIDDefinitionsFile(int testCaseNumber,
+			int subTestNumber) {
+		System.out.println("Initialize fixed_id.defitions file"); //$NON-NLS-1$
+		String refesenceFileName;
+		if (subTestNumber == 0) {
+			refesenceFileName = REFERENCE_FID_FILE_NAME_PREFIX
+					+ (testCaseNumber - 1);
+		} else {
+			refesenceFileName = REFERENCE_FID_FILE_NAME_PREFIX + testCaseNumber
+					+ "_" + (subTestNumber - 1); //$NON-NLS-1$
+		}
+		refesenceFileName = refesenceFileName + TXT_EXTENSION;
+		String sourceFile = fixedIdDefinitionsTestAppPath + DATA_DIRECTORY
+				+ File.separator + refesenceFileName;
+		File source = new File(sourceFile);
+		File target = new File(fixedIdDefinitionsFileNameWithFullPath);
+		FileUtils.copyFile(source, target);
+	}
+
+	/**
+	 * Modify FixedIdDefinitionsTestApp application source code
+	 * 
+	 * @param testCaseNumber
+	 *            test case number
+	 */
+	private void modifyFixedIdDefinitionsTestApp(int testCaseNumber,
+			int subTestNumber) {
+		System.out
+				.println("Modify FixedIdDefinitionsTestApp application source code"); //$NON-NLS-1$
+		try {
+			StringBuilder modifiedContents = new StringBuilder();
+			File sourceFile = new File(sourceFileNameWithFullPath);
+			BufferedReader input = new BufferedReader(
+					new FileReader(sourceFile));
+			String line;
+			String currentTestCaseTag = TRACE_USED_IN_TEST_CASE_TAG
+					+ "_" + testCaseNumber; //$NON-NLS-1$
+			if (subTestNumber != 0) {
+				currentTestCaseTag = currentTestCaseTag + "_" + subTestNumber; //$NON-NLS-1$
+			}
+			while ((line = input.readLine()) != null) {
+				if (line.indexOf(TRACE_USED_IN_TEST_CASE_TAG) != -1) {
+					if (line.indexOf(currentTestCaseTag) != -1) {
+						if (line.startsWith(LINE_COMMENT_TAG)) {
+							line = line.substring(LINE_COMMENT_TAG.length());
+						}
+					} else {
+						if (!line.startsWith(LINE_COMMENT_TAG)) {
+							line = LINE_COMMENT_TAG + line;
+						}
+					}
+				}
+				modifiedContents.append(line);
+				modifiedContents.append(lineSeparator);
+			}
+			input.close();
+			Writer sourceFileWriter = new BufferedWriter(new FileWriter(
+					sourceFileNameWithFullPath));
+			sourceFileWriter.write(modifiedContents.toString());
+			sourceFileWriter.close();
+
+			if (testCaseNumber == 8 || testCaseNumber == 9) {
+				String fileContent = "#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt." + lineSeparator; //$NON-NLS-1$
+
+				if (testCaseNumber == 8) {
+					fileContent += "[GROUP]TRACE_FLOW=0x7" + lineSeparator //$NON-NLS-1$
+							+ "[TRACE]TRACE_FLOW[0x7]_TRACE1=0x1"; //$NON-NLS-1$
+				} else if (testCaseNumber == 9) {
+					fileContent += "[GROUP]MY_GROUP=0x70" + lineSeparator //$NON-NLS-1$
+							+ "[TRACE]MY_GROUP [0x70]_TRACE1=0x1"; //$NON-NLS-1$
+				}
+				Writer fixedIDDefinitionsFileWriter = new BufferedWriter(
+						new FileWriter(fixedIdDefinitionsFileNameWithFullPath));
+				fixedIDDefinitionsFileWriter.write(fileContent);
+				fixedIDDefinitionsFileWriter.close();
+			}
+
+		} catch (Exception e) {
+			System.err.println(ERROR_TEXT_PREFIX + e.getMessage());
+			fail();
+		}
+	}
+
+	/**
+	 * Run TraceCompiler
+	 */
+	private InputStream runTraceCompiler() {
+		System.out.println("Run TraceCompiler"); //$NON-NLS-1$
+		InputStream inp = null;
+		pb.directory(compilerPath);
+		pb.redirectErrorStream(true);
+		// start the compiler
+		try {
+			Process p = pb.start();
+			p.waitFor();
+			inp = p.getInputStream();
+		} catch (Exception e) {// Catch exception if any
+			System.err.println(ERROR_TEXT_PREFIX + e.getMessage());
+			fail();
+		}
+
+		return inp;
+	}
+
+	/**
+	 * Verify TraceCompiler output
+	 * 
+	 * @param traceCompilerOutput
+	 *            TraceCompiler output
+	 */
+	private void verifyTraceCompilerOutput(int testCaseNumber,
+			int subTestNumber, InputStream traceCompilerOutput) {
+		System.out.println("Verify TraceCompiler output"); //$NON-NLS-1$
+
+		String refesenceFileName = REFERENCE_TC_OUTPUT_NAME_PREFIX
+				+ testCaseNumber;
+		if (subTestNumber != 0) {
+			refesenceFileName = refesenceFileName + "_" + subTestNumber; //$NON-NLS-1$
+		}
+		refesenceFileName = refesenceFileName + TXT_EXTENSION;
+
+		try {
+			FileInputStream fstreamExpected = new FileInputStream(
+					fixedIdDefinitionsTestAppPath + DATA_DIRECTORY
+							+ File.separator + refesenceFileName);
+			compareExpectedAndActual(fstreamExpected, traceCompilerOutput);
+		} catch (FileNotFoundException e) {
+			System.err.println(ERROR_TEXT_PREFIX + e.getMessage());
+			fail();
+		}
+	}
+
+	/**
+	 * Verify test result
+	 * 
+	 * @param testCaseNumber
+	 *            test case number
+	 */
+	private void verifyTestResults(int testCaseNumber, int subTestNumber) {
+		System.out.println("Verify test result"); //$NON-NLS-1$
+		String refesenceFileName = REFERENCE_FID_FILE_NAME_PREFIX
+				+ testCaseNumber;
+
+		if (subTestNumber != 0) {
+			refesenceFileName = refesenceFileName + "_" + subTestNumber; //$NON-NLS-1$
+		}
+
+		refesenceFileName = refesenceFileName + TXT_EXTENSION;
+		try {
+			FileInputStream fstreamExpected = new FileInputStream(
+					fixedIdDefinitionsTestAppPath + DATA_DIRECTORY
+							+ File.separator + refesenceFileName);
+			FileInputStream fstreamActual = new FileInputStream(
+					fixedIdDefinitionsFileNameWithFullPath);
+			compareExpectedAndActual(fstreamExpected, fstreamActual);
+		} catch (FileNotFoundException e) {
+			System.err.println(ERROR_TEXT_PREFIX + e.getMessage());
+			fail();
+		}
+	}
+
+	/**
+	 * Compare expected and actual input streams
+	 * 
+	 * @param streamExpected
+	 *            Expected input stream
+	 * @param streamActual
+	 *            Actual input stream
+	 */
+	private void compareExpectedAndActual(InputStream streamExpected,
+			InputStream streamActual) {
+		System.out.println("Compare expected and actual input streams"); //$NON-NLS-1$
+		try {
+			// Get the objects of DataInputStream
+			DataInputStream inExpected = new DataInputStream(streamExpected);
+			DataInputStream inActual = new DataInputStream(streamActual);
+			BufferedReader brExpected = new BufferedReader(
+					new InputStreamReader(inExpected));
+			BufferedReader brActual = new BufferedReader(new InputStreamReader(
+					inActual));
+
+			String strLineExpected;
+			String strLineActual;
+			int i = 1;
+			// compare the expected and actual input streams
+			while (((strLineExpected = brExpected.readLine()) != null)
+					&& (((strLineActual = brActual.readLine()) != null))) {
+
+				// Skip EMMA outputs if those exists
+				if (strLineActual.trim().startsWith(EMMA_OUTPUT_PREFIX)) {
+						strLineActual = brActual.readLine();
+						if (strLineActual == null) {
+							break;
+						}
+				}
+
+				// Following check skips different TraceCompiler execution time
+				// values
+				if (strLineExpected
+						.indexOf(FIXED_ID_DEFINITIONS_TEST_APP_TOOK_NOTE_PREFIX) != -1
+						&& strLineActual
+								.indexOf(FIXED_ID_DEFINITIONS_TEST_APP_TOOK_NOTE_PREFIX) != -1) {
+					strLineActual = strLineActual.trim().substring(
+							0,
+							FIXED_ID_DEFINITIONS_TEST_APP_TOOK_NOTE_PREFIX
+									.length());
+
+				}
+				assertTrue(ERROR_TEXT_PREFIX + "Line \"" + strLineActual //$NON-NLS-1$
+						+ "\" does not match to \"" + strLineExpected + "\"", //$NON-NLS-1$ //$NON-NLS-2$
+						strLineExpected.compareTo(strLineActual) == 0);
+				i++;
+			}
+			
+			// Check that actual file does not contain any extra lines, it could be that there are some EMMA outputs and those are ok
+			while ((strLineActual = brActual.readLine()) != null) {
+				assertTrue(
+						ERROR_TEXT_PREFIX
+								+ "Actual file does contain extra lines", strLineActual.trim().startsWith(EMMA_OUTPUT_PREFIX)); //$NON-NLS-1$				
+			}
+			
+			// never entered loop therefore there actual file was empty or
+			// missing
+			assertTrue(ERROR_TEXT_PREFIX + "Actual file was empty or missing", //$NON-NLS-1$
+					i > 0);
+
+			inExpected.close();
+			inActual.close();
+		} catch (Exception e) {
+			System.err.println(ERROR_TEXT_PREFIX + e.getMessage());
+			fail();
+		}
+	}
+
+	/**
+	 * tearDown
+	 */
+	@Test
+	public void tearDown() {
+		System.out.println("Comment out all trace points in FixedIdDefinitionsTestApp"); //$NON-NLS-1$
+		modifyFixedIdDefinitionsTestApp(0, 0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/src/GroupNamesTest.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,226 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+import static org.junit.Assert.*;
+import java.io.*;
+
+import org.junit.Test;
+
+import com.nokia.tracecompiler.TraceCompilerRootException;
+import com.nokia.tracecompiler.project.*;
+
+public class GroupNamesTest { 
+
+	
+	public static void main(String args[]) {		
+	      	org.junit.runner.JUnitCore.main(GroupNamesTest.class.getName());
+	    }
+			
+	@Test
+	public void testGetGroupNameVector() {
+		
+	
+		try {
+			GroupNames.initialiseGroupName();
+		} catch (TraceCompilerRootException e) {
+			fail();
+		}
+					
+		// test group id values obtain by name
+		assertEquals("TRACE_FATAL gid check", GroupNames.getIdByName("TRACE_FATAL"), 129);
+		assertEquals("TRACE_ERROR gid check", GroupNames.getIdByName("TRACE_ERROR"), 130);
+		assertEquals("TRACE_WARNING gid check", GroupNames.getIdByName("TRACE_WARNING"), 131);
+		assertEquals("TRACE_BORDER gid check", GroupNames.getIdByName("TRACE_BORDER"), 132);	    
+		assertEquals("TRACE_API gid check", GroupNames.getIdByName("TRACE_API"), 132);
+		assertEquals("TRACE_IMPORTANT gid check", GroupNames.getIdByName("TRACE_IMPORTANT"), 133);
+		assertEquals("TRACE_NORMAL gid check", GroupNames.getIdByName("TRACE_NORMAL"), 134);
+		assertEquals("TRACE_STATE gid check", GroupNames.getIdByName("TRACE_STATE"), 135);
+		assertEquals("TRACE_INTERNALS gid check", GroupNames.getIdByName("TRACE_INTERNALS"), 136);
+		assertEquals("TRACE_DETAILED", GroupNames.getIdByName("TRACE_DETAILED"), 136);
+		assertEquals("TRACE_DUMP gid check", GroupNames.getIdByName("TRACE_DUMP"), 137);
+		assertEquals("TRACE_DEBUG gid check", GroupNames.getIdByName("TRACE_DEBUG"), 137);
+		assertEquals("TRACE_FLOW gid check", GroupNames.getIdByName("TRACE_FLOW"), 138);
+		assertEquals("TRACE_PERFORMANCE gid check", GroupNames.getIdByName("TRACE_PERFORMANCE"), 139);
+		assertEquals("TRACE_ADHOC gid check", GroupNames.getIdByName("TRACE_ADHOC"), 140);
+		assertEquals("TRACE_EXTENSION gid check", GroupNames.getIdByName("TRACE_EXTENSION"), 141);
+
+		// test GID strings obtained by id
+//		assertEquals("TRACE_FATAL string check", GroupNames.getNameById(129), "TRACE_FATAL");
+//		assertEquals("TRACE_ERROR string check", GroupNames.getNameById(130), "TRACE_ERROR");
+//		assertEquals("TRACE_WARNING string check", GroupNames.getNameById(131), "TRACE_WARNING");
+//		assertEquals("TRACE_BORDER string check", GroupNames.getNameById(132), "TRACE_BORDER");	    
+//		assertEquals("TRACE_IMPORTANT string check", GroupNames.getNameById(133), "TRACE_IMPORTANT");
+//		assertEquals("TRACE_NORMAL string check", GroupNames.getNameById(134), "TRACE_NORMAL");
+//		assertEquals("TRACE_STATE string check", GroupNames.getNameById(135), "TRACE_STATE");
+//		assertEquals("TRACE_INTERNALS string check", GroupNames.getNameById(136), "TRACE_INTERNALS");
+//		assertEquals("TRACE_DUMP string check", GroupNames.getNameById(137), "TRACE_DUMP");
+//		assertEquals("TRACE_FLOW string check", GroupNames.getNameById(138), "TRACE_FLOW");
+//		assertEquals("TRACE_PERFORMANCE string check", GroupNames.getNameById(139), "TRACE_PERFORMANCE");
+//		assertEquals("TRACE_ADHOC string check", GroupNames.getNameById(140), "TRACE_ADHOC");
+//		assertEquals("TRACE_EXTENSION string check", GroupNames.getNameById(141), "TRACE_EXTENSION");	
+//		assertEquals("TRACE_TESTING1 string check", GroupNames.getNameById(254), "TRACE_TESTING1");
+//		assertEquals("TRACE_TESTING2 string check", GroupNames.getNameById(255), "TRACE_TESTING2");	
+	}
+	
+	
+	@Test
+	public void testUserDefinedRange(){
+		// test that the user defined range starts at the expected value
+		assertEquals("user defined range check", GroupNames.USER_GROUP_ID_FIRST, 222);		
+		assertEquals("user defined range check", GroupNames.USER_GROUP_ID_LAST, 253);
+			
+	}
+	
+	@Test
+	public void testModifiedOstHeaderFile(){
+		// copy a modfified file to epoc32\platform\include, rename ost_types.h, run tests, and then replace original ost_types
+	    
+		String e32 = System.getenv("EPOCROOT");
+		if(e32 == null || (e32.length()==0)){
+			fail();
+		}
+		
+		// need to check that e32 ends in a backslash
+		if(!e32.endsWith(File.separator)){ 
+			e32 += File.separator; 
+		}
+		
+		e32 = e32 + "epoc32"+File.separator+"include"+File.separator+"platform"+File.separator;
+		
+		System.out.println(e32);
+		
+		System.setProperty("user.dir", e32);
+		
+		String curDir = System.getProperty("user.dir");
+		System.out.println(curDir);
+		
+		// File (or directory) with old name
+	    File file = new File(e32 + "opensystemtrace_types.h");
+	    
+	    // File (or directory) with new name
+	    File file2 = new File(e32 + "CBR_opensystemtrace_types.h");
+	    
+	    // File (or directory) with new name
+	    File file3 = new File(e32 + "test_opensystemtrace_types.h");
+	    
+	    // Rename file (or directory)
+	    boolean success = file.renameTo(file2);
+	    if (!success) {
+	        // File was not successfully renamed
+	    	fail();
+	    }
+	    
+	    // Rename file (or directory)
+	    success = file3.renameTo(file);
+	    if (!success) {
+	        // File was not successfully renamed
+	    	fail();
+	    }
+	    
+		try {
+			GroupNames.initialiseGroupName();
+		} catch (TraceCompilerRootException e) {
+			fail();
+		}
+		
+		// test group id values obtain by name
+		assertEquals("TRACE_FATAL gid check", GroupNames.getIdByName("TRACE_FATAL"), 149);
+		assertEquals("TRACE_ERROR gid check", GroupNames.getIdByName("TRACE_ERROR"), 150);
+		assertEquals("TRACE_WARNING gid check", GroupNames.getIdByName("TRACE_WARNING"), 151);
+		assertEquals("TRACE_BORDER gid check", GroupNames.getIdByName("TRACE_BORDER"), 152);	    
+		assertEquals("TRACE_API gid check", GroupNames.getIdByName("TRACE_API"), 152);
+		assertEquals("TRACE_IMPORTANT gid check", GroupNames.getIdByName("TRACE_IMPORTANT"), 153);
+		assertEquals("TRACE_NORMAL gid check", GroupNames.getIdByName("TRACE_NORMAL"), 154);
+		assertEquals("TRACE_STATE gid check", GroupNames.getIdByName("TRACE_STATE"), 155);
+		assertEquals("TRACE_INTERNALS gid check", GroupNames.getIdByName("TRACE_INTERNALS"), 156);
+		assertEquals("TRACE_DETAILED", GroupNames.getIdByName("TRACE_DETAILED"), 156);
+		assertEquals("TRACE_DUMP gid check", GroupNames.getIdByName("TRACE_DUMP"), 157);
+		assertEquals("TRACE_DEBUG gid check", GroupNames.getIdByName("TRACE_DEBUG"), 157);
+		assertEquals("TRACE_FLOW gid check", GroupNames.getIdByName("TRACE_FLOW"), 158);
+		assertEquals("TRACE_PERFORMANCE gid check", GroupNames.getIdByName("TRACE_PERFORMANCE"), 159);
+		assertEquals("TRACE_ADHOC gid check", GroupNames.getIdByName("TRACE_ADHOC"), 160);
+		assertEquals("TRACE_EXTENSION gid check", GroupNames.getIdByName("TRACE_EXTENSION"), 161);
+
+		// test GID strings obtained by id
+//		assertEquals("TRACE_FATAL string check", GroupNames.getNameById(149), "TRACE_FATAL");
+//		assertEquals("TRACE_ERROR string check", GroupNames.getNameById(150), "TRACE_ERROR");
+//		assertEquals("TRACE_WARNING string check", GroupNames.getNameById(151), "TRACE_WARNING");
+//		assertEquals("TRACE_BORDER string check", GroupNames.getNameById(152), "TRACE_BORDER");	    
+//		assertEquals("TRACE_IMPORTANT string check", GroupNames.getNameById(153), "TRACE_IMPORTANT");
+//		assertEquals("TRACE_NORMAL string check", GroupNames.getNameById(154), "TRACE_NORMAL");
+//		assertEquals("TRACE_STATE string check", GroupNames.getNameById(155), "TRACE_STATE");
+//		assertEquals("TRACE_INTERNALS string check", GroupNames.getNameById(156), "TRACE_INTERNALS");
+//		assertEquals("TRACE_DUMP string check", GroupNames.getNameById(157), "TRACE_DUMP");
+//		assertEquals("TRACE_FLOW string check", GroupNames.getNameById(158), "TRACE_FLOW");
+//		assertEquals("TRACE_PERFORMANCE string check", GroupNames.getNameById(159), "TRACE_PERFORMANCE");
+//		assertEquals("TRACE_ADHOC string check", GroupNames.getNameById(160), "TRACE_ADHOC");
+//		assertEquals("TRACE_EXTENSION string check", GroupNames.getNameById(161), "TRACE_EXTENSION");
+	} 
+   
+	@Test
+    public void tearDown() {
+        // release objects under test here, if necessary
+		
+		String e32 = System.getenv("EPOCROOT");
+		if(e32 == null || (e32.length()==0)){
+			fail();
+		}
+		
+		// need to check that e32 ends in a backslash
+		if(!e32.endsWith(File.separator)){ 
+			e32 += File.separator; 
+		}
+		
+		e32 = e32 + "epoc32"+File.separator+"include"+File.separator+"platform"+File.separator;
+		
+		System.out.println(e32);
+		
+		System.setProperty("user.dir", e32);
+		
+		String curDir = System.getProperty("user.dir");
+		System.out.println(curDir);
+		
+		// File (or directory) with old name
+	    File file = new File(e32 + "opensystemtrace_types.h");
+	    
+	    // File (or directory) with new name
+	    File file2 = new File(e32 + "CBR_opensystemtrace_types.h");
+	    
+	    	    
+	    boolean i = file.exists();
+	    System.out.println(i);
+	    
+	    // Rename file (or directory)
+	    boolean success = (file.delete());
+	    if (!success) {
+	        fail();
+	    }
+	    
+	    success = file2.renameTo(file);
+	    if (!success) {
+	        // File was not successfully renamed
+	    	fail();
+	    }
+	    
+
+		
+		// File (or directory) with old name
+	    
+	    
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/src/MacroWrappersTest.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,239 @@
+/*
+* 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:
+*
+* JUnit tests for OST MacroWrappers
+*
+*/
+
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import org.junit.Assert;
+import org.junit.Test;
+import com.nokia.tracecompiler.source.*;
+import com.nokia.tracecompiler.document.*;
+
+public class MacroWrappersTest {
+
+	public static void main(String[] args) {
+		org.junit.runner.JUnitCore.main(MacroWrappersTest.class.getName());
+	}
+	
+	@Test
+	public void testMacroWrappers(){
+		
+		// this string should parse down to the following members in list	
+		final String REFERENCE_STR = 
+			"TRACE_DEBUG_ONLY ( mystuff,…, OstTraceExt3( TRACE_DEBUG,DUP7__CONSTRUCTL,\"::ConstructL;x=%d;y=%d;z=%d\",x,y,z ) );";
+		FileDocumentMonitor monitor = new FileDocumentMonitor();		
+		SourceDocumentFactory factory = monitor.getFactory();
+
+		// construct the reference parameter array
+		ArrayList<String> expectedTokens = new ArrayList<String>();
+		expectedTokens.add("TRACE_DEBUG");
+		expectedTokens.add("DUP7__CONSTRUCTL");
+		expectedTokens.add("\"::ConstructL;x=%d;y=%d;z=%d\"");
+		expectedTokens.add("x");
+		expectedTokens.add("y");
+		expectedTokens.add("z");
+
+		// construct the trace string from reference parameters
+		final String TRACE_STR = "OstTraceExt3( "+ expectedTokens.get(0) + 
+								 "," + expectedTokens.get(1) + 
+								 "," + expectedTokens.get(2) +
+								 "," + expectedTokens.get(3) + 
+								 "," + expectedTokens.get(4) +
+								 "," + expectedTokens.get(5) + " )";
+				
+		// first test the parser on an unwrapped string
+		SourceParser sourceParser = new SourceParser(factory, factory.createDocument(TRACE_STR));
+		ArrayList<String> actualTokens = new ArrayList<String>();
+		// parse string
+		try{
+			sourceParser.tokenizeParameters(0, actualTokens, true);			
+		}catch(SourceParserException e){
+			Assert.fail(e.getMessage());
+		}
+						
+		checkContents(actualTokens, expectedTokens); 
+						
+		// Create the wrapped OstTrace...  	
+		final String WRAPPED_STR = "TRACE_DEBUG_ONLY ( mystuff,…, " + TRACE_STR + " );";
+		
+		// do a quick check to see that the reference string matches the string generated from list
+		// we could use java.util.StringTokenizer to generate the expected list, 
+		// but this is test code for tracecompiler after all
+		assertTrue(REFERENCE_STR.compareTo(WRAPPED_STR) == 0 );
+
+		sourceParser = new SourceParser(factory, factory.createDocument(WRAPPED_STR));
+		
+
+		actualTokens.clear();
+		// this string should parse down to the following members in list
+		// [0]	"mystuff"	
+		// [1]	"…"	
+		// [2]	"OstTraceExt3( TRACE_DEBUG, DUP7__CONSTRUCTL, "::ConstructL;x=%d;y=%d;z=%d",x,y,z )"	
+		try{
+			sourceParser.tokenizeParameters(0, actualTokens, true);			
+		}catch(SourceParserException e){
+			Assert.fail(e.getMessage());
+		}
+
+		assertTrue(actualTokens.size() == 3);
+		assertTrue(((String)actualTokens.get(0)).compareTo("mystuff") == 0);
+		assertTrue(((String)actualTokens.get(1)).compareTo("…") == 0);
+		
+		// now check the extracted OstTrace part
+		String ostStr = (String)actualTokens.get(2);
+		assertTrue(ostStr.compareTo(TRACE_STR) == 0);
+		
+		sourceParser = new SourceParser(factory, factory.createDocument(ostStr));
+		actualTokens.clear();
+
+		try{
+			sourceParser.tokenizeParameters(0, actualTokens, true);			
+		}catch(SourceParserException e){
+			Assert.fail(e.getMessage());
+		}
+						
+		checkContents(actualTokens, expectedTokens); 
+	}
+	
+	
+	@Test
+	public void testMultipleMacroWrappers(){
+		
+		// testing parsing of macro in this format
+		//TRACE_DEBUG_ONLY (OstTrace0( TRACE_DETAILED, DUP5__CONSTRUCTL, "::ConstructL" )
+		// , OstTraceExt3( TRACE_BORDER, DUP99__CONSTRUCTL, "::ConstructL;x=%x;y=%x;z=%x",x,y, (x+y) ));
+		
+		final String REFERENCE_STR = 
+			"TRACE_DEBUG_ONLY (OstTrace0( TRACE_DETAILED,DUP5__CONSTRUCTL ),OstTraceExt3( TRACE_BORDER,DUP99__CONSTRUCTL,\"::ConstructL;x=%x;y=%x;z=%x\",x,y,(x+y) ));";
+
+		FileDocumentMonitor monitor = new FileDocumentMonitor();		
+		SourceDocumentFactory factory = monitor.getFactory();
+
+		
+		// construct the reference parameter array
+		ArrayList<String> expectedTokens1 = new ArrayList<String>();
+		expectedTokens1.add("TRACE_DETAILED");
+		expectedTokens1.add("DUP5__CONSTRUCTL");
+		
+		
+		ArrayList<String> expectedTokens2 = new ArrayList<String>();
+		expectedTokens2.add("TRACE_BORDER");
+		expectedTokens2.add("DUP99__CONSTRUCTL");
+		expectedTokens2.add("\"::ConstructL;x=%x;y=%x;z=%x\"");
+		expectedTokens2.add("x");
+		expectedTokens2.add("y");
+		expectedTokens2.add("(x+y)");
+
+		// construct the trace strings from reference parameters
+		final String TRACE_STR1 = "OstTrace0( "+ expectedTokens1.get(0) + 
+								 "," + expectedTokens1.get(1) + " )";
+
+		final String TRACE_STR2 = "OstTraceExt3( "+ expectedTokens2.get(0) + 
+								  "," + expectedTokens2.get(1) + 
+								  "," + expectedTokens2.get(2) +
+								  "," + expectedTokens2.get(3) + 
+								  "," + expectedTokens2.get(4) +
+								  "," + expectedTokens2.get(5) + " )";
+
+		// check it works with TRACE_STR1
+		SourceParser sourceParser = new SourceParser(factory, factory.createDocument(TRACE_STR1));
+		ArrayList<String> actualTokens = new ArrayList<String>();
+		// parse string
+		try{
+			sourceParser.tokenizeParameters(0, actualTokens, true);			
+		}catch(SourceParserException e){
+			Assert.fail(e.getMessage());
+		}
+						
+		checkContents(actualTokens, expectedTokens1); 
+
+		// check it works with TRACE_STR2
+		sourceParser = new SourceParser(factory, factory.createDocument(TRACE_STR2));
+		actualTokens.clear();
+		
+		// parse string
+		try{
+			sourceParser.tokenizeParameters(0, actualTokens, true);			
+		}catch(SourceParserException e){
+			Assert.fail(e.getMessage());
+		}
+						
+		checkContents(actualTokens, expectedTokens2); 
+
+		// create the composite string
+		String TRACE_STR3 = "TRACE_DEBUG_ONLY (" + TRACE_STR1 + "," + TRACE_STR2 + ");";
+
+		// do a quick check to see that the reference string matches the string generated from list
+		// we could use java.util.StringTokenizer to generate the expected list, 
+		// but this is test code for tracecompiler after all
+		assertTrue(REFERENCE_STR.compareTo(TRACE_STR3) == 0);
+		
+		sourceParser = new SourceParser(factory, factory.createDocument(TRACE_STR3));
+		actualTokens.clear();
+
+		// this string should parse down to the following members in list
+		// [0]	"OstTraceExt0( TRACE_DETAILED,DUP5__CONSTRUCTL )" (id=77)	
+		// [1]	"OstTraceExt3( TRACE_BORDER,DUP99__CONSTRUCTL,"::ConstructL;x=%d;y=%d;z=%d",x,y,z )" (id=78)	
+		try{
+			sourceParser.tokenizeParameters(0, actualTokens, true);			
+		}catch(SourceParserException e){
+			Assert.fail(e.getMessage());
+		}
+		
+		assertTrue(actualTokens.size() == 2);
+		final String OST_STR1 = actualTokens.get(0);
+		assertTrue(OST_STR1.compareTo(TRACE_STR1) == 0);
+		final String OST_STR2 = actualTokens.get(1);
+		assertTrue(OST_STR2.compareTo(TRACE_STR2) == 0);
+		
+		
+		// check parsing of first OST macro
+		sourceParser = new SourceParser(factory, factory.createDocument(OST_STR1));
+		actualTokens.clear();
+		try{
+			sourceParser.tokenizeParameters(0, actualTokens, true);			
+		}catch(SourceParserException e){
+			Assert.fail(e.getMessage());
+		}
+
+		checkContents(actualTokens, expectedTokens1);
+		
+
+		// check parsing of second OST macro
+		sourceParser = new SourceParser(factory, factory.createDocument(OST_STR2));
+		actualTokens.clear();
+		try{
+			sourceParser.tokenizeParameters(0, actualTokens, true);			
+		}catch(SourceParserException e){
+			Assert.fail(e.getMessage());
+		}
+
+		checkContents(actualTokens, expectedTokens2);
+		
+	}
+
+	
+	private static void checkContents(final ArrayList<String> ACTUAL, final ArrayList<String> EXPECTED ){
+		assertTrue(ACTUAL.size() == EXPECTED.size());
+		for(int i=0;i < ACTUAL.size();i++){
+			assertTrue( ACTUAL.get(i).compareTo(EXPECTED.get(i)) == 0);			
+		}		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/src/MultipleMmpTest.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,754 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+import static org.junit.Assert.fail;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+
+
+public class MultipleMmpTest {
+	
+	public static void main(String args[]) {		
+	      	org.junit.runner.JUnitCore.main(MultipleMmpTest.class.getName());
+	    }
+	
+	/****************************************************UTILITY FUNCTIONS FOR TESTS************************************************************/
+	
+	private static String epocroot = null; 
+	private static String projectdir = "testdata\\MultipleMmpTestCases\\"; //$NON-NLS-1$
+	private static String dictpath= "epoc32\\ost_dictionaries\\"; //$NON-NLS-1$
+	private static String autogenpath= "epoc32\\include\\platform\\symbiantraces\\autogen\\"; //$NON-NLS-1$
+	private static Pattern versionPattern = Pattern.compile("^.*(\\d+\\.\\d+\\.\\d+).*$"); //$NON-NLS-1$
+	private static Pattern oldversionPat = Pattern.compile("^(1\\..*)|(2\\.1.*)"); //$NON-NLS-1$
+	//old TC version should be up to 2.12.5 as new functionality was submitted to 2.12.6 (we hope)
+	private static Pattern sbsoldversionPat = Pattern.compile("^(1\\..*)|(2\\.[01]\\..*)|(2\\.1[0-2]\\.[0-3].*)"); //$NON-NLS-1$
+	private static String TCversion = ""; //$NON-NLS-1$
+	private static String SBSversion = ""; //$NON-NLS-1$
+	private static File compilerpath;
+	private static boolean oldTC = false;
+	private static boolean oldBuilder = false; 
+	private static HashMap<String, List<File>> headers = new HashMap<String, List<File>>();
+	private static HashMap<String, List<File>> dicts = new HashMap<String, List<File>>();
+	private static HashMap<String, List<File>> sources = new HashMap<String, List<File>>();
+	private static ProcessBuilder sbs_build = new ProcessBuilder("sbs.bat","-k","-c","winscw_udeb.tracecompiler");
+	private static ProcessBuilder sbs_reallyclean = new ProcessBuilder("sbs.bat","-k","-c","winscw_udeb.tracecompiler", "reallyclean");
+	
+
+	@BeforeClass
+	static public void setEnvVariables() {
+		epocroot = System.getenv("EPOCROOT"); //$NON-NLS-1$
+		if(epocroot == null || (epocroot.length()==0)){
+			fail();
+		}
+		
+		// need to check that the path ends in a backslash
+		if(!epocroot.endsWith("\\")){ 
+			epocroot += "\\"; 
+		}
+
+		compilerpath = new File (epocroot + "epoc32" + File.separator + "tools" + File.separator +"tracecompiler" + File.separator); //default value to remove warnings. //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+
+		ProcessBuilder tc = new ProcessBuilder("java", "-classpath", compilerpath.getPath(), //$NON-NLS-1$//$NON-NLS-2$
+				"com.nokia.tracecompiler.TraceCompiler", "-v"); //$NON-NLS-1$//$NON-NLS-2$
+		System.out.println("compilerPath= " + compilerpath); //$NON-NLS-1$
+		tc.directory(compilerpath);
+		tc.redirectErrorStream(true);
+		try {
+		Process p = tc.start();
+		p.waitFor();	
+
+		
+		String str = readProcessOutput(p);
+		System.out.println("TC version = " + str); //$NON-NLS-1$
+		Matcher m = versionPattern.matcher(str.trim());
+		if (m.matches()) {
+			TCversion = m.group(1);
+			System.out.println("TC Version = " + TCversion); //$NON-NLS-1$
+		}
+		
+		m = oldversionPat.matcher(TCversion);
+		if (m.matches()){
+			oldTC=true;
+		}
+
+		System.out.println("TC version = " + TCversion); //$NON-NLS-1$ 
+		System.out.println("OLD TC version = " + oldTC); //$NON-NLS-1$
+
+		ProcessBuilder sbs = new ProcessBuilder("sbs.bat","-v"); //$NON-NLS-1$ //$NON-NLS-2$
+		sbs.directory(compilerpath);
+		sbs.redirectErrorStream(true);
+			
+		//start the compiler
+		p = sbs.start();
+		p.waitFor();
+			
+		InputStream inp = p.getInputStream();
+			
+	        str = ""; //$NON-NLS-1$
+	        int c;
+	        //read the output from the compiler into the input stream
+	        while ((c = inp.read()) != -1) {
+	           	 str= str +((char)c);
+	        }
+
+		System.out.println("SBS version = " + str); //$NON-NLS-1$
+		m = versionPattern.matcher(str.trim());
+		if (m.matches()) {
+			SBSversion = m.group(1);
+		}
+		
+		m = sbsoldversionPat.matcher(SBSversion);
+		if (m.matches()){
+			oldBuilder=true;
+		}
+		
+		} catch (Exception e) {// Catch exception if any
+			System.err.println(e.getMessage());
+		}
+	}
+	
+	
+	public void createListHeadersDicts(String builder)
+	{
+		//The whole logic of what is expected is built here whether we build with sbs 
+		//new TC or old, The structure is re-built for each case.
+		
+		
+		Matcher m = sbsoldversionPat.matcher(SBSversion);
+		if (m.matches()){
+			oldBuilder=true;
+		} else {
+			oldBuilder=false;
+		}
+		
+		
+		System.out.println("OLD Builder :" + builder + ": = " + oldBuilder); //$NON-NLS-1$
+		
+		File tracesHeader1;
+		File tracesHeader2;
+		File tracesHeader3;
+		File tracesHeader4;
+		File source1;
+		File source2;
+		File source3;
+		File source4;
+		File ostTraceDefinitions;
+		File fixedidDefinitions;
+		File ostDict1;
+		File ostDict2;
+		File autogenDict1;
+		File autogenDict2;
+		String loc = "traces\\"; //$NON-NLS-1$
+		
+		source1 = new File (epocroot+projectdir+"mmp_traces\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source2 = new File (epocroot+projectdir+"mmp_traces\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		source3 = new File (epocroot+projectdir+"mmp_traces\\src\\MultipleMmpApp2.cpp"); //$NON-NLS-1$
+		source4 = new File (epocroot+projectdir+"mmp_traces\\src\\ExtraCppFile2.cpp"); //$NON-NLS-1$
+		sources.put("_traces", Arrays.asList(source1, source2, source3, source4));
+		
+		tracesHeader1 = new File (epocroot+projectdir+"mmp_traces\\traces\\MultipleMmpApp1Traces.h"); //$NON-NLS-1$
+		tracesHeader2 = new File (epocroot+projectdir+"mmp_traces\\traces\\ExtraCppFile1Traces.h"); //$NON-NLS-1$
+		tracesHeader3 = new File (epocroot+projectdir+"mmp_traces\\traces\\MultipleMmpApp2Traces.h"); //$NON-NLS-1$
+		tracesHeader4 = new File (epocroot+projectdir+"mmp_traces\\traces\\ExtraCppFile2Traces.h"); //$NON-NLS-1$
+		
+		ostTraceDefinitions = new File(epocroot+projectdir+"mmp_traces\\traces\\OstTraceDefinitions.h"); //$NON-NLS-1$
+		fixedidDefinitions = new File(epocroot+projectdir+"mmp_traces\\traces\\fixed_id.definitions"); //$NON-NLS-1$)
+		headers.put("_traces", Arrays.asList(tracesHeader1,tracesHeader2,tracesHeader3,tracesHeader4,ostTraceDefinitions,fixedidDefinitions)); //$NON-NLS-1$
+		
+		ostDict1     = new File(epocroot+dictpath+"mmp_traces1_0xe8576d96_Dictionary.xml"); //$NON-NLS-1$
+		ostDict2     = new File(epocroot+dictpath+"mmp_traces2_0xe8576d95_Dictionary.xml"); //$NON-NLS-1$	
+		autogenDict1 = new File(epocroot+autogenpath+"mmp_traces1_0xe8576d96_TraceDefinitions.h"); //$NON-NLS-1$	
+		autogenDict2 = new File(epocroot+autogenpath+"mmp_traces2_0xe8576d95_TraceDefinitions.h"); //$NON-NLS-1$	
+		dicts.put("_traces", Arrays.asList(ostDict1, ostDict2, autogenDict1, autogenDict2)); //$NON-NLS-1$
+		
+		//=============================
+		
+		if (!oldBuilder && !oldTC) {
+			loc = "traces_mmp_traces_mmpname1\\"; //$NON-NLS-1$
+		}
+		tracesHeader1 = new File (epocroot+projectdir+"mmp_traces_mmpname\\"+ loc + "MultipleMmpApp1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader2 = new File (epocroot+projectdir+"mmp_traces_mmpname\\" + loc + "ExtraCppFile1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		if (!oldBuilder && !oldTC) {
+			loc = "traces_mmp_traces_mmpname2\\"; //$NON-NLS-1$
+		}
+		tracesHeader3 = new File (epocroot+projectdir+"mmp_traces_mmpname\\" + loc + "MultipleMmpApp2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader4 = new File (epocroot+projectdir+"mmp_traces_mmpname\\" + loc + "ExtraCppFile2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		ostTraceDefinitions = new File(epocroot+projectdir+"mmp_traces_mmpname\\" + loc + "OstTraceDefinitions.h"); //$NON-NLS-1$
+		fixedidDefinitions = new File(epocroot+projectdir+"mmp_traces_mmpname\\" + loc + "fixed_id.definitions"); //$NON-NLS-1$)
+
+		headers.put("_traces_mmpname", Arrays.asList(tracesHeader1,tracesHeader2,tracesHeader3,tracesHeader4,ostTraceDefinitions,fixedidDefinitions)); //$NON-NLS-1$
+		
+		source1 = new File (epocroot+projectdir+"mmp_traces_mmpname\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source2 = new File (epocroot+projectdir+"mmp_traces_mmpname\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		source3 = new File (epocroot+projectdir+"mmp_traces_mmpname\\src\\MultipleMmpApp2.cpp"); //$NON-NLS-1$
+		source4 = new File (epocroot+projectdir+"mmp_traces_mmpname\\src\\ExtraCppFile2.cpp"); //$NON-NLS-1$
+		sources.put("_traces_mmpname", Arrays.asList(source1, source2, source3, source4));
+		
+		ostDict1     = new File(epocroot+dictpath+"mmp_traces_mmpname1_0xe8576d96_Dictionary.xml"); //$NON-NLS-1$
+		ostDict2     = new File(epocroot+dictpath+"mmp_traces_mmpname2_0xe8576d95_Dictionary.xml"); //$NON-NLS-1$	
+		autogenDict1 = new File(epocroot+autogenpath+"mmp_traces_mmpname1_0xe8576d96_TraceDefinitions.h"); //$NON-NLS-1$	
+		autogenDict2 = new File(epocroot+autogenpath+"mmp_traces_mmpname2_0xe8576d95_TraceDefinitions.h"); //$NON-NLS-1$	
+		dicts.put("_traces_mmpname", Arrays.asList(ostDict1, ostDict2, autogenDict1, autogenDict2)); //$NON-NLS-1$
+
+	    //=============================
+	    
+	    loc = "traces\\"; //$NON-NLS-1$
+		if (!oldTC) {
+			loc = "traces\\target7_dll\\"; //$NON-NLS-1$
+		}
+		tracesHeader1 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\" + loc + "MultipleMmpApp1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader2 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\" + loc + "ExtraCppFile1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		if (!oldTC) {
+			loc = "traces\\target8_dll\\"; //$NON-NLS-1$
+		}
+		tracesHeader3 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\" + loc + "MultipleMmpApp2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader4 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\" + loc + "ExtraCppFile2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		ostTraceDefinitions = new File(epocroot+projectdir+"mmp_traces_slash_target_ext\\" + loc + "OstTraceDefinitions.h"); //$NON-NLS-1$
+		fixedidDefinitions = new File(epocroot+projectdir+"mmp_traces_slash_target_ext\\" + loc + "fixed_id.definitions"); //$NON-NLS-1$)
+
+		headers.put("_traces_slash_target_ext", Arrays.asList(tracesHeader1,tracesHeader2,tracesHeader3,tracesHeader4,ostTraceDefinitions,fixedidDefinitions)); //$NON-NLS-1$
+		
+		source1 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source2 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		source3 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\src\\MultipleMmpApp2.cpp"); //$NON-NLS-1$
+		source4 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\src\\ExtraCppFile2.cpp"); //$NON-NLS-1$
+		sources.put("_traces_slash_target_ext", Arrays.asList(source1, source2, source3, source4));
+
+		
+		String name1 = "";
+		String name2 = "";
+		if (oldTC) {
+			name1 = "mmp_traces_slash_target_ext1";
+			name2 = "mmp_traces_slash_target_ext2";
+		} else {
+			name1 = "target7_dll";
+			name2 = "target8_dll";
+		}
+		
+		ostDict1     = new File(epocroot+dictpath + name1 + "_0xe8576d96_Dictionary.xml"); //$NON-NLS-1$
+		ostDict2     = new File(epocroot+dictpath + name2 + "_0xe8576d95_Dictionary.xml"); //$NON-NLS-1$	
+		autogenDict1 = new File(epocroot+autogenpath + name1 + "_0xe8576d96_TraceDefinitions.h"); //$NON-NLS-1$	
+		autogenDict2 = new File(epocroot+autogenpath + name2 + "_0xe8576d95_TraceDefinitions.h"); //$NON-NLS-1$	
+		dicts.put("_traces_slash_target_ext", Arrays.asList(ostDict1, ostDict2, autogenDict1, autogenDict2)); //$NON-NLS-1$
+		
+	    //================================
+	    loc = "traces\\"; //$NON-NLS-1$
+		if (!oldTC) {
+			loc = "traces\\target9_dll\\"; //$NON-NLS-1$
+		}
+		tracesHeader1 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\" + loc + "MultipleMmpApp1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader2 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\" + loc + "ExtraCppFile1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		if (!oldTC) {
+			loc = "traces\\target10_dll\\"; //$NON-NLS-1$
+		}
+		tracesHeader3 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\" + loc + "MultipleMmpApp1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader4 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\" + loc + "ExtraCppFile1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		ostTraceDefinitions = new File(epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\" + loc + "OstTraceDefinitions.h"); //$NON-NLS-1$
+		fixedidDefinitions = new File(epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\" + loc + "fixed_id.definitions"); //$NON-NLS-1$)
+
+		headers.put("_traces_slash_target_ext_commonsource", Arrays.asList(tracesHeader1,tracesHeader2,tracesHeader3,tracesHeader4,ostTraceDefinitions,fixedidDefinitions)); //$NON-NLS-1$
+		
+		source1 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source2 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		source3 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source4 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		sources.put("_traces_slash_target_ext_commonsource", Arrays.asList(source1, source2, source3, source4));
+
+		
+		if (oldTC) {
+			name1 = "mmp_traces_slash_target_ext1_cs";
+			name2 = "mmp_traces_slash_target_ext2_cs";
+		} else {
+			name1 = "target9_dll";
+			name2 = "target10_dll";
+		}
+		ostDict1     = new File(epocroot+dictpath + name1 + "_0xe8576d96_Dictionary.xml"); //$NON-NLS-1$
+		ostDict2     = new File(epocroot+dictpath + name2 + "_0xe8576d95_Dictionary.xml"); //$NON-NLS-1$	
+		autogenDict1 = new File(epocroot+autogenpath + name1 + "_0xe8576d96_TraceDefinitions.h"); //$NON-NLS-1$	
+		autogenDict2 = new File(epocroot+autogenpath + name2 + "_0xe8576d95_TraceDefinitions.h"); //$NON-NLS-1$	
+		dicts.put("_traces_slash_target_ext_commonsource", Arrays.asList(ostDict1, ostDict2, autogenDict1, autogenDict2)); //$NON-NLS-1$
+		
+		//==================================
+		loc = "traces\\"; //$NON-NLS-1$
+		if (!oldTC && !oldBuilder) {
+			loc = "traces_target11_exe\\"; //$NON-NLS-1$
+		}
+		tracesHeader1 = new File (epocroot+projectdir+"mmp_traces_target_type\\" + loc +"MultipleMmpApp1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader2 = new File (epocroot+projectdir+"mmp_traces_target_type\\" + loc +"ExtraCppFile1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		if (!oldTC && !oldBuilder) {
+			loc = "traces_target12_exe\\"; //$NON-NLS-1$
+		}
+		tracesHeader3 = new File (epocroot+projectdir+"mmp_traces_target_type\\" + loc + "MultipleMmpApp2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader4 = new File (epocroot+projectdir+"mmp_traces_target_type\\" + loc + "ExtraCppFile2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		ostTraceDefinitions = new File(epocroot+projectdir+"mmp_traces_target_type\\" + loc + "OstTraceDefinitions.h"); //$NON-NLS-1$
+		fixedidDefinitions = new File(epocroot+projectdir+"mmp_traces_target_type\\" + loc + "fixed_id.definitions"); //$NON-NLS-1$)
+
+		headers.put("_traces_target_type", Arrays.asList(tracesHeader1,tracesHeader2,tracesHeader3,tracesHeader4,ostTraceDefinitions,fixedidDefinitions)); //$NON-NLS-1$
+		
+		
+		source1 = new File (epocroot+projectdir+"mmp_traces_target_type\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source2 = new File (epocroot+projectdir+"mmp_traces_target_type\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		source3 = new File (epocroot+projectdir+"mmp_traces_target_type\\src\\MultipleMmpApp2.cpp"); //$NON-NLS-1$
+		source4 = new File (epocroot+projectdir+"mmp_traces_target_type\\src\\ExtraCppFile2.cpp"); //$NON-NLS-1$
+		sources.put("_traces_target_type", Arrays.asList(source1, source2, source3, source4));
+
+		ostDict1     = new File(epocroot+dictpath+"target11_exe_0xe8576d96_Dictionary.xml"); //$NON-NLS-1$
+		ostDict2     = new File(epocroot+dictpath+"target12_exe_0xe8576d95_Dictionary.xml"); //$NON-NLS-1$	
+		autogenDict1 = new File(epocroot+autogenpath+"target11_exe_0xe8576d96_TraceDefinitions.h"); //$NON-NLS-1$	
+		autogenDict2 = new File(epocroot+autogenpath+"target12_exe_0xe8576d95_TraceDefinitions.h"); //$NON-NLS-1$	
+		dicts.put("_traces_target_type", Arrays.asList(ostDict1, ostDict2, autogenDict1, autogenDict2)); //$NON-NLS-1$	
+		
+		//==================================
+		
+		loc = "traces\\"; //$NON-NLS-1$
+		if (!oldTC && !oldBuilder) {
+			loc = "traces\\target3_dll\\"; //$NON-NLS-1$
+		}
+		tracesHeader1 = new File (epocroot+projectdir+"mmp_traces_mixed\\" + loc + "MultipleMmpApp1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader2 = new File (epocroot+projectdir+"mmp_traces_mixed\\" + loc + "ExtraCppFile1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		if (!oldTC && !oldBuilder) {
+			loc = "traces_target4_kext\\"; //$NON-NLS-1$ 
+		}
+		tracesHeader3 = new File (epocroot+projectdir+"mmp_traces_mixed\\" + loc + "MultipleMmpApp2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader4 = new File (epocroot+projectdir+"mmp_traces_mixed\\" + loc + "ExtraCppFile2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$		
+		ostTraceDefinitions = new File(epocroot+projectdir+"mmp_traces_mixed\\" + loc + "OstTraceDefinitions.h"); //$NON-NLS-1$
+		fixedidDefinitions = new File(epocroot+projectdir+"mmp_traces_mixed\\" + loc + "fixed_id.definitions"); //$NON-NLS-1$)
+
+		headers.put("_traces_mixed", Arrays.asList(tracesHeader1,tracesHeader2,tracesHeader3,tracesHeader4,ostTraceDefinitions,fixedidDefinitions)); //$NON-NLS-1$		
+		
+		source1 = new File (epocroot+projectdir+"mmp_traces_mixed\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source2 = new File (epocroot+projectdir+"mmp_traces_mixed\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		source3 = new File (epocroot+projectdir+"mmp_traces_mixed\\src\\MultipleMmpApp2.cpp"); //$NON-NLS-1$
+		source4 = new File (epocroot+projectdir+"mmp_traces_mixed\\src\\ExtraCppFile2.cpp"); //$NON-NLS-1$
+		sources.put("_traces_mixed", Arrays.asList(source1, source2, source3, source4));
+
+		String suffix = ""; //$NON-NLS-1$
+		String name = "";
+		if (!oldBuilder) {
+			suffix = "_dll"; //$NON-NLS-1$
+			name = "target3";
+		} else {
+		        name = "mmp_traces_mixed1";
+		}
+
+		ostDict1     = new File(epocroot+dictpath+name + suffix + "_0xe8576d96_Dictionary.xml"); //$NON-NLS-1$
+		autogenDict1 = new File(epocroot+autogenpath+name + suffix + "_0xe8576d96_TraceDefinitions.h"); //$NON-NLS-1$
+		if (!oldBuilder) {
+			suffix = "_kext"; //$NON-NLS-1$
+			name = "target4";
+		} else {
+			name = "mmp_traces_mixed2";
+		}
+		ostDict2     = new File(epocroot+dictpath+name + suffix + "_0xe8576d95_Dictionary.xml"); //$NON-NLS-1$
+		autogenDict2 = new File(epocroot+autogenpath+name + suffix + "_0xe8576d95_TraceDefinitions.h"); //$NON-NLS-1$	
+		dicts.put("_traces_mixed", Arrays.asList(ostDict1, ostDict2, autogenDict1, autogenDict2)); //$NON-NLS-1$	
+	}
+	
+	
+	/**
+	 * This function invokes raptor on the desired test c++ project
+	 * 
+	 * @param path String specifying the path the compiler needs
+	 * 				  to run from
+	 */
+	public void InvokeCompiler(String path, String builder) {
+		System.out.println ("InvokeCompiler() for : " + builder);
+		
+		List<File> headersList;
+		List<File> dictsList;
+		try{
+			
+			//set up the directory from which the process will be called
+			if (path.compareTo("_traces")==0){ //$NON-NLS-1$
+				headersList = headers.get("_traces"); //$NON-NLS-1$
+				System.out.println("deleting file " + headersList.toString()); //$NON-NLS-1$
+				for (File header : headersList) {
+					if (header.exists()) header.delete();
+				}
+				
+				dictsList = dicts.get("_traces"); //$NON-NLS-1$
+				System.out.println("deleting file " + dictsList.toString()); //$NON-NLS-1$
+				for (File dict : dictsList) {
+					if (dict.exists()) dict.delete();
+				}
+				compilerpath = new File (epocroot+projectdir+"mmp_traces\\group\\"); //$NON-NLS-1$
+			}
+			else if (path.compareTo("_traces_mmpname")==0){ //$NON-NLS-1$
+				headersList = headers.get("_traces_mmpname"); //$NON-NLS-1$
+				System.out.println("deleting file " + headersList.toString()); //$NON-NLS-1$
+				for (File header : headersList) {
+					if (header.exists()) {
+						header.delete();
+					}
+				}
+				
+				dictsList = dicts.get("_traces_mmpname");
+				System.out.println("deleting file " + dictsList.toString());
+				for (File dict : dictsList) {
+					if (dict.exists()) {
+						dict.delete();
+					}
+				}
+				compilerpath = new File (epocroot+projectdir+"mmp_traces_mmpname\\group\\");
+			}
+			else if (path.compareTo("_traces_slash_target_ext")==0){
+				headersList = headers.get("_traces_slash_target_ext");
+				System.out.println("deleting file " + headersList.toString());
+				for (File header : headersList) {
+					if (header.exists()) header.delete();
+				}
+				
+				dictsList = dicts.get("_traces_slash_target_ext");
+				System.out.println("deleting file " + dictsList.toString());
+				for (File dict : dictsList) {
+					if (dict.exists()) dict.delete();
+				}
+				compilerpath = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\group\\");
+			}
+			else if (path.compareTo("_traces_slash_target_ext_commonsource")==0){
+				headersList = headers.get("_traces_slash_target_ext_commonsource");
+				System.out.println("deleting file " + headersList.toString());
+				for (File header : headersList) {
+					if (header.exists()) header.delete();
+				}
+				
+				dictsList = dicts.get("_traces_slash_target_ext_commonsource");
+				System.out.println("deleting file " + dictsList.toString());
+				for (File dict : dictsList) {
+					if (dict.exists()) dict.delete();
+				}
+				compilerpath = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\group\\");
+			}
+			else if (path.compareTo("_traces_target_type")==0){
+				headersList = headers.get("_traces_target_type");
+				System.out.println("deleting file " + headersList.toString());
+				for (File header : headersList) {
+					if (header.exists()) header.delete();
+				}
+				
+				dictsList = dicts.get("_traces_target_type");
+				System.out.println("deleting file " + dictsList.toString());
+				for (File dict : dictsList) {
+					if (dict.exists()) dict.delete();
+				}
+				compilerpath = new File (epocroot+projectdir+"mmp_traces_target_type\\group\\");
+			}
+			else if (path.compareTo("_traces_mixed")==0){
+				headersList = headers.get("_traces_mixed");
+				System.out.println("deleting file " + headersList.toString());
+				for (File header : headersList) {
+					if (header.exists()) header.delete();
+				}
+				
+				dictsList = dicts.get("_traces_mixed");
+				System.out.println("deleting file " + dictsList.toString());
+				for (File dict : dictsList) {
+					if (dict.exists()) dict.delete();
+				}
+				compilerpath = new File (epocroot+projectdir+"mmp_traces_mixed\\group\\");
+			}
+			else{
+			
+				System.out.println("Error: Unrecognised test case.");
+				fail();
+			}
+			
+			//set up the process builder object
+			sbs_build.directory(compilerpath);
+			sbs_reallyclean.directory(compilerpath);
+			sbs_build.redirectErrorStream(true);
+			
+			
+			
+			Process p;
+			String str = "";
+			//start the compiler
+			System.out.println("Starting build process ....");
+			
+				System.out.println("Running sbs reallyclean on : " + compilerpath + " command: " + sbs_reallyclean.command().toString());
+				p = sbs_reallyclean.start();
+				readProcessOutput(p);
+				System.out.println("Running sbs on : " + compilerpath + " command: " + sbs_build.command().toString());
+				p = sbs_build.start();
+				str = readProcessOutput(p);
+			
+			
+			int ret = p.exitValue();
+			System.out.println("build process ended....");
+			if (ret!=0){
+				System.out.println("build process failed:"+str);
+			}
+		}
+		
+    	catch (Exception e){//Catch exception if any
+    		System.err.println("Error: " + e.getMessage());
+    		fail();
+        }
+		
+	}
+
+
+	static private String readProcessOutput(Process p) throws IOException {
+		InputStream inp = p.getInputStream();
+		
+			int c;
+			String str = "";	        
+			//read the output from the compiler into the input stream
+			while ((c = inp.read()) != -1) {
+		   	 str= str +((char)c);
+			}
+		return str;
+	}
+	
+	/**
+	 * This function checks that the traces header files have been generated in the expected locations
+	 * 
+	 * @param path  String specifying where to look for the traces header file.  		   
+	 */
+	public void CheckForTracesHeaders(String path) {
+		System.out.println ("CheckForTracesHeaders()");
+		System.out.println("Old Builder : " + oldBuilder + "......Old TC : " + oldTC);
+		List<File> headersList = headers.get(path);
+		List<File> sourceList =  sources.get(path);
+		System.out.println("checking files " + headersList.toString());
+		boolean error = false;
+		if ((path.compareTo("_traces_slash_target_ext")==0 || path.compareTo("_traces_slash_target_ext_commonsource")==0) && oldBuilder && !oldTC){
+			System.out.println("No need to check for header files as old sbs cannot call TC");
+		} else {
+			try {
+				TraceCompilerEngineGlobals.start();
+			} catch (TraceCompilerException e) {
+				fail();
+			}
+			for (File header : headersList) {
+				if (!header.exists()) {
+					error = true;
+					System.out.println("Error: "+header+" does not exist/hasn't been generated by TraceCompiler");
+				} else {
+					String licenceInSource = null;
+					String licenceInHeader = null;
+					File source = null;
+					// read the licence from the header file
+					if (header.getName().trim().equalsIgnoreCase("OstTraceDefinitions.h")) {
+						licenceInSource = TraceCompilerEngineGlobals.getDefaultLicence(true);
+						System.out.println("Reading default licence for OstTraceDefinitions.h" + licenceInSource);
+					} else {
+						if (header.getName().trim().equalsIgnoreCase("fixed_id.definitions")) {
+							licenceInSource = TraceCompilerEngineGlobals.getDefaultLicence(false);
+							System.out.println("Reading default licence for fixed_id.definitions" + licenceInSource);
+						} else {
+							licenceInHeader = readFirstMultiLineComment(header.getAbsolutePath());
+							System.out.println("Reading licence from " + header.getAbsolutePath() + " == " + licenceInHeader);
+							source = sourceList.get(headersList.indexOf(header));
+
+							licenceInSource = readFirstMultiLineComment(source.getAbsolutePath());
+							System.out.println("Reading licence from " + source.getAbsolutePath() + " == " + licenceInSource);
+							if (licenceInSource == null) {
+								//licence should be EPL
+								licenceInSource = TraceCompilerEngineGlobals.getDefaultLicence(true);
+								System.out.println("Reading default licence for " + header.getAbsolutePath() + " == " + licenceInSource);
+							}
+						}
+					}
+					if (licenceInHeader != licenceInHeader) {
+						System.out.println("Error: licence in header " + header + " is not the same in source." + source);
+						fail();
+					}
+				}
+			}
+		
+			if(!error){
+				System.out.println("All Traces Header files have been generated as expected");
+			}
+			else {
+				fail();
+				}
+		}
+	}
+
+
+	/**
+	 * @param path
+	 */
+	private String readFirstMultiLineComment(String path) {
+		StringBuffer sb = new StringBuffer();
+		try {
+			FileReader reader = new FileReader(new File(path));
+			BufferedReader br = new BufferedReader(reader);
+			String line;
+			boolean inComment = false;
+			
+			while ((line = br.readLine()) != null) {
+				if (line.trim().startsWith("/*")) {
+					inComment = true;
+				}
+				if (inComment) {
+					sb.append(line + System.getProperty("line.separator"));
+				}
+				if (line.trim().endsWith("*/") && inComment) {
+					break;
+				}
+			}
+			br.close();
+		} catch (Exception e) {
+			System.out.println("Failed to open/read file " + path + "  " + e.getMessage());
+			fail();
+		}
+		String licence = null;
+		if (sb.length()> 0) {
+			licence = sb.toString();
+			if (!licence.contains("Copyright")) {
+				licence = null;
+			}
+		}
+			
+		return licence;
+	}
+	
+	/**
+	 * This function checks that the dictionary files have been generated in the expected locations with the right name
+	 * 
+	 * @param path.  		   
+	 */
+	public void CheckForDictionary(String path) {
+		System.out.println ("CheckForDictionaries()");
+
+		List<File> dictsList = dicts.get(path);
+		System.out.println("checking files " + dictsList.toString());
+		boolean error = false;
+
+		if ((path.compareTo("_traces_slash_target_ext")==0 || path.compareTo("_traces_slash_target_ext_commonsource")==0) && oldBuilder && !oldTC){
+			System.out.println("No need to check for dictionary as old sbs cannot call TC");
+		} else {
+			for (File dict : dictsList) {
+				if(!dict.exists()) {
+					error = true;
+					System.out.println("Error: "+dict+" does not exist/hasn't been generated by TraceCompiler");
+				}
+			}
+
+			if (!error) {
+				System.out.println("Dictionary files have been generated as expected");
+			}
+			else {
+				fail();
+			}
+		}
+	}
+	
+
+	/****************************************************ACTUAL TESTS************************************************************/
+	@Test
+	public void MultipleMmpsTest1 (){
+		System.out.println ("*********************traces****************************");
+		createListHeadersDicts("sbs");
+		//Call Raptor
+		InvokeCompiler("_traces", "sbs");		
+		//Check for header files
+		CheckForTracesHeaders("_traces");
+		//Check dictionary
+		CheckForDictionary("_traces");	
+		
+	
+	}
+	
+
+	@Test
+	public void MultipleMmpsTest2 (){
+		System.out.println ("****************traces_mmpname**********************");
+		createListHeadersDicts("sbs");
+		//Call Raptor
+		InvokeCompiler("_traces_mmpname", "sbs");
+		//Check for header files
+		CheckForTracesHeaders("_traces_mmpname");
+		//Check dictionary
+		CheckForDictionary("_traces_mmpname");
+		
+		
+	}
+	
+
+	@Test
+	public void MultipleMmpsTest3 (){
+		System.out.println ("**********traces_slash_target_ext****************");
+		createListHeadersDicts("sbs");
+		//Call Raptor
+		InvokeCompiler("_traces_slash_target_ext", "sbs");
+		//Check for header files
+		CheckForTracesHeaders("_traces_slash_target_ext");
+		//Check dictionary
+		CheckForDictionary("_traces_slash_target_ext");	
+		
+		
+	}
+
+	@Test
+	public void MultipleMmpsTest4 (){
+		System.out.println ("**********traces_slash_target_ext_commonsource****************");
+		createListHeadersDicts("sbs");
+		//Call Raptor
+		InvokeCompiler("_traces_slash_target_ext_commonsource", "sbs");
+		//Check for header files
+		CheckForTracesHeaders("_traces_slash_target_ext_commonsource");
+		//Check dictionary
+		CheckForDictionary("_traces_slash_target_ext_commonsource");
+		
+		
+				
+	}
+
+	@Test
+	public void MultipleMmpsTest5 (){
+		System.out.println ("**********traces_target_type****************");
+		createListHeadersDicts("sbs");
+		//Call Raptor
+		InvokeCompiler("_traces_target_type", "sbs");
+		//Check for header files
+		CheckForTracesHeaders("_traces_target_type");
+		//Check dictionary
+		CheckForDictionary("_traces_target_type");
+		
+		
+	}
+
+	@Test
+	public void MultipleMmpsTest6 (){
+		System.out.println ("**********traces_mixed****************");
+		createListHeadersDicts("sbs");
+		//Call Raptor
+		InvokeCompiler("_traces_mixed", "sbs");
+		//Check for header files
+		CheckForTracesHeaders("_traces_mixed");
+		//Check dictionary
+		CheckForDictionary("_traces_mixed");	
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/src/ParseFunctionParametersTest.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,228 @@
+/*
+ * 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:
+ *
+ * JUnit tests for function parameters parsing
+ *
+ */
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import org.junit.Assert;
+import org.junit.Test;
+import com.nokia.tracecompiler.source.*;
+import com.nokia.tracecompiler.document.*;
+
+public class ParseFunctionParametersTest {
+
+	/**
+	 * SourceDocumentFactory
+	 */
+	SourceDocumentFactory iFactory = null;
+
+	public static void main(String[] args) {
+		org.junit.runner.JUnitCore.main(ParseFunctionParametersTest.class
+				.getName());
+	}
+
+	/**
+	 * jUnit test to test function parameter parsing
+	 */
+	@Test
+	public void testFunctionParameterParsing() {
+
+		FileDocumentMonitor monitor = new FileDocumentMonitor();
+		iFactory = monitor.getFactory();
+
+		ArrayList<String> expectedParameterNames = new ArrayList<String>();
+		ArrayList<String> expectedParameterTypes = new ArrayList<String>();
+		String functionHeader;
+
+		// Function header 1
+
+		// First expected parameter
+		expectedParameterNames.add("aLenght"); //$NON-NLS-1$
+		expectedParameterTypes.add("TUint32"); //$NON-NLS-1$
+
+		// Second expected parameter
+		expectedParameterNames.add("aWidth"); //$NON-NLS-1$
+		expectedParameterTypes.add("TUint16"); //$NON-NLS-1$
+
+		// Third expected parameter
+		expectedParameterNames.add("aDelay"); //$NON-NLS-1$
+		expectedParameterTypes.add("TUint32"); //$NON-NLS-1$
+
+		// construct the function header
+		functionHeader = "DHelloWorld::DHelloWorld(TUint32 aLenght, TUint16 aWidth, TUint32 aDelay)\n" //$NON-NLS-1$
+				+ "{"; //$NON-NLS-1$
+
+		System.out.println("Execute test to function header 1"); //$NON-NLS-1$
+		executeTest(expectedParameterNames, expectedParameterTypes,
+				functionHeader);
+
+		// Function header 2
+
+		// Clear expected names and types arrays
+		expectedParameterNames.clear();
+		expectedParameterTypes.clear();
+
+		// construct the function header
+		functionHeader = "EXPORT_C DMessageHandler::DMessageHandler()\n" //$NON-NLS-1$
+				+ ": iWriter( NULL )\n" //$NON-NLS-1$
+				+ ", iSettings( NULL )\n" //$NON-NLS-1$				
+				+ "{"; //$NON-NLS-1$
+
+		System.out.println("Execute test to function header 2"); //$NON-NLS-1$
+		executeTest(expectedParameterNames, expectedParameterTypes,
+				functionHeader);
+
+		// Test headers those caused defects in TraceCompiler version 2.1.0 and
+		// 2.1.1
+		// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+		// x
+
+		System.out
+				.println("Execute tests to function headers those caused defects in TraceCompiler version 2.1.0 and 2.1.1"); //$NON-NLS-1$
+
+		// Clear expected names and types arrays
+		expectedParameterNames.clear();
+		expectedParameterTypes.clear();
+
+		// First expected parameter
+		expectedParameterNames.add("aObserver"); //$NON-NLS-1$
+		expectedParameterTypes.add("MModemLcsServerObserver"); //$NON-NLS-1$
+
+		// Second expected parameter
+		expectedParameterNames.add("aIsiMsgObserver"); //$NON-NLS-1$
+		expectedParameterTypes.add("MModemLcsIsiMsgObserver"); //$NON-NLS-1$
+
+		// construct the function header
+		functionHeader = "Cmodemlcsserverrrc::Cmodemlcsserverrrc(MModemLcsServerObserver *aObserver, MModemLcsIsiMsgObserver* aIsiMsgObserver):\n" //$NON-NLS-1$
+				+ " CActive(EPriorityStandard) // Standard priority\n" //$NON-NLS-1$
+				+ "{"; //$NON-NLS-1$
+
+		executeTest(expectedParameterNames, expectedParameterTypes,
+				functionHeader);
+
+		// Clear expected names and types arrays
+		expectedParameterNames.clear();
+		expectedParameterTypes.clear();
+
+		// First expected parameter
+		expectedParameterNames.add("aDriver"); //$NON-NLS-1$
+		expectedParameterTypes.add("RMeDriver"); //$NON-NLS-1$
+
+		// Second expected parameter
+		expectedParameterNames.add("aMaxMsgLength"); //$NON-NLS-1$
+		expectedParameterTypes.add("TUint16"); //$NON-NLS-1$
+
+		// construct the function header
+		functionHeader = "CNpeSendData::CNpeSendData(RMeDriver* aDriver, TUint16 aMaxMsgLength): CActive(EPriorityStandard),\n" //$NON-NLS-1$
+				+ "iDriver(aDriver),\n" //$NON-NLS-1$
+				+ "iMaxMsgLength(aMaxMsgLength)\n" //$NON-NLS-1$
+				+ "{"; //$NON-NLS-1$
+
+		executeTest(expectedParameterNames, expectedParameterTypes,
+				functionHeader);
+
+		// Same expected parameter names and types are used as previous case
+
+		// construct the function header
+		functionHeader = "CNpeReceiveData::CNpeReceiveData(RMeDriver* aDriver, TUint16 aMaxMsgLength): CActive(EPriorityStandard),\n" //$NON-NLS-1$
+				+ "iDriver(aDriver),\n" //$NON-NLS-1$
+				+ "iMaxMsgLength(aMaxMsgLength)\n" //$NON-NLS-1$
+				+ "{"; //$NON-NLS-1$
+
+		executeTest(expectedParameterNames, expectedParameterTypes,
+				functionHeader);
+		// x
+		// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+
+	}
+
+	/**
+	 * Execute test for function header
+	 * 
+	 * @param expectedParameterNames
+	 *            expected parameter names
+	 * @param expectedParameterTypes
+	 *            expected parameter types
+	 * @param functionHeader
+	 *            function header to be parsed
+	 */
+	private void executeTest(ArrayList<String> expectedParameterNames,
+			ArrayList<String> expectedParameterTypes,
+			final String functionHeader) {
+
+		// first test the parser on an unwrapped string
+		SourceParser sourceParser = new SourceParser(iFactory, iFactory
+				.createDocument(functionHeader));
+
+		// ArrayList<String> actualTokens = new ArrayList<String>();
+		ArrayList<SourceParameter> actualParameters = new ArrayList<SourceParameter>();
+
+		// parse string
+		try {
+			sourceParser.parseFunctionParameters(0, actualParameters);
+
+		} catch (SourceParserException e) {
+			Assert.fail(e.getMessage());
+		}
+
+		checkContents(actualParameters, expectedParameterNames,
+				expectedParameterTypes);
+	}
+
+	/**
+	 * Check contents
+	 * 
+	 * @param actualParameters
+	 *            actual parsed parameters
+	 * @param expectedParameterNames
+	 *            expected parameter names
+	 * @param expectedParameterTypes
+	 *            expected parameter types
+	 */
+	private static void checkContents(
+			final ArrayList<SourceParameter> actualParameters,
+			final ArrayList<String> expectedParameterNames,
+			final ArrayList<String> expectedParameterTypes) {
+
+		// Confirm count of parsed parameters
+		
+		System.out.println("Confirm count of parsed parameters:"); //$NON-NLS-1$
+		System.out.println("actualParameters.size() = " + actualParameters.size()); //$NON-NLS-1$
+		System.out.println("expectedParameterNames() = " + expectedParameterNames.size()); //$NON-NLS-1$
+		assertTrue(actualParameters.size() == expectedParameterNames.size());
+		for (int i = 0; i < actualParameters.size(); i++) {
+
+			// Confirm parsed parameter names
+			
+			System.out.println("Confirm parsed parameter names:"); //$NON-NLS-1$
+			System.out.println("actualParameters name = " + actualParameters.get(i).getName()); //$NON-NLS-1$
+			System.out.println("expectedParameter name = " + expectedParameterNames.get(i)); //$NON-NLS-1$
+			assertTrue(actualParameters.get(i).getName().compareTo(
+					expectedParameterNames.get(i)) == 0);
+
+			// Confirm parsed parameter types
+			
+			System.out.println("Confirm parsed parameter types:"); //$NON-NLS-1$
+			System.out.println("actualParameters type = " + actualParameters.get(i).getType()); //$NON-NLS-1$
+			System.out.println("expectedParameter type = " + expectedParameterTypes.get(i)); //$NON-NLS-1$
+			assertTrue(actualParameters.get(i).getType().compareTo(
+					expectedParameterTypes.get(i)) == 0);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/src/PluginTracePropertyVerifierTest.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2009-2010 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:
+ *
+ * JUnit tests for PluginTracePropertyVerifier
+ *
+ */
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class PluginTracePropertyVerifierTest extends TestCase {
+
+	/**
+	 * Class to PluginTracePropertyVerifier
+	 */
+	static Class<?> pluginTracePropertyVerifier;
+
+	/**
+	 * PluginTracePropertyVerifier object
+	 */
+	static Object ptpvObject;
+
+	/**
+	 * Empty string
+	 */
+	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
+
+	/**
+	 * White space
+	 */
+	private static final String WHITE_SPACE = " "; //$NON-NLS-1$
+
+	/**
+	 * Enum for different functions to test
+	 * 
+	 */
+	private enum FunctionToTest {
+		ISVALIDDATA
+	}
+
+	/**
+	 * TestData class
+	 * 
+	 */
+	private class TestData {
+		String testString;
+		boolean expectedIsValidDataResult;
+
+		/**
+		 * 
+		 * Constructor
+		 * 
+		 * @param testStringParam
+		 *            the test string
+		 * @param expectedIsValidDataResultParam
+		 *            the expected return value in case of isValidData
+		 *            method
+		 */
+		TestData(String testStringParam, boolean expectedIsValidDataResultParam) {
+			this.testString = testStringParam;
+			this.expectedIsValidDataResult = expectedIsValidDataResultParam;
+		}
+	}
+
+	/**
+	 * List of test data
+	 */
+	List<TestData> testDataList = new ArrayList<TestData>();
+
+	/**
+	 * main
+	 * 
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		org.junit.runner.JUnitCore
+				.main(PluginTracePropertyVerifierTest.class.getName());
+	}
+
+	/**
+	 * setUp
+	 */
+	@Before
+	public void setUp() {
+
+		if (testDataList.size() == 0) {
+			initializeTestDataList();
+		}
+
+		if (pluginTracePropertyVerifier == null && ptpvObject == null) {
+			try {
+				pluginTracePropertyVerifier = Class
+						.forName("com.nokia.tracecompiler.engine.plugin.PluginTracePropertyVerifier"); //$NON-NLS-1$
+				ptpvObject = pluginTracePropertyVerifier.newInstance();
+			} catch (Exception e) {
+				Assert.fail(e.toString());
+			}
+		}
+
+	}
+
+	/**
+	 * Initialize test data list
+	 */
+	private void initializeTestDataList() {
+		char VTAB = 0xB; //vertical TAB
+		testDataList.add(new TestData("Some valid text", true)); //valid text //$NON-NLS-1$
+		testDataList.add(new TestData("Some text with non-valid character - vertical TAB - : " + String.valueOf(VTAB) , false)); //$NON-NLS-1$
+		testDataList.add(new TestData("Some valid text with TAB	: " , true)); //$NON-NLS-1$
+		testDataList.add(new TestData("Some valid text with TABs				: " , true)); //$NON-NLS-1$
+	}
+
+	/**
+	 * Execute tests
+	 * 
+	 * @param nameOfFunctionUnderTest
+	 *            the name of the function that should be tested
+	 * @param testType
+	 *            the number of expected result column
+	 */
+	private void executeTests(String nameOfFunctionUnderTest,
+			FunctionToTest testType) {
+		for (int i = 0; i < testDataList.size(); i++) {
+			String testString = testDataList.get(i).testString;
+			boolean expectedResult = false;
+
+			switch (testType) {
+			case ISVALIDDATA:
+				expectedResult = testDataList.get(i).expectedIsValidDataResult;
+				break;
+			}
+
+			executeTest(nameOfFunctionUnderTest, testString, expectedResult);
+		}
+	}
+
+	/**
+	 * Execute test
+	 * 
+	 * @param nameOfFunctionUnderTest
+	 *            the name of the function that should be tested
+	 * @param testString
+	 *            the test string that is used in test
+	 * @param columNumberOfExpectedResult
+	 *            the number of expected result column
+	 */
+	private void executeTest(String nameOfFunctionUnderTest, String testString,
+			boolean expectedResult) {
+		Method functionUnderTest = null;
+		try {
+			functionUnderTest = pluginTracePropertyVerifier.getDeclaredMethod(
+					nameOfFunctionUnderTest, String.class);
+			// change access of the function under test because otherwise we can
+			// test to private functions
+			functionUnderTest.setAccessible(true);
+			// invoke the function and get result
+			Object retObj = null;
+
+			// remove white spaces from test string, because those those does
+			// not exist in real life either
+			retObj = functionUnderTest.invoke(ptpvObject, testString.replace(
+					WHITE_SPACE, EMPTY_STRING));
+
+			// cast the result to the expected return type.
+			Boolean res = (Boolean) retObj;
+
+			String msg = functionUnderTest.getName() + "  invoked on \"" //$NON-NLS-1$
+					+ testString + "\" returned " + res.toString(); //$NON-NLS-1$
+			Assert.assertEquals(msg, expectedResult, res.booleanValue());
+		} catch (Exception e) {
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	/**
+	 * Test isValidData method
+	 */
+	@Test
+	public void testIsValidDataMethod() {
+		executeTests("isValidData", FunctionToTest.ISVALIDDATA); //$NON-NLS-1$
+	}
+
+	//add future methods tests after this point.
+	
+	/**
+	 * tearDown
+	 */
+	@After
+	public void tearDown() {
+		// nothing to do
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/src/TraceHeadersLicenceTest.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,600 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+import static org.junit.Assert.fail;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+
+
+public class TraceHeadersLicenceTest {
+	
+	public static void main(String args[]) {		
+	      	org.junit.runner.JUnitCore.main(TraceHeadersLicenceTest.class.getName());
+	    }
+	
+	/****************************************************UTILITY FUNCTIONS FOR TESTS************************************************************/
+	
+	private static String epocroot = null; 
+	private static String projectdir = "testdata\\MultipleMmpTestCases\\"; //$NON-NLS-1$
+	private static Pattern versionPattern = Pattern.compile("^.*(\\d+\\.\\d+\\.\\d+).*$"); //$NON-NLS-1$
+	private static Pattern oldversionPat = Pattern.compile("^(1\\..*)|(2\\.1.*)"); //$NON-NLS-1$
+	//old TC version should be up to 2.12.5 as new functionality was submitted to 2.12.6 (we hope)
+	private static Pattern sbsoldversionPat = Pattern.compile("^(1\\..*)|(2\\.[01]\\..*)|(2\\.1[0-2]\\.[0-3].*)"); //$NON-NLS-1$
+	private static String TCversion = ""; //$NON-NLS-1$
+	private static String SBSversion = ""; //$NON-NLS-1$
+	private static File compilerpath;
+	private static boolean oldTC = false;
+	private static boolean oldBuilder = false; 
+	private static HashMap<String, List<File>> headers = new HashMap<String, List<File>>();
+	private static HashMap<String, List<File>> sources = new HashMap<String, List<File>>();
+	private static ProcessBuilder sbs_build = new ProcessBuilder("sbs.bat","-k","-c","winscw_udeb.tracecompiler");
+	private static ProcessBuilder sbs_reallyclean = new ProcessBuilder("sbs.bat","-k","-c","winscw_udeb.tracecompiler", "reallyclean");
+	
+
+	@BeforeClass
+	static public void setEnvVariables() {
+		epocroot = System.getenv("EPOCROOT"); //$NON-NLS-1$
+		if(epocroot == null || (epocroot.length()==0)){
+			fail();
+		}
+		
+		// need to check that the path ends in a backslash
+		if(!epocroot.endsWith("\\")){ 
+			epocroot += "\\"; 
+		}
+
+		compilerpath = new File (epocroot + "epoc32" + File.separator + "tools" + File.separator +"tracecompiler" + File.separator); //default value to remove warnings. //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+
+		ProcessBuilder tc = new ProcessBuilder("java", "-classpath", compilerpath.getPath(), //$NON-NLS-1$//$NON-NLS-2$
+				"com.nokia.tracecompiler.TraceCompiler", "-v"); //$NON-NLS-1$//$NON-NLS-2$
+		System.out.println("compilerPath= " + compilerpath); //$NON-NLS-1$
+		tc.directory(compilerpath);
+		tc.redirectErrorStream(true);
+		try {
+		Process p = tc.start();
+		p.waitFor();	
+
+		
+		String str = readProcessOutput(p);
+		System.out.println("TC version = " + str); //$NON-NLS-1$
+		Matcher m = versionPattern.matcher(str.trim());
+		if (m.matches()) {
+			TCversion = m.group(1);
+			System.out.println("TC Version = " + TCversion); //$NON-NLS-1$
+		}
+		
+		m = oldversionPat.matcher(TCversion);
+		if (m.matches()){
+			oldTC=true;
+		}
+
+		System.out.println("TC version = " + TCversion); //$NON-NLS-1$ 
+		System.out.println("OLD TC version = " + oldTC); //$NON-NLS-1$
+
+		ProcessBuilder sbs = new ProcessBuilder("sbs.bat","-v"); //$NON-NLS-1$ //$NON-NLS-2$
+		sbs.directory(compilerpath);
+		sbs.redirectErrorStream(true);
+			
+		//start the compiler
+		p = sbs.start();
+		p.waitFor();
+			
+		InputStream inp = p.getInputStream();
+			
+	        str = ""; //$NON-NLS-1$
+	        int c;
+	        //read the output from the compiler into the input stream
+	        while ((c = inp.read()) != -1) {
+	           	 str= str +((char)c);
+	        }
+
+		System.out.println("SBS version = " + str); //$NON-NLS-1$
+		m = versionPattern.matcher(str.trim());
+		if (m.matches()) {
+			SBSversion = m.group(1);
+		}
+		
+		m = sbsoldversionPat.matcher(SBSversion);
+		if (m.matches()){
+			oldBuilder=true;
+		}
+		
+		} catch (Exception e) {// Catch exception if any
+			System.err.println(e.getMessage());
+		}
+	}
+	
+	
+	public void createListHeadersDicts(String builder)
+	{
+		//The whole logic of what is expected is built here whether we build with sbs 
+		//new TC or old, The structure is re-built for each case.
+		
+		
+		Matcher m = sbsoldversionPat.matcher(SBSversion);
+		if (m.matches()){
+			oldBuilder=true;
+		} else {
+			oldBuilder=false;
+		}
+		
+		
+		System.out.println("OLD Builder :" + builder + ": = " + oldBuilder); //$NON-NLS-1$
+		
+		File tracesHeader1;
+		File tracesHeader2;
+		File tracesHeader3;
+		File tracesHeader4;
+		File source1;
+		File source2;
+		File source3;
+		File source4;
+		File ostTraceDefinitions;
+		File fixedidDefinitions;
+		String loc = "traces\\"; //$NON-NLS-1$
+		
+		source1 = new File (epocroot+projectdir+"mmp_traces\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source2 = new File (epocroot+projectdir+"mmp_traces\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		source3 = new File (epocroot+projectdir+"mmp_traces\\src\\MultipleMmpApp2.cpp"); //$NON-NLS-1$
+		source4 = new File (epocroot+projectdir+"mmp_traces\\src\\ExtraCppFile2.cpp"); //$NON-NLS-1$
+		sources.put("_traces", Arrays.asList(source1, source2, source3, source4));
+		
+		tracesHeader1 = new File (epocroot+projectdir+"mmp_traces\\traces\\MultipleMmpApp1Traces.h"); //$NON-NLS-1$
+		tracesHeader2 = new File (epocroot+projectdir+"mmp_traces\\traces\\ExtraCppFile1Traces.h"); //$NON-NLS-1$
+		tracesHeader3 = new File (epocroot+projectdir+"mmp_traces\\traces\\MultipleMmpApp2Traces.h"); //$NON-NLS-1$
+		tracesHeader4 = new File (epocroot+projectdir+"mmp_traces\\traces\\ExtraCppFile2Traces.h"); //$NON-NLS-1$
+		
+		ostTraceDefinitions = new File(epocroot+projectdir+"mmp_traces\\traces\\OstTraceDefinitions.h"); //$NON-NLS-1$
+		fixedidDefinitions = new File(epocroot+projectdir+"mmp_traces\\traces\\fixed_id.definitions"); //$NON-NLS-1$)
+		headers.put("_traces", Arrays.asList(tracesHeader1,tracesHeader2,tracesHeader3,tracesHeader4,ostTraceDefinitions,fixedidDefinitions)); //$NON-NLS-1$
+		
+		
+		//=============================
+		
+		if (!oldBuilder && !oldTC) {
+			loc = "traces_mmp_traces_mmpname1\\"; //$NON-NLS-1$
+		}
+		tracesHeader1 = new File (epocroot+projectdir+"mmp_traces_mmpname\\"+ loc + "MultipleMmpApp1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader2 = new File (epocroot+projectdir+"mmp_traces_mmpname\\" + loc + "ExtraCppFile1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		if (!oldBuilder && !oldTC) {
+			loc = "traces_mmp_traces_mmpname2\\"; //$NON-NLS-1$
+		}
+		tracesHeader3 = new File (epocroot+projectdir+"mmp_traces_mmpname\\" + loc + "MultipleMmpApp2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader4 = new File (epocroot+projectdir+"mmp_traces_mmpname\\" + loc + "ExtraCppFile2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		ostTraceDefinitions = new File(epocroot+projectdir+"mmp_traces_mmpname\\" + loc + "OstTraceDefinitions.h"); //$NON-NLS-1$
+		fixedidDefinitions = new File(epocroot+projectdir+"mmp_traces_mmpname\\" + loc + "fixed_id.definitions"); //$NON-NLS-1$)
+
+		headers.put("_traces_mmpname", Arrays.asList(tracesHeader1,tracesHeader2,tracesHeader3,tracesHeader4,ostTraceDefinitions,fixedidDefinitions)); //$NON-NLS-1$
+		
+		source1 = new File (epocroot+projectdir+"mmp_traces_mmpname\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source2 = new File (epocroot+projectdir+"mmp_traces_mmpname\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		source3 = new File (epocroot+projectdir+"mmp_traces_mmpname\\src\\MultipleMmpApp2.cpp"); //$NON-NLS-1$
+		source4 = new File (epocroot+projectdir+"mmp_traces_mmpname\\src\\ExtraCppFile2.cpp"); //$NON-NLS-1$
+		sources.put("_traces_mmpname", Arrays.asList(source1, source2, source3, source4));
+		
+	    //=============================
+	    
+	    loc = "traces\\"; //$NON-NLS-1$
+		if (!oldTC) {
+			loc = "traces\\target7_dll\\"; //$NON-NLS-1$
+		}
+		tracesHeader1 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\" + loc + "MultipleMmpApp1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader2 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\" + loc + "ExtraCppFile1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		if (!oldTC) {
+			loc = "traces\\target8_dll\\"; //$NON-NLS-1$
+		}
+		tracesHeader3 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\" + loc + "MultipleMmpApp2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader4 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\" + loc + "ExtraCppFile2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		ostTraceDefinitions = new File(epocroot+projectdir+"mmp_traces_slash_target_ext\\" + loc + "OstTraceDefinitions.h"); //$NON-NLS-1$
+		fixedidDefinitions = new File(epocroot+projectdir+"mmp_traces_slash_target_ext\\" + loc + "fixed_id.definitions"); //$NON-NLS-1$)
+
+		headers.put("_traces_slash_target_ext", Arrays.asList(tracesHeader1,tracesHeader2,tracesHeader3,tracesHeader4,ostTraceDefinitions,fixedidDefinitions)); //$NON-NLS-1$
+		
+		source1 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source2 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		source3 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\src\\MultipleMmpApp2.cpp"); //$NON-NLS-1$
+		source4 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\src\\ExtraCppFile2.cpp"); //$NON-NLS-1$
+		sources.put("_traces_slash_target_ext", Arrays.asList(source1, source2, source3, source4));
+				
+	    //================================
+	    loc = "traces\\"; //$NON-NLS-1$
+		if (!oldTC) {
+			loc = "traces\\target9_dll\\"; //$NON-NLS-1$
+		}
+		tracesHeader1 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\" + loc + "MultipleMmpApp1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader2 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\" + loc + "ExtraCppFile1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		if (!oldTC) {
+			loc = "traces\\target10_dll\\"; //$NON-NLS-1$
+		}
+		tracesHeader3 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\" + loc + "MultipleMmpApp1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader4 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\" + loc + "ExtraCppFile1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		ostTraceDefinitions = new File(epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\" + loc + "OstTraceDefinitions.h"); //$NON-NLS-1$
+		fixedidDefinitions = new File(epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\" + loc + "fixed_id.definitions"); //$NON-NLS-1$)
+
+		headers.put("_traces_slash_target_ext_commonsource", Arrays.asList(tracesHeader1,tracesHeader2,tracesHeader3,tracesHeader4,ostTraceDefinitions,fixedidDefinitions)); //$NON-NLS-1$
+		
+		source1 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source2 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		source3 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source4 = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		sources.put("_traces_slash_target_ext_commonsource", Arrays.asList(source1, source2, source3, source4));
+		
+		//==================================
+		loc = "traces\\"; //$NON-NLS-1$
+		if (!oldTC && !oldBuilder) {
+			loc = "traces_target11_exe\\"; //$NON-NLS-1$
+		}
+		tracesHeader1 = new File (epocroot+projectdir+"mmp_traces_target_type\\" + loc +"MultipleMmpApp1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader2 = new File (epocroot+projectdir+"mmp_traces_target_type\\" + loc +"ExtraCppFile1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		if (!oldTC && !oldBuilder) {
+			loc = "traces_target12_exe\\"; //$NON-NLS-1$
+		}
+		tracesHeader3 = new File (epocroot+projectdir+"mmp_traces_target_type\\" + loc + "MultipleMmpApp2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader4 = new File (epocroot+projectdir+"mmp_traces_target_type\\" + loc + "ExtraCppFile2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		ostTraceDefinitions = new File(epocroot+projectdir+"mmp_traces_target_type\\" + loc + "OstTraceDefinitions.h"); //$NON-NLS-1$
+		fixedidDefinitions = new File(epocroot+projectdir+"mmp_traces_target_type\\" + loc + "fixed_id.definitions"); //$NON-NLS-1$)
+
+		headers.put("_traces_target_type", Arrays.asList(tracesHeader1,tracesHeader2,tracesHeader3,tracesHeader4,ostTraceDefinitions,fixedidDefinitions)); //$NON-NLS-1$
+		
+		
+		source1 = new File (epocroot+projectdir+"mmp_traces_target_type\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source2 = new File (epocroot+projectdir+"mmp_traces_target_type\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		source3 = new File (epocroot+projectdir+"mmp_traces_target_type\\src\\MultipleMmpApp2.cpp"); //$NON-NLS-1$
+		source4 = new File (epocroot+projectdir+"mmp_traces_target_type\\src\\ExtraCppFile2.cpp"); //$NON-NLS-1$
+		sources.put("_traces_target_type", Arrays.asList(source1, source2, source3, source4));
+
+		
+		//==================================
+		
+		loc = "traces\\"; //$NON-NLS-1$
+		if (!oldTC && !oldBuilder) {
+			loc = "traces\\target3_dll\\"; //$NON-NLS-1$
+		}
+		tracesHeader1 = new File (epocroot+projectdir+"mmp_traces_mixed\\" + loc + "MultipleMmpApp1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader2 = new File (epocroot+projectdir+"mmp_traces_mixed\\" + loc + "ExtraCppFile1Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		if (!oldTC && !oldBuilder) {
+			loc = "traces_target4_kext\\"; //$NON-NLS-1$ 
+		}
+		tracesHeader3 = new File (epocroot+projectdir+"mmp_traces_mixed\\" + loc + "MultipleMmpApp2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$
+		tracesHeader4 = new File (epocroot+projectdir+"mmp_traces_mixed\\" + loc + "ExtraCppFile2Traces.h"); //$NON-NLS-1$ //$NON-NLS-2$		
+		ostTraceDefinitions = new File(epocroot+projectdir+"mmp_traces_mixed\\" + loc + "OstTraceDefinitions.h"); //$NON-NLS-1$
+		fixedidDefinitions = new File(epocroot+projectdir+"mmp_traces_mixed\\" + loc + "fixed_id.definitions"); //$NON-NLS-1$)
+
+		headers.put("_traces_mixed", Arrays.asList(tracesHeader1,tracesHeader2,tracesHeader3,tracesHeader4,ostTraceDefinitions,fixedidDefinitions)); //$NON-NLS-1$		
+		
+		source1 = new File (epocroot+projectdir+"mmp_traces_mixed\\src\\MultipleMmpApp1.cpp"); //$NON-NLS-1$
+		source2 = new File (epocroot+projectdir+"mmp_traces_mixed\\src\\ExtraCppFile1.cpp"); //$NON-NLS-1$
+		source3 = new File (epocroot+projectdir+"mmp_traces_mixed\\src\\MultipleMmpApp2.cpp"); //$NON-NLS-1$
+		source4 = new File (epocroot+projectdir+"mmp_traces_mixed\\src\\ExtraCppFile2.cpp"); //$NON-NLS-1$
+		sources.put("_traces_mixed", Arrays.asList(source1, source2, source3, source4));
+	}
+	
+	
+	/**
+	 * This function invokes raptor on the desired test c++ project
+	 * 
+	 * @param path String specifying the path the compiler needs
+	 * 				  to run from
+	 */
+	public void InvokeCompiler(String path, String builder) {
+		System.out.println ("InvokeCompiler() for : " + builder);
+		
+		List<File> headersList;
+		try{
+			
+			//set up the directory from which the process will be called
+			if (path.compareTo("_traces")==0){ //$NON-NLS-1$
+				headersList = headers.get("_traces"); //$NON-NLS-1$
+				System.out.println("deleting file " + headersList.toString()); //$NON-NLS-1$
+				for (File header : headersList) {
+					if (header.exists()) header.delete();
+				}
+				
+				compilerpath = new File (epocroot+projectdir+"mmp_traces\\group\\"); //$NON-NLS-1$
+			}
+			else if (path.compareTo("_traces_mmpname")==0){ //$NON-NLS-1$
+				headersList = headers.get("_traces_mmpname"); //$NON-NLS-1$
+				System.out.println("deleting file " + headersList.toString()); //$NON-NLS-1$
+				for (File header : headersList) {
+					if (header.exists()) {
+						header.delete();
+					}
+				}
+				
+				compilerpath = new File (epocroot+projectdir+"mmp_traces_mmpname\\group\\");
+			}
+			else if (path.compareTo("_traces_slash_target_ext")==0){
+				headersList = headers.get("_traces_slash_target_ext");
+				System.out.println("deleting file " + headersList.toString());
+				for (File header : headersList) {
+					if (header.exists()) header.delete();
+				}
+				
+				compilerpath = new File (epocroot+projectdir+"mmp_traces_slash_target_ext\\group\\");
+			}
+			else if (path.compareTo("_traces_slash_target_ext_commonsource")==0){
+				headersList = headers.get("_traces_slash_target_ext_commonsource");
+				System.out.println("deleting file " + headersList.toString());
+				for (File header : headersList) {
+					if (header.exists()) header.delete();
+				}
+				
+				compilerpath = new File (epocroot+projectdir+"mmp_traces_slash_target_ext_commonsource\\group\\");
+			}
+			else if (path.compareTo("_traces_target_type")==0){
+				headersList = headers.get("_traces_target_type");
+				System.out.println("deleting file " + headersList.toString());
+				for (File header : headersList) {
+					if (header.exists()) header.delete();
+				}
+				
+				compilerpath = new File (epocroot+projectdir+"mmp_traces_target_type\\group\\");
+			}
+			else if (path.compareTo("_traces_mixed")==0){
+				headersList = headers.get("_traces_mixed");
+				System.out.println("deleting file " + headersList.toString());
+				for (File header : headersList) {
+					if (header.exists()) header.delete();
+				}
+				
+				compilerpath = new File (epocroot+projectdir+"mmp_traces_mixed\\group\\");
+			}
+			else{
+			
+				System.out.println("Error: Unrecognised test case.");
+				fail();
+			}
+			
+			//set up the process builder object
+			sbs_build.directory(compilerpath);
+			sbs_reallyclean.directory(compilerpath);
+			sbs_build.redirectErrorStream(true);
+			
+			
+			
+			Process p;
+			String str = "";
+			//start the compiler
+			System.out.println("Starting build process ....");
+			
+				System.out.println("Running sbs reallyclean on : " + compilerpath + " command: " + sbs_reallyclean.command().toString());
+				p = sbs_reallyclean.start();
+				readProcessOutput(p);
+				System.out.println("Running sbs on : " + compilerpath + " command: " + sbs_build.command().toString());
+				p = sbs_build.start();
+				str = readProcessOutput(p);
+			
+			
+			int ret = p.exitValue();
+			System.out.println("build process ended....");
+			if (ret!=0){
+				System.out.println("build process failed:"+str);
+			}
+		}
+		
+    	catch (Exception e){//Catch exception if any
+    		System.err.println("Error: " + e.getMessage());
+    		fail();
+        }
+		
+	}
+
+
+	static private String readProcessOutput(Process p) throws IOException {
+		InputStream inp = p.getInputStream();
+		
+			int c;
+			String str = "";	        
+			//read the output from the compiler into the input stream
+			while ((c = inp.read()) != -1) {
+		   	 str= str +((char)c);
+			}
+		return str;
+	}
+	
+	/**
+	 * This function checks that the traces header files have been generated in the expected locations
+	 * 
+	 * @param path  String specifying where to look for the traces header file.  		   
+	 */
+	public void checkForTracesHeadersAndLicence(String path) {
+		System.out.println ("CheckForTracesHeaders()");
+		System.out.println("Old Builder : " + oldBuilder + "......Old TC : " + oldTC);
+		List<File> headersList = headers.get(path);
+		List<File> sourceList =  sources.get(path);
+		System.out.println("checking files " + headersList.toString());
+		boolean error = false;
+		if ((path.compareTo("_traces_slash_target_ext")==0 || path.compareTo("_traces_slash_target_ext_commonsource")==0) && oldBuilder && !oldTC){
+			System.out.println("No need to check for header files as old sbs cannot call TC");
+		} else {
+			try {
+				TraceCompilerEngineGlobals.start();
+			} catch (TraceCompilerException e) {
+				fail();
+			}
+			for (File header : headersList) {
+				if (!header.exists()) {
+					error = true;
+					System.out.println("Error: "+header+" does not exist/hasn't been generated by TraceCompiler");
+				} else {
+					String licenceInSource = null;
+					String licenceInHeader = null;
+					File source = null;
+					// read the licence from the header file
+					if (header.getName().trim().equalsIgnoreCase("OstTraceDefinitions.h")) {
+						licenceInSource = TraceCompilerEngineGlobals.getDefaultLicence(true);
+						System.out.println("Reading default licence for OstTraceDefinitions.h" + licenceInSource);
+					} else {
+						if (header.getName().trim().equalsIgnoreCase("fixed_id.definitions")) {
+							licenceInSource = TraceCompilerEngineGlobals.getDefaultLicence(false);
+							System.out.println("Reading default licence for fixed_id.definitions" + licenceInSource);
+						} else {
+							licenceInHeader = readFirstMultiLineComment(header.getAbsolutePath());
+							System.out.println("Reading licence from " + header.getAbsolutePath() + " == " + licenceInHeader);
+							if (licenceInHeader == null) {
+								System.out.println("No licence found in header file, so fail().");
+								fail();
+							}
+							source = sourceList.get(headersList.indexOf(header));
+
+							licenceInSource = readFirstMultiLineComment(source.getAbsolutePath());
+							System.out.println("Reading licence from " + source.getAbsolutePath() + " == " + licenceInSource);
+							if (licenceInSource == null) {
+								//licence should be EPL
+								System.out.println("No licence found in source file, so get default one.");
+								licenceInSource = TraceCompilerEngineGlobals.getDefaultLicence(true);
+								System.out.println("Reading default licence for " + header.getAbsolutePath() + " == " + licenceInSource);
+							}
+						}
+					}
+					if (licenceInHeader != licenceInHeader) {
+						System.out.println("Error: licence in header " + header + " is not the same in source." + source);
+						fail();
+					}
+				}
+			}
+		
+			if(!error){
+				System.out.println("All Traces Header files have been generated as expected");
+			}
+			else {
+				fail();
+				}
+		}
+	}
+
+
+	/**
+	 * @param path
+	 */
+	private String readFirstMultiLineComment(String path) {
+		StringBuffer sb = new StringBuffer();
+		try {
+			FileReader reader = new FileReader(new File(path));
+			BufferedReader br = new BufferedReader(reader);
+			String line;
+			boolean inComment = false;
+			
+			while ((line = br.readLine()) != null) {
+				if (line.trim().startsWith("/*")) {
+					inComment = true;
+				}
+				if (inComment) {
+					sb.append(line + System.getProperty("line.separator"));
+				}
+				if (line.trim().endsWith("*/") && inComment) {
+					break;
+				}
+			}
+			br.close();
+		} catch (Exception e) {
+			System.out.println("Failed to open/read file " + path + "  " + e.getMessage());
+			fail();
+		}
+		String licence = null;
+		if (sb.length()> 0) {
+			licence = sb.toString();
+			if (!licence.contains("Copyright")) {
+				licence = null;
+			}
+		}
+			
+		return licence;
+	}
+	
+
+	/****************************************************ACTUAL TESTS************************************************************/
+	@Test
+	public void MultipleMmpsTest1 (){
+		System.out.println ("*********************traces****************************");
+		createListHeadersDicts("sbs");
+		//Call Raptor
+		InvokeCompiler("_traces", "sbs");		
+		//Check for header files
+		checkForTracesHeadersAndLicence("_traces");		
+	
+	}
+	
+
+	@Test
+	public void MultipleMmpsTest2 (){
+		System.out.println ("****************traces_mmpname**********************");
+		createListHeadersDicts("sbs");
+		//Call Raptor
+		InvokeCompiler("_traces_mmpname", "sbs");
+		//Check for header files
+		checkForTracesHeadersAndLicence("_traces_mmpname");		
+		
+	}
+	
+
+	@Test
+	public void MultipleMmpsTest3 (){
+		System.out.println ("**********traces_slash_target_ext****************");
+		createListHeadersDicts("sbs");
+		//Call Raptor
+		InvokeCompiler("_traces_slash_target_ext", "sbs");
+		//Check for header files
+		checkForTracesHeadersAndLicence("_traces_slash_target_ext");		
+		
+	}
+
+	@Test
+	public void MultipleMmpsTest4 (){
+		System.out.println ("**********traces_slash_target_ext_commonsource****************");
+		createListHeadersDicts("sbs");
+		//Call Raptor
+		InvokeCompiler("_traces_slash_target_ext_commonsource", "sbs");
+		//Check for header files
+		checkForTracesHeadersAndLicence("_traces_slash_target_ext_commonsource");						
+	}
+
+	@Test
+	public void MultipleMmpsTest5 (){
+		System.out.println ("**********traces_target_type****************");
+		createListHeadersDicts("sbs");
+		//Call Raptor
+		InvokeCompiler("_traces_target_type", "sbs");
+		//Check for header files
+		checkForTracesHeadersAndLicence("_traces_target_type");
+	}
+
+	@Test
+	public void MultipleMmpsTest6 (){
+		System.out.println ("**********traces_mixed****************");
+		createListHeadersDicts("sbs");
+		//Call Raptor
+		InvokeCompiler("_traces_mixed", "sbs");
+		//Check for header files
+		checkForTracesHeadersAndLicence("_traces_mixed");
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/src/TraceLocationConverterTest.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,82 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+import com.nokia.tracecompiler.TraceCompilerRootException;
+import com.nokia.tracecompiler.engine.*;
+import static org.junit.Assert.*;
+import java.io.*;
+
+import org.junit.Test;
+
+import com.nokia.tracecompiler.project.*;
+
+
+public class TraceLocationConverterTest { 
+
+	
+	public static void main(String args[]) {		
+	      	org.junit.runner.JUnitCore.main(TraceLocationConverterTest.class.getName());
+	    }
+	
+	@Test
+    public void searchForOldGroupIdsTest() {  
+		
+		
+		try {
+			GroupNames.initialiseGroupName();
+		} catch (TraceCompilerRootException e) {
+			fail();
+		}
+		
+		
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds(""));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("                              "));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("123456789"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_FATAL=0x1"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_IMPORTANT=0x2"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_NORMAL=0x77"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_PERFORMANCE=0x4"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_STATE=0x5"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_STATE=5"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_STATE=5555"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_STATE=565nh"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_API=0x6"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_FLOW=0x7"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_DETAILED=0x8"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_DEBUG=0x9"));
+		assertFalse("Test case 1",TraceLocationConverter.searchForOldGroupIds("USER_DEFINED_TRACE=0xA1"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("USER_DEFINED_TRACE=0xEA"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_FATAL=0x81"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_ERROR=0x82"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_WARNING=0x83"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_BORDER=0x84"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_API=0x84"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_IMPORTANT=0x85"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_NORMAL=0x86"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_STATE=0x87"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_INTERNALS=0x88"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_DUMP=0x89"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_DEBUG=0x89"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_FLOW=0x8a"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_PERFORMANCE=0x8b"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_ADHOC=0x8c"));
+		assertTrue("Test case 1",TraceLocationConverter.searchForOldGroupIds("TRACE_EXTENSION=0x8d"));
+	}
+	
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/src/TracesInHeadersTest.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,210 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+
+public class TracesInHeadersTest {
+	
+		public static void main(String args[]) {		
+	      	org.junit.runner.JUnitCore.main(TracesInHeadersTest.class.getName());
+	    }
+	/****************************************************UTILITY FUNCTIONS FOR TESTS************************************************************/
+	
+	private static String epocroot = null; 
+	private static String projectdir = "testdata\\TracesInHeadersApps\\"; //$NON-NLS-1$
+	private static File compilerpath;
+	private static ProcessBuilder sbs_build = new ProcessBuilder("sbs.bat","-k","-c","winscw_udeb.tracecompiler");
+	private static ProcessBuilder sbs_reallyclean = new ProcessBuilder("sbs.bat","-k","-c","winscw_udeb.tracecompiler", "reallyclean");
+
+	@BeforeClass
+	static public void setEnvVariables() {
+		epocroot = System.getenv("EPOCROOT"); //$NON-NLS-1$
+		if(epocroot == null || (epocroot.length()==0)){
+			fail();
+		}
+		
+		// need to check that the path ends in a backslash
+		if(!epocroot.endsWith("\\")){ 
+			epocroot += "\\"; 
+		}
+	}
+	
+	
+	/**
+	 * This function invokes raptor on the desired test c++ project
+	 * 
+	 * @param path String specifying the path the compiler needs
+	 * 				  to run from
+	 */
+	public void InvokeCompiler(String path, String builder) {
+		System.out.println ("InvokeCompiler() for : " + builder);
+		
+		try{
+			
+			//set up the directory from which the process will be called
+			if (path.compareTo("_diffnames")==0){ //$NON-NLS-1$
+				
+				compilerpath = new File (epocroot+projectdir+"singlemmp_diffnames\\group\\"); //$NON-NLS-1$
+			} else if (path.compareTo("_samenames")==0){ //$NON-NLS-1$
+				
+				compilerpath = new File (epocroot+projectdir+"singlemmp_samenames\\group\\"); //$NON-NLS-1$
+			} else if (path.compareTo("_diffnames_tracesplus")==0){ //$NON-NLS-1$
+				
+				compilerpath = new File (epocroot+projectdir+"singlemmp_diffnames_tracesplus\\group\\"); //$NON-NLS-1$
+			} else if (path.compareTo("_samenames_tracesplus")==0){ //$NON-NLS-1$
+				
+				compilerpath = new File (epocroot+projectdir+"singlemmp_samenames_tracesplus\\group\\"); //$NON-NLS-1$
+			} else if (path.compareTo("_samenames")==0){ //$NON-NLS-1$
+				
+				compilerpath = new File (epocroot+projectdir+"singlemmp_samenames\\group\\"); //$NON-NLS-1$
+			} else if (path.compareTo("_separate_source")==0){ //$NON-NLS-1$
+				
+				compilerpath = new File (epocroot+projectdir+"multmmp_separate_source\\group\\"); //$NON-NLS-1$
+			} else if (path.compareTo("_comm_source")==0){ //$NON-NLS-1$
+				
+				compilerpath = new File (epocroot+projectdir+"multmmp_comm_source\\group\\"); //$NON-NLS-1$
+			} else if (path.compareTo("_comm_source_tracesplus")==0){ //$NON-NLS-1$
+				
+				compilerpath = new File (epocroot+projectdir+"multmmp_comm_source_tracesplus\\group\\"); //$NON-NLS-1$
+			} else if (path.compareTo("_import")==0){ //$NON-NLS-1$
+				
+				compilerpath = new File (epocroot+projectdir+"singlemmp_import\\group\\"); //$NON-NLS-1$
+			} 
+			else{
+			
+				System.out.println("Error: Unrecognised test case.");
+				fail();
+			}
+			
+			//set up the process builder object
+			sbs_build.directory(compilerpath);
+			sbs_reallyclean.directory(compilerpath);
+			sbs_build.redirectErrorStream(true);
+						
+			Process p = null;
+			String str = "";
+			//start the compiler
+			System.out.println("Starting build process ....");
+
+				System.out.println("Running sbs reallyclean on : " + compilerpath + " command: " + sbs_reallyclean.command().toString());
+				p = sbs_reallyclean.start();
+				readProcessOutput(p);
+				System.out.println("Running sbs on : " + compilerpath + " command: " + sbs_build.command().toString());
+				p = sbs_build.start();
+				str = readProcessOutput(p);
+			
+			int ret = p.exitValue();
+			System.out.println("build process ended....");
+			if (ret!=0){
+				if (path.compareTo("_import")==0){ //$NON-NLS-1$
+					System.out.println("build process expected to fail: "+str);
+				} else {
+					System.out.println("build process failed:"+str);
+					fail();
+				}
+			}
+		}
+		
+    	catch (Exception e){//Catch exception if any
+    		System.err.println("Error: " + e.getMessage());
+    		fail();
+        }
+		
+	}
+
+
+	static private String readProcessOutput(Process p) throws IOException {
+		InputStream inp = p.getInputStream();
+		
+			int c;
+			String str = "";	        
+			//read the output from the compiler into the input stream
+			while ((c = inp.read()) != -1) {
+		   	 str= str +((char)c);
+			}
+		return str;
+	}
+
+	
+
+	/****************************************************ACTUAL TESTS************************************************************/
+	@Test
+	public void TracesInHeradersTest1 (){
+		System.out.println ("*********************single mmp with diff names****************************");
+		//Call Raptor
+		InvokeCompiler("_diffnames", "sbs");
+	}
+	
+	@Test
+	public void TracesInHeradersTest2 (){
+		System.out.println ("*********************single mmp with same names****************************");
+		//Call Raptor
+		InvokeCompiler("_samenames", "sbs");
+	}
+	
+	@Test
+	public void TracesInHeradersTest3 (){
+		System.out.println ("*********************single mmp with diff names and using tarce/<taget>_<ext>****************************");
+		//Call Raptor
+		InvokeCompiler("_diffnames_tracesplus", "sbs");
+	}
+	
+	@Test
+	public void TracesInHeradersTest4 (){
+		System.out.println ("*********************single mmp with same names and using tarce/<taget>_<ext>****************************");
+		//Call Raptor
+		InvokeCompiler("_samenames_tracesplus", "sbs");
+	}
+	
+	@Test
+	public void TracesInHeradersTest5 (){
+		System.out.println ("*********************multiple mmp with separate source ****************************");
+		//Call Raptor
+		InvokeCompiler("_separate_source", "sbs");
+	}
+	
+	@Test
+	public void TracesInHeradersTest6 (){
+		System.out.println ("*********************multiple mmp with common source ****************************");
+		//Call Raptor
+		InvokeCompiler("_comm_source", "sbs");
+	}
+	
+	@Test
+	public void TracesInHeradersTest7 (){
+		System.out.println ("*********************multiple mmp with common source and traces/<target>_<ext> ****************************");
+		//Call Raptor
+		InvokeCompiler("_comm_source_tracesplus", "sbs");
+	}
+	
+	@Test
+	public void TracesInHeradersTest8 (){
+		System.out.println ("*********************Traces in header exported to epoc32 by another mmp****************************");
+		//Call Raptor
+		InvokeCompiler("_import", "sbs");
+	}
+	
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/test/testdata/test_opensystemtrace_types.h	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,532 @@
+/**
+* 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:
+* Trace API
+*
+*/
+
+
+
+/**
+ @file
+ @publishedPartner
+ @prototype
+*/
+
+
+#ifndef OPENSYSTEMTRACE_TYPES_H
+#define OPENSYSTEMTRACE_TYPES_H
+
+#ifdef __KERNEL_MODE__
+#include <kernel.h>
+#else //__KERNEL_MODE__
+#include <e32std.h>
+#endif //__KERNEL_MODE__
+
+
+/**
+@file
+@publishedPartner
+@prototype
+*/
+
+
+/**
+ * Every trace point must be statically assigned a group ID. This is
+ * essentially a “label” that allows identification of the intended use of
+ * the trace packets generated by the trace point. The Group ID will either 
+ * reflect a system wide Tracing use cases, such as identifying why a panic 
+ * occurred, or is assigned a meaning specific to a component, such as the 
+ * heap trace output from the kernel. In essence the Group ID is a way of 
+ * indicating that trace points / packets are related in some way. 
+ * @see TGroupIdRange for more information.
+ */
+typedef TUint8  TGroupId;
+
+/**
+ * The maximum possible value for TGroupId
+ */
+const static TGroupId KMaxGroupId = 255; // 2^8 - 1
+
+/**
+ * @deprecated Use TGroupId instead
+ * @see TGroupId
+ */
+typedef TUint8  TClassification;
+
+/**
+ * @deprecated Use KMaxGroupId instead
+ * @see KMaxGroupId
+ */
+const static TClassification KMaxClassification = KMaxGroupId;
+
+/**
+ * Each trace point must be statically assigned a ComponentId to indicate the
+ * module in which the trace point is defined. It should always be the UID3
+ * of the binary containing the trace point associated with the component ID. 
+
+ * The ComponentId and Group ID attributes of a trace point are independent.
+ */
+typedef TUint32 TComponentId;
+
+/**
+ * The maximum possible value for TComponentId
+ */
+const static TComponentId KMaxComponentId = 0xFFFFFFFF; // 2^32 - 1, or 4294967295 - 1
+
+/**
+ * The EXECUTABLE_DEFAULT_COMPONENTID can be used to define your own default
+ * specific ComponentId. This is done by defining the macro to be your new
+ * default value.
+ */
+#ifdef EXECUTABLE_DEFAULT_COMPONENTID
+#define FW_DEFAULT_COMPONENTID EXECUTABLE_DEFAULT_COMPONENTID
+#else
+#define FW_DEFAULT_COMPONENTID TTraceContext::DefaultComponentId()
+#endif
+
+/**
+ * Trace IDs have two functions in a trace packet:
+ * 
+ * 1. They identify the individual trace point that created the trace packet.
+ * 2. They specify the format of the trace packet payload. 
+ * 
+ * This only works if the Trace ID value is unique for a given Group ID and 
+ * Component ID, if present, and should be statically assigned during development 
+ * when a trace point is created.  
+ * 
+ * The meaning of a TraceId is specific to the ComponentId and Group ID of the
+ * associated trace point.
+ */
+typedef TUint16 TTraceId;
+
+/**
+ * The maximum possible value for TTraceId
+ */
+const static TTraceId KMaxTraceId = 65535; // 2^16 - 1
+
+/**
+ * Used in packets produced by the Print and Printf functions.
+ *
+ * Note that this format should not be used on the
+ * device by clients of OST. This symbol is only marked
+ * as published to partners to give host side tools access to
+ * it.
+ *
+ * @deprecated No replacement is provided as this symbol is no 
+ * longer needed as a result of the alignment of trace attributes 
+ * in OSTv2.
+ * @see TTraceId
+ */
+const static TTraceId KFormatPrintf = 0;
+
+/**
+ * Used in packets produced by the Print and Printf functions 
+ * for unicode descriptors.
+ *
+ * Note that this format should not be used on the
+ * device by clients of OST. This symbol is only marked
+ * as published to partners to give host side tools access to
+ * it.
+ * 
+ * @deprecated No replacement is provided as this symbol is no 
+ * longer needed as a result of the alignment of trace attributes 
+ * in OSTv2.
+ * @see TTraceId
+ */
+const static TTraceId KFormatPrintfUnicode = 1;
+
+/**
+ * This value was used by UTFv2 clients to specify the start of 
+ * the range of enums used to define their format ids. This is 
+ * no longer necessary as in OSTv2 clients are allowed to use the
+ * whole range without exception. 
+ *
+ * @deprecated No replacement is provided as this symbol is no 
+ * longer needed as a result of the alignment of trace attributes 
+ * in OSTv2.
+ * @see TTraceId
+ */
+const static TTraceId KInitialClientFormat = 512;
+
+/**
+ * Include the thread identification into the trace packet at run-time.
+ * The thread identification is used as an identifier to resolve
+ * thread and process names in conjunction with
+ * Group ID EThreadIdentification = 3.
+ */
+enum THasThreadIdentification
+    {
+    /** Do add the thread identification to the trace packet */
+    EAddThreadIdentification = ETrue,
+    /** Don't add the thread identification */
+    ENoThreadIdentification = EFalse
+    };
+
+
+/**
+ * The EXECUTABLE_DEFAULT_HAS_THREAD_IDENTIFICATION can be used to
+ * define the default setting for adding or not adding the thread
+ * identification in a trace packet. This is done by defining
+ * the macro to be your new default value.
+ */
+#ifdef EXECUTABLE_DEFAULT_HAS_THREAD_IDENTIFICATION
+#define FW_DEFAULT_HAS_THREAD_IDENTIFICATION EXECUTABLE_DEFAULT_HAS_THREAD_IDENTIFICATION
+#else
+#define FW_DEFAULT_HAS_THREAD_IDENTIFICATION EAddThreadIdentification
+#endif
+
+
+/**
+ * Add the program counter into the trace packet at run-time.
+ * The program counter is used to indicate where the CPU is in the
+ * instruction sequence. This can be used to locate the line of code
+ * or routine the trace was sent from.
+ */
+enum THasProgramCounter
+    {
+    /** Do add the program counter to the trace packet. */
+    EAddProgramCounter = ETrue,
+    /** Don't add the program counter */
+    ENoProgramCounter = EFalse
+    };
+
+
+/**
+ * The EXECUTABLE_DEFAULT_HAS_PC can be used to
+ * define the default setting for adding or not adding the
+ * program counter in a trace packet. This is done by defining
+ * the macro to be your new default value.
+ */
+#ifdef EXECUTABLE_DEFAULT_HAS_PC
+#define FW_DEFAULT_HAS_PC EXECUTABLE_DEFAULT_HAS_PC
+#else
+#define FW_DEFAULT_HAS_PC ENoProgramCounter
+#endif
+
+/**
+ * The division of the Group IDs into different ranges aims to manage the
+ * contention for the namespace.
+ *
+ * It is recommended that all developers use the Reserved range as far as possible.
+ *
+ * @see TGroupId
+ */
+enum TGroupIdRange
+    {
+    /**
+     * The Group IDs in the Reserved range should be used by the majority of trace
+     * points. This range of Group IDs are intended to identify which of the
+     * most common trace use-cases a trace point is contributing to. They are unique
+     * across the system.
+     *
+     * The Group IDs in this series are defined solely by the Symbian Foundation but are
+     * intended for use by any software on a device.
+     *
+     * These Group IDs should only be enabled at run-time if the filtering on
+     * ComponentIds functionality is also enabled. This is to avoid accidentally causing
+     * trace live-locks from occurring when just the Group IDs is enabled. This could
+     * happen because trace points in components involved in the current trace output
+     * path might also be assigned these Group IDs. Filtering on ComponentIds means
+     * that those trace points can be activated only when it’s known to be safe to do
+     * so and not accidentally enabled with a Group IDs.
+     *
+     * @see TGroupIdReserved
+     */
+    EOstReservedRangeFirst = 0,
+
+    /**
+     * @see EOstReservedRangeFirst
+     */
+    EOstReservedRangeLast = 221,
+
+    /**
+     * The meaning of Group IDs in this range are defined on a per-component basis.
+     * They are to be unique within a component.
+     */
+    EUserDefinedRangeFirst = 222,
+
+    /**
+     * @see EUserDefinedRangeFirst
+     */
+    EUserDefinedRangeLast = 253,
+    
+    /**
+     * Only for use on the device by test code.
+     *
+     * Trace points with these Group IDs should not be released as part of a
+     * production device.
+     */
+    ETestingRangeFirst = 154,
+
+    /**
+     * @see ETestingRangeFirst
+     */
+    ETestingRangeLast = KMaxGroupId
+    };
+
+/**
+ * The Group IDs in the Reserved range should be used by the majority of
+ * trace points. This range of Group IDs are intended to identify which
+ * of the most common trace use-cases a trace point is contributing to.
+ *
+ * @see TGroupId
+ * @see TGroupIdRange
+ * @see EOstReservedRangeFirst
+ */
+enum TGroupIdReserved
+    {
+    /**
+     * Used when a fatal error, such as a panic, has occurred or when providing information 
+     * on the execution state immediately before the decision to panic.
+     *
+     * A trace point with this Group ID should be used when a fatal condition is detected 
+     * which will result in the flow of execution being halted in the thread associated with 
+     * the trace point.
+     *
+     * Can also provide information describing where a panic has been dealt with. 
+     *
+     * Trace points using this Group ID should be present in a release device. 
+     */
+    TRACE_FATAL = 149,
+
+    /**
+     * Used when an error has occurred which means that the current operation cannot continue 
+     * but is not sufficiently serious to cause a fatal error. These trace packets should 
+     * contain not just the error code but any relevant information about the execution state 
+     * when the error occurred.
+     *
+     * To be used for all types of error including include situations where the errors are 
+     * returned from a function or via a leave. 
+     *
+     * This Group ID also provides information describing where an error has been handled. 
+     */
+    TRACE_ERROR=150,
+
+    /**
+     * Used when something unexpected or unusual has occurred that does not stop the
+     * current operation from happening but may result in unintended side effects or
+     * actual errors later on.
+     */
+    TRACE_WARNING = 151,
+
+    /**
+     * Used to describe activity at the edges of a trace component. 
+     *
+     * Includes data about exported or published functions defined by a trace component as 
+     * well as calls out of the component to get significant information. Exactly what 
+     * is significant depends on the trace component in question. For instance, reading in a 
+     * setting from an INI file would be significant but calling RArray::Count() would not be. 
+     *
+     * The information in this Group ID should be enough to allow someone unfamiliar with the 
+     * trace component to get a high level understanding of what functionality it has executed.
+     */
+    TRACE_BORDER = 152,
+    
+    /**
+    * @deprecated Use TRACE_BORDER instead
+    */
+    TRACE_API = TRACE_BORDER,
+    
+    /**
+     * @deprecated Use TRACE_NORMAL or one of the other reserved Group IDs instead
+     */
+    TRACE_IMPORTANT = 153,
+    
+    /**
+     * Used to described the normal activity within a trace component that might be of interest
+     * to people who use the component.
+     *
+     * The information in this Group ID should be enough to allow someone unfamiliar with the 
+     * trace component to start to understand why a component is behaving the way it is perhaps 
+     * to help with diagnosing problems with the way the component is being used.
+     */
+    TRACE_NORMAL = 154,
+
+    /**
+     * Intended for tracing the state transitions of an application or service such as those
+     * performed by a machine.
+     *
+     * Trace packets using this Group ID should contain the name of the
+     * changed state variable and the new value.
+     */
+    TRACE_STATE  = 155,
+
+    /**
+     * Used to provide detailed information about the normal activity of a trace component
+     * to help a developer, who is familiar with the component, to understand what it is doing.
+     */
+    TRACE_INTERNALS = 156,
+
+    /**
+    * @deprecated Use TRACE_INTERNALS instead
+    */
+    TRACE_DETAILED = TRACE_INTERNALS,
+    
+    /**
+     * Used when there is a need to output large amounts of data through individual trace
+     * points that would likely cause significant intrusion if included under one of the
+     * other Group IDs.
+     *
+     * This Group ID is intended to be used in conjunction with the TRACE_INTERNALS
+     * Group ID to provide more details when debugging a specific trace component.
+     */
+    TRACE_DUMP = 157,
+
+    /**
+    * @deprecated Use TRACE_DUMP instead
+    */    
+    TRACE_DEBUG = TRACE_DUMP,
+    
+    /**
+     * Used to provide comprehensive information on what paths the execution takes within
+     * functions.
+     *
+     * This Group ID is intended mainly to be used by tools that add temporary instrumentation 
+     * points specifically to output this data.
+     */
+    TRACE_FLOW = 158,
+
+    /**
+     * Used to output data about the execution time, memory usage, disk usage, power
+     * utilisation and any other performance characteristics of the associated trace 
+     * component.
+     *
+     * This data may need to be processed before it can provide effective metrics. E.g.
+     * the time between two timestamps might need to be computed.
+     *
+     * Intended only to be used to output a small amount of data to ensure that it 
+     * creates the smallest possible intrusion since otherwise the act of tracing would 
+     * devalue the information it is intended to provide.
+     */
+    TRACE_PERFORMANCE = 159,
+
+    /**
+     * May be used when adding temporary trace points during a debugging session to 
+     * distinguish them from existing instrumentation. 
+     */
+    TRACE_ADHOC = 160,
+    
+    /**
+     * This Group ID is reserved for future use to allow the Group ID range to be expanded 
+     * to cover more than current 256 different values.
+     *
+     * If trace is output on this Group ID at some point in the future then this indicates 
+     * that another mechanism (yet to be decided) will be used to indicate the actual 
+     * Group ID for the trace.
+     */
+    TRACE_EXTENSION = 161,
+
+    /**
+	 * Not intended to be used by code including this header.
+	 * 
+     * Provided to allow the following compile time assert (should NOT be used):
+     * EGroupIdReservedHighWaterMark <= EOstReservedRangeLast + 1
+     *
+     */
+    EGroupIdReservedHighWaterMark
+    } ;
+
+// Check high water mark for the reserved Group ID range
+__ASSERT_COMPILE(EGroupIdReservedHighWaterMark <= EOstReservedRangeLast + 1);
+
+/**
+ * @see TGroupId
+ * @see ETestingRangeFirst
+ * @test
+ */
+enum TGroupIdTesting
+    {
+    /**
+     * This Group ID may be used for testing purposes and is not intended to be used in 
+     * production code. 
+     */
+    TRACE_TESTING1 = ETestingRangeFirst,
+
+    /**
+     * The same as for TRACE_TESTING1
+     */
+    TRACE_TESTING2 = 155,
+
+    /**
+	 * Not intended to be used by code including this header.
+	 * 
+     * Provided to allow the following compile time assert (should NOT be used):
+     * EGroupIdTestingHighWaterMark <= ETestingRangeLast + 1
+     *
+     */
+    EGroupIdTestingHighWaterMark
+    };
+
+// Check high water marks for the testing Group ID range
+__ASSERT_COMPILE(EGroupIdTestingHighWaterMark <= ETestingRangeLast + 1);
+
+/**
+ * @deprecated Use enumerations from TGroupIdReserved instead
+ * @see TGroupId
+ * @see TGroupIdRange
+ * @see EOstReservedRangeFirst
+ */
+enum TClassificationAll
+    {
+    EPanic = TRACE_FATAL,
+    EError = TRACE_ERROR,
+    EWarning = TRACE_WARNING,
+    EBorder = TRACE_BORDER,
+    EState = TRACE_STATE,
+    EInternals = TRACE_INTERNALS,
+    EDump = TRACE_DUMP,
+    EFlow = TRACE_FLOW,
+    ESystemCharacteristicMetrics = TRACE_PERFORMANCE,
+    EAdhoc = TRACE_ADHOC,
+    EClassificationAllHighWaterMark
+    };
+
+// Check high water mark for the 'All' classification range
+__ASSERT_COMPILE(EClassificationAllHighWaterMark <= EOstReservedRangeLast + 1);
+
+/**
+ * @deprecated Use enumerations from TGroupIdReserved instead
+ * @see TGroupId
+ * @see TGroupIdRange
+ * @see EOstReservedRangeFirst
+ */
+enum TClassificationSymbianTwo
+	{
+	EClassificationExtension = TRACE_EXTENSION,
+	EClassificationSymbianTwoHighWaterMark
+	};
+
+// Check high water marks for the Symbian Two classification range
+__ASSERT_COMPILE(EClassificationSymbianTwoHighWaterMark <= EOstReservedRangeLast + 1);
+
+/**
+ * @deprecated Use enumerations from TGroupIdTesting instead
+ * @see TGroupId
+ * @see TGroupIdRange
+ * @see ETestingRangeFirst
+ * @test
+ */
+enum TClassificationTesting
+	{
+	ETesting1 = TRACE_TESTING1,
+	ETesting2 = TRACE_TESTING2,
+	EClassificationTestingHighWaterMark,
+	};
+
+// Check high water marks for classification ranges
+__ASSERT_COMPILE(EClassificationTestingHighWaterMark <= ETestingRangeLast + 1);
+
+
+#endif //OPENSYSTEMTRACE_TYPES_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/tracecompiler/readme.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,75 @@
+------------TraceCompiler------------
+
+
+
+----What is TraceCompiler?----
+
+TraceCompiler will find OST (Open System Trace) traces from source files and generate needed headers and decode files for them
+during component compilation time.
+
+
+
+----What are OST traces?----
+
+Open System Trace traces. Macros can be found from the header OpenSystemTrace.h. OST is a binary tracing concept for good performance
+and run-time activation of traces.
+
+
+
+----How to set up TraceCompiler?----
+
+Remove comments before exports from group folder bld.inf
+When compiled from the group folder, will export itself to /epoc32/tools folder.
+
+Usually TraceCompiler is already integrated to Symbian build system, so there is no need to run TraceCompiler separately. Symbian build system calls 
+TraceCompiler automatically during component compilation. 
+
+If TraceCompiler is not integrated to build system but is needed to be run automatically when building a component
+abld.pl in /epoc32/tools/ needs to be changed to call tracecompiler.pl file. Note that the change might already be there.
+
+Change is done after a line like this:
+  "foreach $LoopBld (@Blds) {"
+			
+And the change is this: (First line is comment)
+
+	# Add the TraceCompiler once to the Calls array when TARGET is called
+	$Command eq "TARGET" and not scalar grep(/tracecompiler\.pl/,@Calls) and push @Calls, "perl /epoc32/tools/tracecompiler.pl $Plat $Program";
+
+
+		
+----How to use TraceCompiler?----
+
+Usually TraceCompiler is already integrated to Symbian build system, so there is no need to run TraceCompiler separately. Symbian build system calls 
+TraceCompiler automatically during component compilation. 
+
+If there is need to run TraceCompiler manually, it can be done following way:
+
+   perl /epoc32/tools/tracecompiler.pl <platform> [program]
+
+   For example: perl /epoc32/tools/tracecompiler.pl armv5
+		
+
+
+----How to actually get the traces?----
+Open System Trace macros use Symbian BTrace framework to forward the traces. To get these traces, you must implement a trace handler which will
+register itself to the Symbian BTrace using command BTrace::SetHandler( MyHandler ). Then it's up to you what to do with the traces.
+
+
+
+----What is happening in TraceCompiler?----
+
+1. tracecompiler.pl first runs a Java check to ensure that Java 1.5 or newer is found from the system. If this fails, tracecompiler.pl will exit.
+	 
+   If Java check is OK, tracecompiler.pl opens a "abld.bat" file which is generated by command "bldmake bldfiles". From that file, a path to
+   MAKEFILE generated by "bldmake bldfiles" is searched. This MAKEFILE is then opened and is parsed for a list of project MMP files. These MMP
+   files are then forwarded to the tracecompiler_parse_mmp.pl script.
+	 
+2. tracecompiler_parse_mmp.pl gets a MMP file as a parameter. It parses the MMP file for UID of the component and paths to all the source files.
+	 NOTE that MACROS are NOT supported! If UID cannot be found from the MMP file, tracecompiler_parse_mmp.pl will exit. If UID is found,
+	 TraceCompiler Java application is started and the component UID is given to it as a parameter. After it's started, component name, the path
+	 to the MMP file of the component and a list of source paths are send to STDOUT of TraceCompiler Java application. When all source paths are
+	 send, tracecompiler_parse_mmp.pl sends end tag "*ENDOFSOURCEFILES*" to TraceCompiler so it knows all the sources are then sent.
+	 
+3. TraceCompiler Java application listens to STDIN for component name, MMP file path and the paths to the source files. When it receives
+   "*ENDOFSOURCEFILES*" tag, it starts processing the source files. It finds all OST traces from the source files and generates needed headers
+   for the application to compile properly. It also generates autogen header and Symbian Dictionary file from the traces.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/tracecompiler/release_note.txt	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,112 @@
+NOTE: JRE1.5 is needed to run TraceCompiler.
+
+TraceCompiler 2.3.0
+
+New stuff in 2.3.0
+	- TraceCompiler refactored for Symbian Foundation.
+
+
+New stuff in 2.2.4
+	- Bug Fix - Trace compiler entry/exit errors with no paramter or return value
+	- Allow TAB in trace point text.
+	- Allow trace point text to span over multiple lines but TraceCompiler removes the line-feed character.
+	- improve the code to create the trace folder path to avoid any hickups in multiple mmp projects
+	- Improve the build.xml for raptor to build only the rel version of TraceCompiler and therfore avoid the clash between rel and deb when creating traceCompiler.zip file.
+
+New stuff in 2.2.3
+	- Bug Fix - 10. DEF144527: Critical - Adding OST to .h or .inl files can cause OstTraceGenX(...) redefined errors
+	
+New stuff in 2.2.2
+	- Bug fix - TCF-525 Critical: (TSW:EJRK-842AW2) IDO BAT - KernelHooks_Component is missing from pmd file
+
+New stuff in 2.2.1
+
+	- Change - TraceCompiler now support mulitple mmps in one bld.inf by provinding an new command 
+		line interface wher users can pass the traces folder in. This is a continuation of the 
+		previous release to enable the new feature for abld.
+
+New stuff in 2.2.0
+
+	- Change - TraceCompiler now support mulitple mmps in one bld.inf by provinding an new command 
+		line interface wher users can pass the traces folder in.
+New stuff in 2.1.1 - 2.1.2
+
+	- Bug fix - TraceCompiler did not parse function parameter correctly in all cases
+	- Bug fix - TraceCompiler did not work in Linux
+  
+New stuff in 2.0.0 - 2.0.1
+
+	- Change - TraceCompiler automatically converts deprecated group names to valid group names
+               (TRACE_API -> TRACE_BORDER, TRACE_DEBUG- > TRACE_DUMP, TRACE_DETAILED -> TRACE_INTERNALS)
+	- Bug fix - TraceCompiler did not work in Linux 
+	
+New stuff in 1.3.0 - 1.3.1
+
+	- Change - Trace compiler now reads in the group IDs from opensystemtrace_types.h
+	- Change - Code cleanup
+  
+New stuff in 1.2.0 - 1.2.7
+
+	- Change - TraceCompiler source code separated from TraceBuilder source code
+	- Change - Decode plugins can be added or removed
+	- Bug fix - 32-bit alignment was not done correctly in generated OstTraceGen1 inline functions 
+	- Bug fix - TraceCompiler did not handle empty strings correctly
+	- Bug fix - Wrong type definition generated for Performance traces
+	- Bug fix - Long traces were corrupted
+	- Bug fix - TRACE_PERFORMANCE group is now reserved only to performance event traces and 
+	            TRACE_STATE group is now reserved only to event traces
+	- Bug fix - Trace garbled if there were 16 and 8 bit descriptors in same trace
+
+New stuff in 1.1.0 - 1.1.6
+
+	- Change - Changed Performance Event Trace output format
+	- Change - Symbian Foundation related changes
+	- Bug fix - OstTraceData did not work
+	- Bug fix - Traces that contained both string and number parameter did not work correctly	
+	- Bug fix - Sometimes trace ID's changed during every compilation
+	- Bug fix - Trace with octal parameter didn't compile
+	- Bug fix - If EPOCROOT was like C:\S60, Dictionaries were exported to C:\S60epoc32\ost_dictionaries\
+
+New stuff in 1.0.4 - 1.0.42
+
+	NOTE! Format of the fixed_id.definitions file has changed from TraceBuilder version 1.0.20
+
+	- New feature - TraceCompiler now adds trace name to the Dictionaries
+	- New feature - TraceCompiler support non-source files that are listed in trace.properties file
+	- New feature - Support both "traces_<component name>" and "traces" as trace project directory name
+	- New feature - Support for -clean and -final
+	- New feature - Support to fixed group and trace ids
+	- New feature - Get export path from EPOCROOT environment variable
+	- New feature - Added support to type "p" in the OST macro	
+	- New feature - Possible to send over 80 byte traces (max. 512)
+	- Bug fix - Problems tracing string parameters whose length was 3 or fewer bytes.	
+	- Bug fix - TraceCompiler did not to parse constant pointers
+	- Bug fix - Descriptor's length in trace is not checked
+	- Bug fix - TraceCompiler did not support state transition macros
+	- Bug fix - TraceCompiler did not understand namespaces
+	- Bug fix - TraceCompiler did not generate OstTraceGenExt inline function for TTime parameter type
+	- Bug fix - In some cases TraceCompiler skiped trace ids
+	- Bug fix - Traces folder was generated even component doesn't have any OST traces
+	- Bug fix - Wrong trace ID is assigned to new Flow trace
+	- Bug fix - Autogen file got corrupted with special characters in parameter name
+	- Bug fix - Trace with only parameters doesn't work sometimes
+	- Bug fix - Supports %X format character
+	- Bug fix - Supports more format characters like %lx and %llx
+
+New stuff in 1.0.2 - 1.0.3
+
+	- Bug fix - Special characters crashed TraceCompiler
+	- Bug fix - In some cases TraceCompiler created "Traces" folder to wrong place
+
+New stuff in 0.25 - 0.25.49:
+
+	- New feature - Release note added
+	- Bug fix - TraceCompiler did not handle path correctly if sourcepath was "."
+	- Bug fix - TraceCompiler did not try to find group or traces folder deep enough
+	- Bug fix - In some cases TraceCompiler created "Traces" folder to wrong place
+	- Bug fix - TraceCompiler did not understand "/" path separators
+	- Bug fix - TraceCompiler did not convert "&" to "&amp;" in trace text. Fixed again in 0.25.45
+	- Bug fix - TraceCompiler assigned same ID for two groups
+	- Bug fix - TraceCompiler / TraceBuilder added extra backslash marks to dictionary
+	- Bug fix - Autogen headers are not always generated
+	- Bug fix - TraceCompiler did not understand concatenation of strings
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/tracecompiler/tracecompiler.pl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,296 @@
+#
+# Copyright (c) 2009-2010 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:
+#
+# Finds MMP paths from component makefiles and forwards them to MMP parser
+#
+#!perl -w
+use FindBin;
+my $trace_compiler_path;
+
+BEGIN
+{
+  # Get current directory as TraceCompiler path
+  $trace_compiler_path = $FindBin::Bin; # e.g. X:/epoc32/tools
+  $trace_compiler_path =~ s/\\/\//g; # Replace all "\" with "/"
+  $trace_compiler_path =~ s/\/$//; # Remove possible trailing slash
+}
+
+use lib $trace_compiler_path;
+
+use strict;
+use env;
+use Cwd;
+use tracecompiler;
+use tracecompiler_mmp_data;
+
+# EPOC root is two levels down from TraceCompiler level
+my $epocroot = tracecompiler::concatenatePath($trace_compiler_path, "../../");
+$epocroot =~ s/\/$//; # Remove possible trailing slash
+my $drive = substr($epocroot, 0, 2);
+my $build_target;
+my $project_name;
+my $action = "RUN";
+
+# Get Java command or EXIT if not found
+my $java_command = tracecompiler::getJavaCommand();
+
+if (not defined $java_command)
+{
+  print STDERR "Java 1.5 or newer required!\n";
+  exit;
+}
+
+#-------------------------------------------------------
+# Go through command line arguments
+#-------------------------------------------------------
+while ( @ARGV )
+{
+  my $arg = shift(@ARGV);
+  
+  # Print version information
+  if ($arg eq "-v")
+  {
+    my $version = tracecompiler::getTraceCompilerVersion();
+    print $version;
+    exit;
+  }
+  # Clean TraceCompiler generated files
+  elsif ($arg eq "-clean")
+  {
+    $action = "CLEAN";
+  }
+  # Finalize TraceCompiler running
+  elsif ($arg eq "-final")
+  {
+    $action = "FINAL";
+  }
+  # Build target (e.g. armv5)
+  elsif (not defined $build_target)
+  {
+    $build_target = $arg;
+  }
+  # Project name (e.g. MyComponent)
+  else
+  {
+    $project_name = $arg; 
+  }
+}
+
+#-------------------------------------------------------
+# Build target must now be defined or print usage info
+#-------------------------------------------------------
+if (not defined $build_target)
+{
+  my $version = tracecompiler::getTraceCompilerVersion();
+  print $version;
+  print "\nUsage: tracecompiler.pl build_target in the folder containing bld.inf. bldmake bldfiles must be run before this.\n";
+  print "Example: tracecompiler.pl armv5\n";
+  exit;
+}
+
+my $return_string = "";
+
+#-------------------------------------------------------
+# Find component makefile path from abld.bat
+#-------------------------------------------------------
+tracecompiler::debugTraceCompilerVersion();
+tracecompiler::debugMsg("Find component makefile path from abld.bat");
+open(ABLD, "<abld.bat") or die $!;
+my $makefile;
+while (<ABLD>)
+{
+  if (/ABLD.PL/)
+  {
+    my $makefilepath = $_;
+    $makefilepath =~ s/perl -S ABLD.PL "(.*)\\" .*$/$1/;
+    chop($makefilepath);
+    
+    # Change all "\" characters to "/"
+    $makefilepath =~ s/\\/\//g;
+    
+    $makefilepath = "$epocroot/epoc32/build".$makefilepath;
+    $makefile = $makefilepath.$build_target.".MAKE";
+  }
+}
+close ABLD or die $!;
+
+#-------------------------------------------------------
+# Find project makefile paths from component makefile
+#-------------------------------------------------------
+my @projectmakefiles;
+my $mmps;
+
+tracecompiler::debugMsg("Find project makefile paths from component makefile $makefile");
+
+open(MAKEFILE, "<$makefile") or (print STDERR "Cannot open makefile $makefile\n" and exit);
+while (<MAKEFILE>)
+{
+  my $line = $_;
+    
+  if ($line =~ /\"([^\"]+?)\"\s+\"PRJ_.*MMPFILES\s+MMP\"\s+\"([^\"]+?)\"/i)
+  {
+    my $bldinf = $1;
+    my $mmp = $2;
+    
+    tracecompiler::debugMsg("Found BLD file: $bldinf");
+    
+    # Remove bld.inf from the end of the path
+    $bldinf =~ s/(.*)[\\\/].*/$1\//;
+    
+    my $mmp_file = tracecompiler::concatenatePath($bldinf, $mmp);
+        
+    # Change all "//" to "/"
+    $mmp_file =~ s/\/\//\//g;
+    
+    # If .mmp is missing from the end, add it
+    if ($mmp_file !~ /\.mmp$/i)
+    {
+      $mmp_file .= ".mmp";
+    }
+        
+    tracecompiler::debugMsg("Found MMP file: $drive$mmp_file\n");
+    
+    # If project name is defined, only add that MMP to the list of mmp files
+    if (defined $project_name)
+    {
+        if ($mmp_file =~ /($project_name.mmp)$/i)
+        {
+          $mmps .= $drive . $mmp_file . " ";
+        }       
+    }
+    else
+    {
+      $mmps .= $drive . $mmp_file . " ";  
+    }
+  }
+
+}
+close MAKEFILE or die $!;
+
+#-------------------------------------------------------
+# Call the MMP parser for each MMP (or clean / final)
+#-------------------------------------------------------
+if (defined $mmps)
+{
+  foreach my $mmp (split(" ", $mmps))
+  {
+    # Pass MMP file path to Parse MMP
+    if ($action eq "RUN")
+    {
+      my $command = "perl $trace_compiler_path/tracecompiler_parse_mmp.pl $mmp";
+      tracecompiler::debugMsg("Call the MMP parser. Command: $command\n");
+      print qx($command);
+    }
+    
+    # Clean files using this MMP
+    elsif ($action eq "CLEAN")
+    {
+    	my $mmpObject = tracecompiler_mmp_data->new($mmp);
+      cleanTraceCompilerFiles($mmpObject);
+    }
+    
+    # Finalize files using this MMP
+    elsif ($action eq "FINAL")
+    {
+    	my $mmpObject = tracecompiler_mmp_data->new($mmp);
+      finalizeTraceCompilerRun($mmpObject);
+    }
+  }
+}
+else
+{
+  tracecompiler::debugMsg("Could not find any MMP files!");
+}
+
+
+
+
+
+#-------------------------------------------------------#
+#-------------------------------------------------------#
+#--------------------SUBROUTINES------------------------#
+#-------------------------------------------------------#
+#-------------------------------------------------------#
+
+#-------------------------------------------------------
+# Cleans TraceCompiler generated files
+#-------------------------------------------------------
+sub cleanTraceCompilerFiles
+{
+  tracecompiler::debugMsg("Clean TraceCompiler Files");
+  my $mmpObj = $_[0];
+  if($mmpObj->{tracespaths}) {
+  	foreach my $tracesFolder (@{$mmpObj->{tracespaths}})
+  	{
+    	if (-e $tracesFolder and opendir(DIR, $tracesFolder))
+    	{
+      	while (defined(my $file = readdir(DIR)))
+      	{
+        	# Delete files ending with *Traces.h
+        	if ($file =~ /Traces\.h$/i)
+        	{
+          	print "Cleaning: " . $tracesFolder . "/" . $file . "\n";
+          	unlink $tracesFolder . "/" . $file || print $!;
+        	}
+        	# Delete cache files
+        	elsif ($file =~ /\.cache$/i)
+        	{
+          	print "Cleaning: " . $tracesFolder . "/" . $file . "\n";
+          	unlink $tracesFolder . "/" . $file || print $!;
+        	}
+      	}
+      	closedir(DIR);
+    	}
+ 	 }
+ 	}
+  
+  tracecompiler::debugMsg("Cleaning TraceCompiler Files ready\n");
+  
+  # Finalize TraceCompiler run
+  finalizeTraceCompilerRun($mmpObj);
+}
+
+#-------------------------------------------------------
+# Finalizes TraceCompiler run
+#-------------------------------------------------------
+sub finalizeTraceCompilerRun
+{
+	tracecompiler::debugMsg("Finalize TraceCompiler Run");
+	my $mmpObj = $_[0];
+	if($mmpObj->{tracespaths}) {
+	foreach my $tracesFolder (@{$mmpObj->{tracespaths}})
+	{
+		my $defFile = $tracesFolder . "/" . "OstTraceDefinitions.h";
+		# Open OstTraceDefinitions.h and read stuff to array
+		if (-e $defFile and open(FILE,"<$defFile"))
+		{
+			my @lines = <FILE>;
+			close(FILE);
+
+			# Write stuff back to OstTraceDefinitions.h
+			open(FILE,">$defFile") || exit;
+			foreach my $line (@lines)
+			{
+				# Comment out the define
+				$line =~ s/(.*)#define OST_TRACE_COMPILER_IN_USE/\/\/ #define OST_TRACE_COMPILER_IN_USE/;
+				print FILE $line;
+			}
+			close(FILE);
+		}
+	}
+}
+
+tracecompiler::debugMsg("Finalizing TraceCompiler Run ready\n");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/tracecompiler/tracecompiler.pm	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,174 @@
+#
+# 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:
+#
+# Module for TraceCompiler
+#
+package tracecompiler;
+
+# If this is 1, debug prints are shown
+my $DEBUG = 0;
+
+use FindBin;
+
+# Get current directory as TraceCompiler path
+my $trace_compiler_path = $FindBin::Bin;  # e.g. X:/epoc32/tools
+$trace_compiler_path =~ s/\\/\//g; # Replace all "\" with "/"
+$trace_compiler_path =~ s/\/$//; # Remove possible trailing slash
+
+#-------------------------------------------------------
+# Concatenate path
+#-------------------------------------------------------
+sub concatenatePath
+{
+  my $concatenatePathBase = $_[0];
+  my $concatenatePathFile = $_[1];
+  
+  my $backCount = 0;
+  
+  # Change all "\" characters to "/"
+  $concatenatePathBase =~ s/\\/\//g;
+  $concatenatePathFile =~ s/\\/\//g;
+  
+  # Replace all "/./" with "/"
+  $concatenatePathBase =~ s/\/\.\//\//g;
+  $concatenatePathFile =~ s/\/\.\//\//g;
+    
+  # Find how many back references there are and remove them
+  while ($concatenatePathFile =~ /\.\.\//g) 
+  { 
+    $backCount++ 
+  }
+  $concatenatePathFile =~ s/\.\.\///g;
+  
+  # If there is / in the end of the base remove it
+  $concatenatePathBase =~ s/\/$//;
+  
+  # Remove directories from the end of the path
+  $concatenatePathBase = reverse($concatenatePathBase);
+  for (my $i=0; $i<$backCount; $i++)
+  {
+    $concatenatePathBase =~ s/.*?\///;
+  }
+  $concatenatePathBase = reverse($concatenatePathBase);
+  
+  my $concatenatePathFullFilePath = "$concatenatePathBase\/$concatenatePathFile";
+  
+  # Replace again all "/./" with "/"
+  $concatenatePathFullFilePath =~ s/\/\.\//\//g;
+  
+  debugMsg("Concatenate returns $concatenatePathFullFilePath");
+  return $concatenatePathFullFilePath;
+}
+
+#-------------------------------------------------------
+# Get java command
+#-------------------------------------------------------
+sub getJavaCommand
+{
+  my @java_commands = ("/tools/ncp_tools/helium/external/jdk1.5/jre/bin/java.exe", "java.exe", "c:/apps/seeinstaller/jre/bin/java.exe");
+
+  my $java_command;
+  
+  foreach my $command (@java_commands)
+  {
+    if (checkJava($command))
+    {
+      $java_command = $command;
+      last;
+    }
+  }
+  
+  return $java_command;
+}
+
+#-------------------------------------------------------
+# Check java
+#-------------------------------------------------------
+sub checkJava
+{
+  open (IN, "$_[0] -version 2>&1 |");
+  while(<IN>)
+  {
+    if (/(\d+\.\d+)/)
+    {
+      if ($1 >= 1.5)
+      {
+        return 1;
+      }
+    } 
+  }
+  
+  return 0;
+}
+
+#-------------------------------------------------------
+# Gets TraceCompiler version number
+#-------------------------------------------------------
+sub getTraceCompilerVersion
+{
+  # Get Java command or EXIT if not found
+  my $java_command = getJavaCommand();
+
+  if (not defined $java_command)
+  {
+    return "Java 1.5 or newer required!\n";
+    exit;
+  }
+  
+   # run from class files class files
+  my $version_query_command = "$java_command -classpath $trace_compiler_path/tracecompiler com.nokia.tracecompiler.TraceCompilerMain -v";
+  
+  # run from jar  file	command
+  #my $version_query_command = "$java_command -jar $trace_compiler_path/tracecompiler.jar -version"; 
+
+  my $version = qx($version_query_command);
+    
+  return $version;
+}
+
+
+#-------------------------------------------------------
+# Debug Message. Writes to log file and outputs to screen.
+#-------------------------------------------------------
+sub debugMsg
+{
+  if ($DEBUG)
+  {
+    open FILE, ">>/tracecompiler_debug.txt" or die $!;
+    print FILE $_[0] . "\n";
+    close FILE;
+    
+    return print "DEBUG: $_[0]\n";
+  }
+}
+
+#-------------------------------------------------------
+# Writes TraceCompiler version to log and screen if Debug is on.
+#-------------------------------------------------------
+sub debugTraceCompilerVersion
+{
+  if ($DEBUG)
+  {   
+    open FILE, ">>/tracecompiler_debug.txt" or die $!;
+    my $version = getTraceCompilerVersion();
+    print FILE $version;
+    close FILE;
+    
+    return print "DEBUG: $version\n";
+  }
+}
+
+1;
+
Binary file tracefw/tracecompiler/tracecompiler/tracecompiler.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/tracecompiler/tracecompiler_mmp_data.pm	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,225 @@
+#
+# Copyright (c) 2010 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:
+#
+# Module for TraceCompiler. parse the mmp file and prepare an object to be re-used by tracecompiler.pl and tracecompiler_perse_mmp.pl
+#
+package tracecompiler_mmp_data;
+
+use strict;
+use warnings;
+use File::Basename;
+use tracecompiler;
+sub readMmp($);
+
+
+my $component_name;
+
+
+sub new
+{
+	my $pkg = shift;
+	my $self = {};
+	bless $self,$pkg;
+	my $mmp = shift;
+	if (defined($mmp) and -e $mmp) {
+	  tracecompiler::debugMsg("Starting to parse MMP file: $mmp");
+	  my $file_path = $mmp;
+	  $component_name =  basename $mmp;
+
+	  # Take the module name from the MMP file path. e.g. "X:/temp/mycomponent.mmp" would create "mycomponent"
+	  $component_name =~ s/([^\.]*).*/$1/;
+
+		$self->{mmpName} = $mmp;
+		$self->readMmp($mmp);
+	} else 
+	{
+		tracecompiler::debugMsg("tracecompiler_mmp_data :: Valid MMP file must be provided ...\n");
+	}
+
+	return $self;
+}
+
+# parse mmp and get the infos we need. This method moved from tracecompiler_parse_mmp.pl to here with some add-on
+sub readMmp($)
+{
+	my $self = shift;
+	my $file = shift;
+	if (-e $file)
+	{
+		tracecompiler::debugMsg("Starting to parse file: $file");
+		my @sources;
+		my @tracesfolders;
+		my $in_comment_block = 0;
+
+		# Get file path (remove file + extension)
+		my $file_path = dirname $file;
+
+		# Change "//" to "/"
+		$file_path =~ s/\/\//\//g;
+
+		my $current_src_path = $file_path;
+
+		# Go through lines
+		open FILE, "<$file" or die $!;
+		foreach my $line (<FILE>)
+		{
+			# Check if contains includes
+			if ($line =~ /#include.+\"(.*)?\"/i)
+			{
+				my $includedFile = $1;
+
+				# Get absolute path if the first character is not "\" or b"/"
+				if ($includedFile =~ /^[^\\\/]/)
+				{
+					$includedFile = tracecompiler::concatenatePath($file_path, $includedFile);
+				}
+				else
+				{
+					$includedFile = substr($file_path, 0, 2) . $includedFile;
+				}
+
+				if (defined $includedFile)
+				{
+					tracecompiler::debugMsg("Found #include from $file. Start parsing it..\n");
+					$self->readMmp($includedFile);
+				}
+			}
+
+			# Check if in comment block
+			if ($in_comment_block > 0)
+			{
+				if ($line =~ /\*\/(.*)/)
+				{
+					$line = $1;
+					$in_comment_block--;
+				}
+				if ($in_comment_block == 0)
+				{
+					# Comment block ended, continue parsing the line
+				}
+				else
+				{
+					# We are still in comment block, jump to next line
+					next;
+				}
+			}
+
+			# Delete possible comments in one line
+			$line =~ s/\/\/.*//; # //
+			$line =~ s/\/\*.*\*\///; # /* */
+
+			if ($line =~ /(.*?)\/\*/)
+			{
+				$line = $1;
+				$in_comment_block++;
+			}
+
+			# Find uid
+			if ($line =~ /uid.+0x([a-fA-F0-9]+)?/i)
+			{
+				$self->{uid} = $1;
+
+				tracecompiler::debugMsg("Found Uid: $self->{uid}");
+			}
+
+			#Find target
+			if($line =~ /target\s+(\S+)\.(\S+)/i)
+			{
+				$self->{target} = $1;
+				$self->{ext} = $2;
+			}
+
+			#Find target type
+			if($line =~ /targettype\s+(\S+)/i)
+			{
+				$self->{type} = $1;
+			}
+
+			# Find source path
+		if ($line =~ /sourcepath\s+([^\s]+)/i)
+			{
+				my $src_path = $1;
+
+				# Get absolute path if the first character is not "\" or "/"
+				if ($src_path =~ /^[^\\\/]/)
+				{
+					$current_src_path = tracecompiler::concatenatePath($file_path, $src_path . "/");
+				}
+				else
+				{
+					$current_src_path = substr($file_path, 0, 2) . $src_path;
+				}
+
+				tracecompiler::debugMsg("Source path changed to: $current_src_path");
+			}
+
+			# Find sources
+			while ($line =~ /source\s+([^\s]+)/i)
+			{
+				my $src = $1;
+
+				my $src_path = tracecompiler::concatenatePath($current_src_path, $src);
+
+				if (-e $src_path)
+				{
+					push(@sources, $src_path);
+
+					tracecompiler::debugMsg("Found source: $src_path");
+				}
+				else
+				{
+					tracecompiler::debugMsg("Source doesn't exist!: $src_path");
+				}
+
+				$line =~ s/\Q$src//;
+			}
+
+			#Find unserincludes
+			if ($line =~ /userinclude\s+([^\s]+)/i)
+			{
+				tracecompiler::debugMsg("Found userinclude: $line");
+				my $userinclude = $1;
+				$userinclude =~ s/\\/\//g;
+				my $tmp1 = $self->{target} . "_" . $self->{ext};
+				my $tmp2 = $self->{target} . "_" . $self->{type};
+				if (   $userinclude =~ /.*\/traces\/$tmp1$/i
+				or $userinclude =~ /.*\/traces_$tmp2$/i
+				or $userinclude =~ /.*\/traces_$component_name$/i
+				or $userinclude =~ /.*\/traces$/i)
+				{
+					tracecompiler::debugMsg("Found traces userinclude: $userinclude");
+					push(@tracesfolders, $userinclude);
+				}
+			}
+		}
+		if (scalar @sources > 0)
+		{
+			$self->{sources} = [@sources];
+		}
+		if (scalar @tracesfolders > 0)
+		{
+			$self->{tracespaths} = [@tracesfolders];
+		}
+		close FILE;
+
+		tracecompiler::debugMsg("Ending the parsing of MMP file: $file\n");
+	} else
+	{
+		tracecompiler::debugMsg("Could not find file: $file\n");
+	}
+
+}
+
+1;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/tracecompiler/tracecompiler_parse_mmp.pl	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,226 @@
+#
+# Copyright (c) 2009-2010 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:
+#
+# Parses UID and source files from given MMP files. Starts TraceCompiler Java application.
+#
+#!perl -w
+use FindBin;
+my $trace_compiler_path;
+
+
+BEGIN
+{
+  # Get current directory as TraceCompiler path
+  $trace_compiler_path = $FindBin::Bin; # e.g. X:/epoc32/tools
+  $trace_compiler_path =~ s/\\/\//g; # Replace all "\" with "/"
+  $trace_compiler_path =~ s/\/$//; # Remove possible trailing slash
+}
+
+use lib $trace_compiler_path;
+
+use strict;
+use warnings;
+use env;
+use FileHandle;
+use IPC::Open3;
+use tracecompiler;
+use tracecompiler_mmp_data;
+
+my $java_command = tracecompiler::getJavaCommand();
+
+if (not defined $java_command)
+{
+  print STDERR "Java 1.5 or newer required!\n";
+  exit;
+}
+
+# Global variables
+my $project_name;
+my $traces_folder = "";
+
+
+# run from class files
+
+my $command = "$java_command -classpath $trace_compiler_path/tracecompiler com.nokia.tracecompiler.TraceCompilerMain";
+
+# run from jar file
+#my $command = "$java_command  -jar $trace_compiler_path/tracecompiler/tracecompiler.jar";
+
+# Open MMP file
+foreach my $mmp_file (@ARGV)
+{
+  $traces_folder = "";
+  $project_name = $mmp_file;
+  
+  # Take the module name from the MMP file path. e.g. "X:/temp/mycomponent.mmp" would create "mycomponent"
+  $project_name =~ s/.*\/([^\.]*).*/$1/;
+  
+  tracecompiler::debugMsg("Module name: $project_name");
+  
+  # Parse sources in an own function
+  my $mmpObject = tracecompiler_mmp_data->new($mmp_file);
+    
+  # There must be UID
+  if (!$mmpObject->{uid})
+  {
+    tracecompiler::debugMsg("UID is not defined, don't call TraceCompiler!"); 
+    exit;
+  }
+  if (!$mmpObject->{target})
+  {
+  	tracecompiler::debugMsg("Target not defined, don't call TraceCompiler!"); 
+  	exit;
+  }
+  if (!$mmpObject->{type})
+  {
+  	tracecompiler::debugMsg("Target type not defined, don't call TraceCompiler!"); 
+  	exit;
+  }
+  if (!$mmpObject->{ext})
+  {
+  	tracecompiler::debugMsg("Target extension not defined, don't call TraceCompiler!"); 
+  	exit;
+  }
+  
+  # find out the right traces folder to use if ther is more than one and set the project name accordingly.
+  # the following order of the code is very important.
+  my $tmp;
+  if ($mmpObject->{tracespaths})
+  {
+  	#Check if there is one of the expected format
+  	
+  	#search for /trace/<target>_<ext>
+  	$tmp = $mmpObject->{target} ."_" . $mmpObject->{ext};
+  	my @list = grep(/.*\/traces\/$tmp\s*$/i, @{$mmpObject->{tracespaths}});
+  	
+  	if (scalar @list > 0) 
+  	{
+  		$traces_folder = pop(@list);
+  		$project_name = $mmpObject->{target} ."_" . $mmpObject->{ext};
+  		tracecompiler::debugMsg("Found traces folder 1: $traces_folder" ); 
+  	}
+  	 
+  	if ($traces_folder eq "" ) 
+  	{
+  		#search for /traces_<target>_<type>
+  		$tmp = $mmpObject->{target} ."_" . $mmpObject->{type};
+  		@list = grep(/.*\/traces_$tmp\s*$/i, @{$mmpObject->{tracespaths}});
+  		if (scalar @list > 0) 
+  		{
+  			$traces_folder = pop(@list);
+  			$project_name = $mmpObject->{target} . "_" . $mmpObject->{type};
+  			tracecompiler::debugMsg("Found traces folder 2: $traces_folder" ); 
+  		}
+  	}
+  	
+  	if ($traces_folder eq "" ) 
+  	{
+  		#search for /traces_<mmpname>
+  		@list = grep(/.*\/traces_$project_name\s*$/i, @{$mmpObject->{tracespaths}});
+  		if (scalar @list > 0) 
+  		{
+  			$traces_folder = pop(@list);
+  			tracecompiler::debugMsg("Found traces folder 3: $traces_folder" ); 
+  		}
+  	}
+  		
+  	if ($traces_folder eq "" ) 
+  	{
+  		#search for /traces
+  		@list = grep(/.*\/traces\s*$/i, @{$mmpObject->{tracespaths}});
+  		if (scalar @list > 0) 
+  		{
+  			$traces_folder = pop(@list);
+  			tracecompiler::debugMsg("Found traces folder 4: $traces_folder" ); 
+  		}
+  	}
+  }
+  else 
+  {
+  	tracecompiler::debugMsg("No Traces folder was found in userinclude, don't call TraceCompiler!"); 
+  	exit;
+  }
+  
+  if (!$mmpObject->{sources})
+  {
+  	tracecompiler::debugMsg("No sources found!"); 
+  	exit; 	
+  }
+ 
+ 
+  # IMPORTANT NOTE:
+  # please note that IPC::open3() is the only suitable api available in the perl version 5.6.1 used in ONB
+  # but it has a limit. If the size of the command is more than 264, perl will crash and it seems to be a windows limit
+  # rather perl.
+  # Therefore we have to parse the mmp and the traces folder from the stdin (*WRITER in this case) and 
+  # relax the new TraceCompiler API to allow this if they are not specified on the command line.
+  # It's not an issue in Raptor as it calls TraceCompiler directly.
+  #
+  $command .= " --uid=" . $mmpObject->{uid} . " --project=" . $project_name;
+           
+  tracecompiler::debugMsg("\nCall the Java TraceCompiler. Command: $command\n");
+    
+  # Create TraceCompiler process
+  local (*READER, *WRITER);
+  my $ pid = open3(\*WRITER, \*READER, \*READER, $command);
+    
+  # Remove duplicates from the sources list
+  my %seen = ();
+  my @uniqueSources = ();
+  foreach my $item (@{$mmpObject->{sources}}) 
+  {
+    push(@uniqueSources, $item) unless $seen{$item}++;
+  }
+ 
+  tracecompiler::debugMsg("Send mmp file: $mmp_file");
+  print WRITER "--mmp=$mmp_file\n";
+  
+  tracecompiler::debugMsg("Send traces folder path: $traces_folder");
+  print WRITER "--traces=$traces_folder\n";
+    
+    
+  # Send sources to the TraceCompiler     
+  foreach my $source (@uniqueSources)
+  {
+    tracecompiler::debugMsg("Send source: $source");
+    print WRITER "$source\n";
+   }
+    
+  # Send the end of the source files tag
+  print WRITER "*ENDOFSOURCEFILES*\n";
+  WRITER->autoflush(1);
+    
+  # Gather up the response from the TraceCompiler
+  my $compilerReturn = "";
+  foreach my $line (<READER>)
+  {
+    tracecompiler::debugMsg("Response line from TraceCompiler: $line");
+    $compilerReturn .= $line;
+  }       
+
+  # If Compiler doesn't return anything or we get no class found error from Java, don't print anything
+  if ($compilerReturn ne "" and $compilerReturn !~ /NoClassDefFoundError/)
+  {
+    tracecompiler::debugMsg("TraceCompiler succeeded! Returned: $compilerReturn");
+    print "\n******************* TRACECOMPILER STARTS *******************\n\n";
+    print "Building traces for component $project_name. Component UID: 0x$mmpObject->{uid}.\n";
+    print $compilerReturn . "\n";
+    print "\n******************* TRACECOMPILER ENDS *********************\n\n";
+  }
+  else 
+  {
+    tracecompiler::debugMsg("No traces were generated. Returned:\n$compilerReturn\n");
+  }
+ }