Revision: 201019
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 14 May 2010 17:25:03 +0300
changeset 17 67c6ff54ec25
parent 15 ccab7f1f8266
child 22 a009639409f5
child 23 830434fd7147
Revision: 201019 Kit: 201019
hti/HtiCommPlugins/HtiBtCommPlugin/group/HtiBtSerialComHelper.mmp
hti/HtiFramework/inc/HtiDispatcher.h
hti/HtiFramework/inc/HtiMessage.h
hti/HtiFramework/inc/HtiMessageQueue.h
hti/HtiFramework/src/HtiDispatcher.cpp
hti/hti_plat/hti_api/inc/HtiVersion.h
memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapBase.cpp
memspy/Engine/BWINS/MemSpyEngineu.def
memspy/Engine/Source/Helpers/MemSpyEngineHelperHeap.cpp
memspy/Engine/Source/Helpers/MemSpyEngineHelperKernelContainers.cpp
memspy/Engine/Source/MemSpyEngineImp.cpp
memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectThread.cpp
memspy/Engine/eabi/MemSpyEngineu.def
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/memspyapiprocess.h
memspy/MemSpyClient/inc/memspyapithread.h
memspy/MemSpyClient/inc/memspyheapdata.h
memspy/MemSpyClient/inc/memspykernelobjectdata.h
memspy/MemSpyClient/inc/memspyprocessdata.h
memspy/MemSpyClient/inc/memspysession.h
memspy/MemSpyClient/inc/memspythreaddata.h
memspy/MemSpyClient/src/memspyapiheap.cpp
memspy/MemSpyClient/src/memspyapikernelobject.cpp
memspy/MemSpyClient/src/memspyapikernelobjectitem.cpp
memspy/MemSpyClient/src/memspyapiprocess.cpp
memspy/MemSpyClient/src/memspyapithread.cpp
memspy/MemSpyClient/src/memspysession.cpp
memspy/MemSpyServer/Include/MemSpyServer.h
memspy/MemSpyServer/Include/MemSpyServerSession.h
memspy/MemSpyServer/Source/MemSpyServer.cpp
memspy/MemSpyServer/Source/MemSpyServerMain.cpp
memspy/MemSpyServer/Source/MemSpyServerSession.cpp
memspy/MemSpyServer/group/MemSpyServer.mmp
memspy/MemSpyServer/group/bld.inf
memspy/group/bld.inf
memspy/memspy_plat/memspy_api/include/memspy/driver/shared/MemSpyDriverObjectsSharedRHeap.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/ThreadAndProcess/MemSpyEngineObjectThread.h
memspy/rom/memspy.iby
stif/ATSInterface/src/ATSInterface.cpp
stif/StifTFwIf/src/UIEngineContainer.cpp
stif/TestCombiner/inc/TestCombiner.h
stif/TestCombiner/src/TestCombiner.cpp
stif/TestEngine/inc/TestEngine.h
stif/TestEngine/inc/TestReport.h
stif/TestEngine/src/TestCaseController.cpp
stif/TestEngine/src/TestEngine.cpp
stif/TestEngine/src/TestModuleController.cpp
stif/TestEngine/src/TestReport.cpp
stif/TestInterface/src/TestInterface.cpp
stif/TestModuleTemplates/TestModuleTemplates.zip
stif/TestServer/inc/TestServer.h
stif/TestServer/src/TestExecutionThread.cpp
stif/TestServer/src/TestModuleContainer.cpp
stif/TestServer/src/TestServerClient.cpp
stif/TestServer/src/Testserversession.cpp
stif/TestServerStarter/src/TestServerStarter.cpp
stif/group/ReleaseNote.txt
stif/inc/TestServerModuleIf.h
stif/inc/version.h
stif/sis/Stif_31.sis
--- a/hti/HtiCommPlugins/HtiBtCommPlugin/group/HtiBtSerialComHelper.mmp	Mon May 03 13:58:41 2010 +0300
+++ b/hti/HtiCommPlugins/HtiBtCommPlugin/group/HtiBtSerialComHelper.mmp	Fri May 14 17:25:03 2010 +0300
@@ -39,7 +39,6 @@
 USERINCLUDE     ../BtEngine/inc
 OS_LAYER_SYSTEMINCLUDE
 
-LIBRARY         apparc.lib
 LIBRARY         bafl.lib
 LIBRARY         bluetooth.lib
 LIBRARY         btdevice.lib
@@ -47,7 +46,6 @@
 LIBRARY         btmanclient.lib
 LIBRARY         btpowercontrol.lib
 LIBRARY         c32.lib
-LIBRARY         cone.lib
 LIBRARY         efsrv.lib
 LIBRARY         esock.lib
 LIBRARY         euser.lib
--- a/hti/HtiFramework/inc/HtiDispatcher.h	Mon May 03 13:58:41 2010 +0300
+++ b/hti/HtiFramework/inc/HtiDispatcher.h	Fri May 14 17:25:03 2010 +0300
@@ -480,6 +480,12 @@
      * If the period is 0, reconnect would not happen.
      */
     TInt iReconnectDelay;
+    
+    /**
+     * Indicates reboot reason.
+     * Reason type is defined in enum RStarterSession::TResetReason value in starterclient.h
+     */
+    TInt iRebootReason;
     };
 
 
--- a/hti/HtiFramework/inc/HtiMessage.h	Mon May 03 13:58:41 2010 +0300
+++ b/hti/HtiFramework/inc/HtiMessage.h	Fri May 14 17:25:03 2010 +0300
@@ -28,7 +28,7 @@
 const TInt KHtiMsgServiceUidLen = 4;
 
 
-class CHtiMessage  : public CBase
+NONSHARABLE_CLASS(CHtiMessage)  : public CBase
     {
 public:
     /**
--- a/hti/HtiFramework/inc/HtiMessageQueue.h	Mon May 03 13:58:41 2010 +0300
+++ b/hti/HtiFramework/inc/HtiMessageQueue.h	Fri May 14 17:25:03 2010 +0300
@@ -23,7 +23,7 @@
 
 #include "HtiMessage.h"
 
-class CHtiMessageQueue  : public CBase
+NONSHARABLE_CLASS(CHtiMessageQueue)  : public CBase
     {
 public:
     /**
--- a/hti/HtiFramework/src/HtiDispatcher.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/hti/HtiFramework/src/HtiDispatcher.cpp	Fri May 14 17:25:03 2010 +0300
@@ -123,7 +123,8 @@
     iIdleOverCommAdapter( EFalse ),
     iHtiInstanceId( 0 ),
     iShowErrorDialogs( aShowErrorDialogs ),
-    iReconnectDelay (aReconnectDelay)
+    iReconnectDelay(aReconnectDelay),
+    iRebootReason(0)
     {
     HTI_LOG_FORMAT( "MaxQueueMemorySize %d", iMaxQueueMemorySize );
     iQueueSizeLowThresold = ( iMaxQueueMemorySize / 2 ) / 2;
@@ -861,7 +862,23 @@
                     break;
 
                 case EHtiReboot:
+                    {
+                    if(aMessage.Length() == 2)
+                        {
+                        iRebootReason = aMessage[1];
+                        }
+                    else if(aMessage.Length() == 1)
+                        {
+                        iRebootReason = 0;
+                        }
+                    else
+                        {
+                        User::LeaveIfError(DispatchOutgoingErrorMessage( KErrArgument,
+                                      KErrDescrInvalidParameter,
+                                      KHtiSystemServiceUid ) );
+                        }
                     ShutdownAndRebootDeviceL();
+                    }
                     break;
 
                 case EHtiStop:
@@ -1022,7 +1039,16 @@
     TInt err = KErrNone;
     RProcess rebootProcess;
     // First try the UI layer rebooter
-    err = rebootProcess.Create( KHtiDeviceRebootExeUI, KNullDesC );
+    if(iRebootReason == 0)
+        {
+        err = rebootProcess.Create( KHtiDeviceRebootExeUI, KNullDesC );
+        }
+    else
+        {
+        TBuf<8> reasonNumber;
+        reasonNumber.Num(iRebootReason);
+        err = rebootProcess.Create( KHtiDeviceRebootExeUI, reasonNumber );
+        }
     if ( err != KErrNone )
         {
         HTI_LOG_FORMAT( "UI layer rebooter failed with %d", err );
--- a/hti/hti_plat/hti_api/inc/HtiVersion.h	Mon May 03 13:58:41 2010 +0300
+++ b/hti/hti_plat/hti_api/inc/HtiVersion.h	Fri May 14 17:25:03 2010 +0300
@@ -25,13 +25,13 @@
 // CONSTANTS
 
 const TUint8 KHtiVersionMajor = 2;
-const TUint8 KHtiVersionMinor = 18;
+const TUint8 KHtiVersionMinor = 21;
 const TUint8 KHtiVersionBuild = 0;
 
 const TUint16 KHtiVersionYear  = 2010;
-const TUint8  KHtiVersionMonth = 3;
-const TUint8  KHtiVersionWeek  = 9;
-const TUint8  KHtiVersionDay   = 5;
+const TUint8  KHtiVersionMonth = 4;
+const TUint8  KHtiVersionWeek  = 15;
+const TUint8  KHtiVersionDay   = 16;
 
 //  MACROS
 
--- a/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapBase.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapBase.cpp	Fri May 14 17:25:03 2010 +0300
@@ -905,7 +905,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 - kernelHeap->Base(): 0x%08x, kernelHeapChunk->Base(): 0x%08x", kernelHeap->Base(), kernelHeapChunk->Base() ) );
             aHeap = kernelHeap;
             aChunk = kernelHeapChunk;
 
@@ -1017,7 +1017,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->Base() ));
                 memcpy( (TUint8*) heapCopyChunkAddress, heap, copyLength );
 
                 NKern::UnlockSystem();
--- a/memspy/Engine/BWINS/MemSpyEngineu.def	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/Engine/BWINS/MemSpyEngineu.def	Fri May 14 17:25:03 2010 +0300
@@ -384,24 +384,31 @@
 	?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
 
--- a/memspy/Engine/Source/Helpers/MemSpyEngineHelperHeap.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/Engine/Source/Helpers/MemSpyEngineHelperHeap.cpp	Fri May 14 17:25:03 2010 +0300
@@ -899,6 +899,55 @@
     }
 
 
+//cigasto: not formatted - raw heap info 
+EXPORT_C TMemSpyHeapData CMemSpyEngineHelperHeap::NewHeapRawInfo( const TMemSpyHeapInfo& aInfo )
+	{
+	TMemSpyHeapData list;
+
+	// Heap type	
+	if ( aInfo.Type() == TMemSpyHeapInfo::ETypeUnknown )
+		{
+		_LIT( KItem0_Type_Unknown, "Unknown" );
+		list.iType.Append( KItem0_Type_Unknown );
+		}
+	else if ( aInfo.Type() == TMemSpyHeapInfo::ETypeRHeap )
+		{
+		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.iType.Append( KItem0_Type_RHeap );
+
+	    // Heap size is the size of the heap minus the size of the embedded (in-place) RHeap. 	    
+	    list.iSize = objectData.Size();
+	    list.iBaseAddress = (TUint) objectData.Base();	        
+	    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 = metaData.HeaderSizeAllocated();
+	    list.iHeaderSizeF = metaData.HeaderSizeFree();
+	    TInt allocOverhead = metaData.HeaderSizeAllocated() * statistics.StatsAllocated().TypeCount();
+	    list.iAllocationOverhead = allocOverhead;
+	    TInt freeOverhead = metaData.HeaderSizeFree() * statistics.StatsFree().TypeCount();
+	    list.iFreeOverhead = freeOverhead;
+	    list.iTotalOverhead = freeOverhead + allocOverhead;
+	    list.iOverhead = freeOverhead + allocOverhead; //to calculate percentage value use iSize as 100% value    
+	    list.iMinLength = objectData.iMinLength;
+	    list.iMaxLength = objectData.iMaxLength;
+	    list.iDebugAllocatorLibrary = metaData.IsDebugAllocator();
+		}
+
+	return list;
+	}
 
 
 
--- a/memspy/Engine/Source/Helpers/MemSpyEngineHelperKernelContainers.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/Engine/Source/Helpers/MemSpyEngineHelperKernelContainers.cpp	Fri May 14 17:25:03 2010 +0300
@@ -76,7 +76,7 @@
     {
     CMemSpyEngineGenericKernelObjectContainer* container = CMemSpyEngineGenericKernelObjectContainer::NewLC();
     //
-    for( TInt i=EMemSpyDriverContainerTypeFirst; i<=EMemSpyDriverContainerTypeLast; i++ )
+    for( TInt i=EMemSpyDriverContainerTypeFirst; i<=EMemSpyDriverContainerTypeChunk; i++ ) //EMemSpyDriverContainerTypeLast
         {
         const TMemSpyDriverContainerType type = static_cast< TMemSpyDriverContainerType >( i );
         //
@@ -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/MemSpyEngineImp.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/Engine/Source/MemSpyEngineImp.cpp	Fri May 14 17:25:03 2010 +0300
@@ -74,7 +74,7 @@
     RDebug::Printf( "CMemSpyEngineImp::~CMemSpyEngineImp() - deleting helpers..." );
 #endif
     delete iHelperSysMemTracker;
-    delete iServer;
+    //delete iServer;
     delete iHelperKernelContainers;
     delete iHelperFbServ;
     delete iHelperHeap;
@@ -138,7 +138,7 @@
     // 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 );
+    // DONE: MK: Removing server from engine. iServer = CMemSpyEngineServer::NewL( iEngine );
     //
     iMemSpyDriver = new(ELeave) RMemSpyDriverClient();
     const TInt error = Driver().Open();
--- a/memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectThread.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/Engine/Source/ThreadAndProcess/MemSpyEngineObjectThread.cpp	Fri May 14 17:25:03 2010 +0300
@@ -387,6 +387,11 @@
     return  isDead;
     }
 
+EXPORT_C TThreadPriority CMemSpyThread::Priority() const
+	{
+	return iPriority;
+	}
+
 
 void CMemSpyThread::RefreshL()
     {
--- a/memspy/Engine/eabi/MemSpyEngineu.def	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/Engine/eabi/MemSpyEngineu.def	Fri May 14 17:25:03 2010 +0300
@@ -536,4 +536,8 @@
 	_ZTI49CMemSpyEngineHelperSysMemTrackerEntryWindowServer @ 535 NONAME ; #<TI>#
 	_ZTV49CMemSpyEngineHelperSysMemTrackerEntryWindowServer @ 536 NONAME ; #<VT>#
 	_ZN13CMemSpyEngine29IsHelperWindowServerSupportedEv @ 537 NONAME
+	_ZN23CMemSpyEngineHelperHeap14NewHeapRawInfoERK15TMemSpyHeapInfo @ 538 NONAME
+	_ZNK36CMemSpyEngineGenericKernelObjectList10ItemsCountEv @ 539 NONAME
+	_ZNK36CMemSpyEngineGenericKernelObjectList4SizeEv @ 540 NONAME
+	_ZNK13CMemSpyThread8PriorityEv @ 541 NONAME
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/bwins/MemSpyClientu.def	Fri May 14 17:25:03 2010 +0300
@@ -0,0 +1,114 @@
+EXPORTS
+	?CpuUse@CMemSpyApiThread@@QBEHXZ @ 1 NONAME ; int CMemSpyApiThread::CpuUse(void) const
+	?Name@CMemSpyApiKernelObjectItem@@QBEABVTDesC8@@XZ @ 2 NONAME ; class TDesC8 const & CMemSpyApiKernelObjectItem::Name(void) const
+	?AccessCount@CMemSpyApiKernelObjectItem@@QBEHXZ @ 3 NONAME ; int CMemSpyApiKernelObjectItem::AccessCount(void) const
+	?TotalOverhead@CMemSpyApiHeap@@QAEHXZ @ 4 NONAME ; int CMemSpyApiHeap::TotalOverhead(void)
+	?UniqueID@CMemSpyApiKernelObjectItem@@QBEHXZ @ 5 NONAME ; int CMemSpyApiKernelObjectItem::UniqueID(void) const
+	?SessionType@CMemSpyApiKernelObjectItem@@QBE?AW4TIpcSessionType@@XZ @ 6 NONAME ; enum TIpcSessionType CMemSpyApiKernelObjectItem::SessionType(void) const
+	?VID@CMemSpyApiThread@@QBEHXZ @ 7 NONAME ; int CMemSpyApiThread::VID(void) const
+	?MaxLength@CMemSpyApiHeap@@QAEHXZ @ 8 NONAME ; int CMemSpyApiHeap::MaxLength(void)
+	?ProcessNumberUsing@CMemSpyApiThread@@QBEHXZ @ 9 NONAME ; int CMemSpyApiThread::ProcessNumberUsing(void) const
+	?AddressOfKernelOwner@CMemSpyApiKernelObjectItem@@QAEPAEXZ @ 10 NONAME ; unsigned char * CMemSpyApiKernelObjectItem::AddressOfKernelOwner(void)
+	?FreeCount@CMemSpyApiHeap@@QAEHXZ @ 11 NONAME ; int CMemSpyApiHeap::FreeCount(void)
+	?ExitType@CMemSpyApiProcess@@QBE?AW4TExitType@@XZ @ 12 NONAME ; enum TExitType CMemSpyApiProcess::ExitType(void) const
+	?TotalFree@CMemSpyApiHeap@@QAEHXZ @ 13 NONAME ; int CMemSpyApiHeap::TotalFree(void)
+	?SwitchToThread@RMemSpySession@@QAEHVTThreadId@@H@Z @ 14 NONAME ; int RMemSpySession::SwitchToThread(class TThreadId, int)
+	?FreeOverhead@CMemSpyApiHeap@@QAEHXZ @ 15 NONAME ; int CMemSpyApiHeap::FreeOverhead(void)
+	?SlackFreeSpace@CMemSpyApiHeap@@QAEHXZ @ 16 NONAME ; int CMemSpyApiHeap::SlackFreeSpace(void)
+	?Priority@CMemSpyApiKernelObjectItem@@QBEHXZ @ 17 NONAME ; int CMemSpyApiKernelObjectItem::Priority(void) const
+	?EndThread@RMemSpySession@@QAEHVTThreadId@@W4TEndType@@@Z @ 18 NONAME ; int RMemSpySession::EndThread(class TThreadId, enum TEndType)
+	?ThreadCount@CMemSpyApiProcess@@QBEHXZ @ 19 NONAME ; int CMemSpyApiProcess::ThreadCount(void) const
+	?RequestCount@CMemSpyApiThread@@QBEHXZ @ 20 NONAME ; int CMemSpyApiThread::RequestCount(void) const
+	??1CMemSpyApiProcess@@QAE@XZ @ 21 NONAME ; CMemSpyApiProcess::~CMemSpyApiProcess(void)
+	?SetThreadPriorityL@RMemSpySession@@QAEXVTThreadId@@H@Z @ 22 NONAME ; void RMemSpySession::SetThreadPriorityL(class TThreadId, int)
+	?MinLength@CMemSpyApiHeap@@QAEHXZ @ 23 NONAME ; int CMemSpyApiHeap::MinLength(void)
+	?Restrictions@CMemSpyApiKernelObjectItem@@QBEIXZ @ 24 NONAME ; unsigned int CMemSpyApiKernelObjectItem::Restrictions(void) const
+	?Id@CMemSpyApiKernelObjectItem@@QBEHXZ @ 25 NONAME ; int CMemSpyApiKernelObjectItem::Id(void) const
+	?Count@CMemSpyApiKernelObjectItem@@QBEHXZ @ 26 NONAME ; int CMemSpyApiKernelObjectItem::Count(void) const
+	?ExitCategory@CMemSpyApiProcess@@QBE?AV?$TBuf@$0BA@@@XZ @ 27 NONAME ; class TBuf<16> CMemSpyApiProcess::ExitCategory(void) const
+	?ControllingOwner@CMemSpyApiKernelObjectItem@@QBEIXZ @ 28 NONAME ; unsigned int CMemSpyApiKernelObjectItem::ControllingOwner(void) const
+	?Count@CMemSpyApiKernelObject@@QBEHXZ @ 29 NONAME ; int CMemSpyApiKernelObject::Count(void) const
+	?StartPos@CMemSpyApiKernelObjectItem@@QBEHXZ @ 30 NONAME ; int CMemSpyApiKernelObjectItem::StartPos(void) const
+	?TimerState@CMemSpyApiKernelObjectItem@@QBE?AW4TMemSpyDriverTimerState@@XZ @ 31 NONAME ; enum TMemSpyDriverTimerState CMemSpyApiKernelObjectItem::TimerState(void) const
+	?ExitType@CMemSpyApiThread@@QBE?AW4TExitType@@XZ @ 32 NONAME ; enum TExitType CMemSpyApiThread::ExitType(void) const
+	?BaseAddress@CMemSpyApiHeap@@QAEHXZ @ 33 NONAME ; int CMemSpyApiHeap::BaseAddress(void)
+	?Version@CMemSpyApiKernelObjectItem@@QBE?AVTVersion@@XZ @ 34 NONAME ; class TVersion CMemSpyApiKernelObjectItem::Version(void) const
+	?SwitchToProcess@RMemSpySession@@QAEHVTProcessId@@H@Z @ 35 NONAME ; int RMemSpySession::SwitchToProcess(class TProcessId, int)
+	?MaxSize@CMemSpyApiKernelObjectItem@@QBEHXZ @ 36 NONAME ; int CMemSpyApiKernelObjectItem::MaxSize(void) const
+	?Type@CMemSpyApiHeap@@QAEAAVTDesC16@@XZ @ 37 NONAME ; class TDesC16 & CMemSpyApiHeap::Type(void)
+	?AddressOfOwningProcess@CMemSpyApiKernelObjectItem@@QAEPAEXZ @ 38 NONAME ; unsigned char * CMemSpyApiKernelObjectItem::AddressOfOwningProcess(void)
+	?Id@CMemSpyApiProcess@@QBE?AVTProcessId@@XZ @ 39 NONAME ; class TProcessId CMemSpyApiProcess::Id(void) const
+	??1CMemSpyApiKernelObjectItem@@QAE@XZ @ 40 NONAME ; CMemSpyApiKernelObjectItem::~CMemSpyApiKernelObjectItem(void)
+	?BiggestAllocation@CMemSpyApiHeap@@QAEHXZ @ 41 NONAME ; int CMemSpyApiHeap::BiggestAllocation(void)
+	?ExitReason@CMemSpyApiProcess@@QBEHXZ @ 42 NONAME ; int CMemSpyApiProcess::ExitReason(void) const
+	?MsgCount@CMemSpyApiKernelObjectItem@@QBEHXZ @ 43 NONAME ; int CMemSpyApiKernelObjectItem::MsgCount(void) const
+	?AllocationsCount@CMemSpyApiHeap@@QAEHXZ @ 44 NONAME ; int CMemSpyApiHeap::AllocationsCount(void)
+	?AllocationOverhead@CMemSpyApiHeap@@QAEHXZ @ 45 NONAME ; int CMemSpyApiHeap::AllocationOverhead(void)
+	?NameOfOwner@CMemSpyApiKernelObjectItem@@QBEABVTDesC8@@XZ @ 46 NONAME ; class TDesC8 const & CMemSpyApiKernelObjectItem::NameOfOwner(void) const
+	?WaitCount@CMemSpyApiKernelObjectItem@@QBEHXZ @ 47 NONAME ; int CMemSpyApiKernelObjectItem::WaitCount(void) const
+	?ThreadSystemPermanentOrCritical@RMemSpySession@@QAEHVTThreadId@@H@Z @ 48 NONAME ; int RMemSpySession::ThreadSystemPermanentOrCritical(class TThreadId, int)
+	?Protection@CMemSpyApiKernelObjectItem@@QBEIXZ @ 49 NONAME ; unsigned int CMemSpyApiKernelObjectItem::Protection(void) const
+	?Attributes@CMemSpyApiThread@@QBEHXZ @ 50 NONAME ; int CMemSpyApiThread::Attributes(void) const
+	?BiggestFree@CMemSpyApiHeap@@QAEHXZ @ 51 NONAME ; int CMemSpyApiHeap::BiggestFree(void)
+	?Bottom@CMemSpyApiKernelObjectItem@@QBEHXZ @ 52 NONAME ; int CMemSpyApiKernelObjectItem::Bottom(void) const
+	?Size@CMemSpyApiKernelObject@@QBE_JXZ @ 53 NONAME ; long long CMemSpyApiKernelObject::Size(void) const
+	?ThreadHandles@CMemSpyApiThread@@QBEHXZ @ 54 NONAME ; int CMemSpyApiThread::ThreadHandles(void) const
+	?SvrSessionType@CMemSpyApiKernelObjectItem@@QBEEXZ @ 55 NONAME ; unsigned char CMemSpyApiKernelObjectItem::SvrSessionType(void) const
+	?TotalAllocations@CMemSpyApiHeap@@QAEHXZ @ 56 NONAME ; int CMemSpyApiHeap::TotalAllocations(void)
+	?Name@CMemSpyApiProcess@@QBEABVTDesC16@@XZ @ 57 NONAME ; class TDesC16 const & CMemSpyApiProcess::Name(void) const
+	?ChunkType@CMemSpyApiKernelObjectItem@@QBEIXZ @ 58 NONAME ; unsigned int CMemSpyApiKernelObjectItem::ChunkType(void) const
+	?GetKernelObjects@RMemSpySession@@QAEHAAV?$RArray@PAVCMemSpyApiKernelObject@@@@@Z @ 59 NONAME ; int RMemSpySession::GetKernelObjects(class RArray<class CMemSpyApiKernelObject *> &)
+	?HeaderSizeF@CMemSpyApiHeap@@QAEHXZ @ 60 NONAME ; int CMemSpyApiHeap::HeaderSizeF(void)
+	?Id@CMemSpyApiThread@@QBE?AVTThreadId@@XZ @ 61 NONAME ; class TThreadId CMemSpyApiThread::Id(void) const
+	?MsgLimit@CMemSpyApiKernelObjectItem@@QBEHXZ @ 62 NONAME ; int CMemSpyApiKernelObjectItem::MsgLimit(void) const
+	?AddressOfDataBssStackChunk@CMemSpyApiKernelObjectItem@@QAEPAEXZ @ 63 NONAME ; unsigned char * CMemSpyApiKernelObjectItem::AddressOfDataBssStackChunk(void)
+	?MapAttr@CMemSpyApiKernelObjectItem@@QBEIXZ @ 64 NONAME ; unsigned int CMemSpyApiKernelObjectItem::MapAttr(void) const
+	?Top@CMemSpyApiKernelObjectItem@@QBEHXZ @ 65 NONAME ; int CMemSpyApiKernelObjectItem::Top(void) const
+	?Resetting@CMemSpyApiKernelObjectItem@@QBEEXZ @ 66 NONAME ; unsigned char CMemSpyApiKernelObjectItem::Resetting(void) const
+	?HeaderSizeA@CMemSpyApiHeap@@QAEHXZ @ 67 NONAME ; int CMemSpyApiHeap::HeaderSizeA(void)
+	?EndProcess@RMemSpySession@@QAEHVTProcessId@@W4TEndType@@@Z @ 68 NONAME ; int RMemSpySession::EndProcess(class TProcessId, enum TEndType)
+	?AddressOfCodeSeg@CMemSpyApiKernelObjectItem@@QAEPAEXZ @ 69 NONAME ; unsigned char * CMemSpyApiKernelObjectItem::AddressOfCodeSeg(void)
+	?TotalAccessCount@CMemSpyApiKernelObjectItem@@QBEGXZ @ 70 NONAME ; unsigned short CMemSpyApiKernelObjectItem::TotalAccessCount(void) const
+	?GetThreadsL@RMemSpySession@@QAEXVTProcessId@@AAV?$RArray@PAVCMemSpyApiThread@@@@W4TSortType@@@Z @ 71 NONAME ; void RMemSpySession::GetThreadsL(class TProcessId, class RArray<class CMemSpyApiThread *> &, enum TSortType)
+	?Changes@CMemSpyApiKernelObjectItem@@QBEIXZ @ 72 NONAME ; unsigned int CMemSpyApiKernelObjectItem::Changes(void) const
+	?ProcessId@CMemSpyApiThread@@QBE?AVTProcessId@@XZ @ 73 NONAME ; class TProcessId CMemSpyApiThread::ProcessId(void) const
+	??0RMemSpySession@@QAE@XZ @ 74 NONAME ; RMemSpySession::RMemSpySession(void)
+	?Type@CMemSpyApiKernelObjectItem@@QBE?AW4TMemSpyDriverContainerType@@XZ @ 75 NONAME ; enum TMemSpyDriverContainerType CMemSpyApiKernelObjectItem::Type(void) const
+	?AddressOfServer@CMemSpyApiKernelObjectItem@@QAEPAEXZ @ 76 NONAME ; unsigned char * CMemSpyApiKernelObjectItem::AddressOfServer(void)
+	?Size@CMemSpyApiHeap@@QAEHXZ @ 77 NONAME ; int CMemSpyApiHeap::Size(void)
+	??1CMemSpyApiKernelObject@@QAE@XZ @ 78 NONAME ; CMemSpyApiKernelObject::~CMemSpyApiKernelObject(void)
+	??1CMemSpyApiHeap@@QAE@XZ @ 79 NONAME ; CMemSpyApiHeap::~CMemSpyApiHeap(void)
+	?ChunkSize@CMemSpyApiHeap@@QAEHXZ @ 80 NONAME ; int CMemSpyApiHeap::ChunkSize(void)
+	?UnitsMask@CMemSpyApiKernelObjectItem@@QBEIXZ @ 81 NONAME ; unsigned int CMemSpyApiKernelObjectItem::UnitsMask(void) const
+	?Size@CMemSpyApiKernelObjectItem@@QBEKXZ @ 82 NONAME ; unsigned long CMemSpyApiKernelObjectItem::Size(void) const
+	?State@CMemSpyApiKernelObjectItem@@QBEEXZ @ 83 NONAME ; unsigned char CMemSpyApiKernelObjectItem::State(void) const
+	?Shared@CMemSpyApiHeap@@QAEHXZ @ 84 NONAME ; int CMemSpyApiHeap::Shared(void)
+	?Type@CMemSpyApiKernelObject@@QBE?AW4TMemSpyDriverContainerType@@XZ @ 85 NONAME ; enum TMemSpyDriverContainerType CMemSpyApiKernelObject::Type(void) const
+	?Fragmentation@CMemSpyApiHeap@@QAEHXZ @ 86 NONAME ; int CMemSpyApiHeap::Fragmentation(void)
+	?Name@CMemSpyApiKernelObject@@QBEABVTDesC16@@XZ @ 87 NONAME ; class TDesC16 const & CMemSpyApiKernelObject::Name(void) const
+	?TimerType@CMemSpyApiKernelObjectItem@@QBE?AW4TMemSpyDriverTimerType@@XZ @ 88 NONAME ; enum TMemSpyDriverTimerType CMemSpyApiKernelObjectItem::TimerType(void) const
+	?ProcessSystemPermanentOrCritical@RMemSpySession@@QAEHVTProcessId@@H@Z @ 89 NONAME ; int RMemSpySession::ProcessSystemPermanentOrCritical(class TProcessId, int)
+	?SecurityZone@CMemSpyApiKernelObjectItem@@QBEIXZ @ 90 NONAME ; unsigned int CMemSpyApiKernelObjectItem::SecurityZone(void) const
+	?CreatorId@CMemSpyApiKernelObjectItem@@QBEIXZ @ 91 NONAME ; unsigned int CMemSpyApiKernelObjectItem::CreatorId(void) const
+	?MapCount@CMemSpyApiKernelObjectItem@@QBEHXZ @ 92 NONAME ; int CMemSpyApiKernelObjectItem::MapCount(void) const
+	?NameDetail@CMemSpyApiKernelObjectItem@@QBEABVTDesC8@@XZ @ 93 NONAME ; class TDesC8 const & CMemSpyApiKernelObjectItem::NameDetail(void) const
+	?OpenChannels@CMemSpyApiKernelObjectItem@@QAEHXZ @ 94 NONAME ; int CMemSpyApiKernelObjectItem::OpenChannels(void)
+	?Order@CMemSpyApiKernelObjectItem@@QBEEXZ @ 95 NONAME ; unsigned char CMemSpyApiKernelObjectItem::Order(void) const
+	?ProcessPriority@CMemSpyApiThread@@QBE?AW4TProcessPriority@@XZ @ 96 NONAME ; enum TProcessPriority CMemSpyApiThread::ProcessPriority(void) const
+	?GetProcessesL@RMemSpySession@@QAEXAAV?$RArray@PAVCMemSpyApiProcess@@@@W4TSortType@@@Z @ 97 NONAME ; void RMemSpySession::GetProcessesL(class RArray<class CMemSpyApiProcess *> &, enum TSortType)
+	?Handle@CMemSpyApiKernelObjectItem@@QBEPAXXZ @ 98 NONAME ; void * CMemSpyApiKernelObjectItem::Handle(void) const
+	?ParseMask@CMemSpyApiKernelObjectItem@@QBEIXZ @ 99 NONAME ; unsigned int CMemSpyApiKernelObjectItem::ParseMask(void) const
+	?Attributes@CMemSpyApiKernelObjectItem@@QBEHXZ @ 100 NONAME ; int CMemSpyApiKernelObjectItem::Attributes(void) const
+	?DebugAllocatorLibrary@CMemSpyApiHeap@@QAEHXZ @ 101 NONAME ; int CMemSpyApiHeap::DebugAllocatorLibrary(void)
+	?ThreadNumberUsing@CMemSpyApiThread@@QBEHXZ @ 102 NONAME ; int CMemSpyApiThread::ThreadNumberUsing(void) const
+	?Overhead@CMemSpyApiHeap@@QAEHXZ @ 103 NONAME ; int CMemSpyApiHeap::Overhead(void)
+	?Connect@RMemSpySession@@QAEHXZ @ 104 NONAME ; int RMemSpySession::Connect(void)
+	??1CMemSpyApiThread@@QAE@XZ @ 105 NONAME ; CMemSpyApiThread::~CMemSpyApiThread(void)
+	?SID@CMemSpyApiThread@@QBEHXZ @ 106 NONAME ; int CMemSpyApiThread::SID(void) const
+	?AddressOfOwningThread@CMemSpyApiKernelObjectItem@@QAEPAEXZ @ 107 NONAME ; unsigned char * CMemSpyApiKernelObjectItem::AddressOfOwningThread(void)
+	?GetKernelObjectItems@RMemSpySession@@QAEHAAV?$RArray@PAVCMemSpyApiKernelObjectItem@@@@W4TMemSpyDriverContainerType@@@Z @ 108 NONAME ; int RMemSpySession::GetKernelObjectItems(class RArray<class CMemSpyApiKernelObjectItem *> &, enum TMemSpyDriverContainerType)
+	?ProcessHandles@CMemSpyApiThread@@QBEHXZ @ 109 NONAME ; int CMemSpyApiThread::ProcessHandles(void) const
+	?ThreadPriority@CMemSpyApiThread@@QBE?AW4TThreadPriority@@XZ @ 110 NONAME ; enum TThreadPriority CMemSpyApiThread::ThreadPriority(void) const
+	?GetHeap@RMemSpySession@@QAEPAVCMemSpyApiHeap@@XZ @ 111 NONAME ; class CMemSpyApiHeap * RMemSpySession::GetHeap(void)
+	?Name@CMemSpyApiThread@@QBEABVTDesC16@@XZ @ 112 NONAME ; class TDesC16 const & CMemSpyApiThread::Name(void) const
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/eabi/MemSpyClientu.def	Fri May 14 17:25:03 2010 +0300
@@ -0,0 +1,120 @@
+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
+	_ZN14RMemSpySession10EndProcessE10TProcessId8TEndType @ 25 NONAME
+	_ZN14RMemSpySession11GetThreadsLE10TProcessIdR6RArrayIP16CMemSpyApiThreadE9TSortType @ 26 NONAME
+	_ZN14RMemSpySession13GetProcessesLER6RArrayIP17CMemSpyApiProcessE9TSortType @ 27 NONAME
+	_ZN14RMemSpySession14SwitchToThreadE9TThreadIdi @ 28 NONAME
+	_ZN14RMemSpySession15SwitchToProcessE10TProcessIdi @ 29 NONAME
+	_ZN14RMemSpySession16GetKernelObjectsER6RArrayIP22CMemSpyApiKernelObjectE @ 30 NONAME
+	_ZN14RMemSpySession20GetKernelObjectItemsER6RArrayIP26CMemSpyApiKernelObjectItemE26TMemSpyDriverContainerType @ 31 NONAME
+	_ZN14RMemSpySession31ThreadSystemPermanentOrCriticalE9TThreadIdi @ 32 NONAME
+	_ZN14RMemSpySession32ProcessSystemPermanentOrCriticalE10TProcessIdi @ 33 NONAME
+	_ZN14RMemSpySession7ConnectEv @ 34 NONAME
+	_ZN14RMemSpySession7GetHeapEv @ 35 NONAME
+	_ZN14RMemSpySession9EndThreadE9TThreadId8TEndType @ 36 NONAME
+	_ZN14RMemSpySessionC1Ev @ 37 NONAME
+	_ZN14RMemSpySessionC2Ev @ 38 NONAME
+	_ZN16CMemSpyApiThreadD1Ev @ 39 NONAME
+	_ZN16CMemSpyApiThreadD2Ev @ 40 NONAME
+	_ZN17CMemSpyApiProcessD1Ev @ 41 NONAME
+	_ZN17CMemSpyApiProcessD2Ev @ 42 NONAME
+	_ZN22CMemSpyApiKernelObjectD1Ev @ 43 NONAME
+	_ZN22CMemSpyApiKernelObjectD2Ev @ 44 NONAME
+	_ZN26CMemSpyApiKernelObjectItem12OpenChannelsEv @ 45 NONAME
+	_ZN26CMemSpyApiKernelObjectItem15AddressOfServerEv @ 46 NONAME
+	_ZN26CMemSpyApiKernelObjectItem16AddressOfCodeSegEv @ 47 NONAME
+	_ZN26CMemSpyApiKernelObjectItem20AddressOfKernelOwnerEv @ 48 NONAME
+	_ZN26CMemSpyApiKernelObjectItem21AddressOfOwningThreadEv @ 49 NONAME
+	_ZN26CMemSpyApiKernelObjectItem22AddressOfOwningProcessEv @ 50 NONAME
+	_ZN26CMemSpyApiKernelObjectItem26AddressOfDataBssStackChunkEv @ 51 NONAME
+	_ZN26CMemSpyApiKernelObjectItemD1Ev @ 52 NONAME
+	_ZN26CMemSpyApiKernelObjectItemD2Ev @ 53 NONAME
+	_ZNK16CMemSpyApiThread10AttributesEv @ 54 NONAME
+	_ZNK16CMemSpyApiThread12RequestCountEv @ 55 NONAME
+	_ZNK16CMemSpyApiThread13ThreadHandlesEv @ 56 NONAME
+	_ZNK16CMemSpyApiThread14ProcessHandlesEv @ 57 NONAME
+	_ZNK16CMemSpyApiThread14ThreadPriorityEv @ 58 NONAME
+	_ZNK16CMemSpyApiThread15ProcessPriorityEv @ 59 NONAME
+	_ZNK16CMemSpyApiThread17ThreadNumberUsingEv @ 60 NONAME
+	_ZNK16CMemSpyApiThread18ProcessNumberUsingEv @ 61 NONAME
+	_ZNK16CMemSpyApiThread2IdEv @ 62 NONAME
+	_ZNK16CMemSpyApiThread3SIDEv @ 63 NONAME
+	_ZNK16CMemSpyApiThread3VIDEv @ 64 NONAME
+	_ZNK16CMemSpyApiThread4NameEv @ 65 NONAME
+	_ZNK16CMemSpyApiThread6CpuUseEv @ 66 NONAME
+	_ZNK16CMemSpyApiThread8ExitTypeEv @ 67 NONAME
+	_ZNK16CMemSpyApiThread9ProcessIdEv @ 68 NONAME
+	_ZNK17CMemSpyApiProcess10ExitReasonEv @ 69 NONAME
+	_ZNK17CMemSpyApiProcess11ThreadCountEv @ 70 NONAME
+	_ZNK17CMemSpyApiProcess12ExitCategoryEv @ 71 NONAME
+	_ZNK17CMemSpyApiProcess2IdEv @ 72 NONAME
+	_ZNK17CMemSpyApiProcess4NameEv @ 73 NONAME
+	_ZNK17CMemSpyApiProcess8ExitTypeEv @ 74 NONAME
+	_ZNK22CMemSpyApiKernelObject4NameEv @ 75 NONAME
+	_ZNK22CMemSpyApiKernelObject4SizeEv @ 76 NONAME
+	_ZNK22CMemSpyApiKernelObject4TypeEv @ 77 NONAME
+	_ZNK22CMemSpyApiKernelObject5CountEv @ 78 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem10AttributesEv @ 79 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem10NameDetailEv @ 80 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem10ProtectionEv @ 81 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem10TimerStateEv @ 82 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem11AccessCountEv @ 83 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem11NameOfOwnerEv @ 84 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem11SessionTypeEv @ 85 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem12RestrictionsEv @ 86 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem12SecurityZoneEv @ 87 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem14SvrSessionTypeEv @ 88 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem16ControllingOwnerEv @ 89 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem16TotalAccessCountEv @ 90 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem2IdEv @ 91 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem3TopEv @ 92 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem4NameEv @ 93 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem4SizeEv @ 94 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem4TypeEv @ 95 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem5CountEv @ 96 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem5OrderEv @ 97 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem5StateEv @ 98 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem6BottomEv @ 99 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem6HandleEv @ 100 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem7ChangesEv @ 101 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem7MapAttrEv @ 102 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem7MaxSizeEv @ 103 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem7VersionEv @ 104 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem8MapCountEv @ 105 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem8MsgCountEv @ 106 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem8MsgLimitEv @ 107 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem8PriorityEv @ 108 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem8StartPosEv @ 109 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem8UniqueIDEv @ 110 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9ChunkTypeEv @ 111 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9CreatorIdEv @ 112 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9ParseMaskEv @ 113 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9ResettingEv @ 114 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9TimerTypeEv @ 115 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9UnitsMaskEv @ 116 NONAME
+	_ZNK26CMemSpyApiKernelObjectItem9WaitCountEv @ 117 NONAME
+	_ZN14RMemSpySession18SetThreadPriorityLE9TThreadIdi @ 118 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/group/MemSpyClient.mmp	Fri May 14 17:25:03 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 <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
+
+SOURCEPATH ../src
+SOURCE 		memspysession.cpp 
+SOURCE 		memspyapiprocess.cpp 
+SOURCE 		memspyapikernelobject.cpp 
+SOURCE		memspyapiheap.cpp 
+SOURCE 		memspyapikernelobjectitem.cpp memspyapithread.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
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/group/bld.inf	Fri May 14 17:25:03 2010 +0300
@@ -0,0 +1,34 @@
+/*
+* 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/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/memspythreaddata.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/engine/memspythreaddata.h)
+../inc/memspyapithread.h OS_LAYER_PLATFORM_EXPORT_PATH(memspy/api/memspyapithread.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	Fri May 14 17:25:03 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	Fri May 14 17:25:03 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	Fri May 14 17:25:03 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/memspyapiprocess.h	Fri May 14 17:25:03 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:
+* 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;
+	
+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	Fri May 14 17:25:03 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/memspyheapdata.h	Fri May 14 17:25:03 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;
+	TUint8 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	Fri May 14 17:25:03 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;
+    TBuf<KBufSize> iName;
+    TInt iCount;
+    TInt64 iSize;
+	};
+
+#endif // MEMSPYKERNELOBJECTDATA_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspyprocessdata.h	Fri May 14 17:25:03 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:
+* 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; 
+    TMemSpyDriverProcessInfo iInfo;
+	};
+
+#endif // MEMSPYPROCESSDATA_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspysession.h	Fri May 14 17:25:03 2010 +0300
@@ -0,0 +1,164 @@
+/*
+* 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/engine/memspyprocessdata.h> //for Processes
+#include <memspy/api/memspyapiprocess.h>
+#include <memspy/engine/memspythreaddata.h> //for Threads
+#include <memspy/api/memspyapithread.h>
+#include <memspy/engine/memspykernelobjectdata.h> //for KernelObjects
+#include <memspy/api/memspyapikernelobject.h>
+#include <memspy/api/memspyapikernelobjectitem.h> //for KernelObjectItems
+#include <memspy/engine/memspyheapdata.h> //for Heap
+#include <memspy/api/memspyapiheap.h>
+
+// Constants
+const TInt KMemSpyVersion           = 2;
+
+// Literal constants 
+_LIT( KMemSpyServer2, "MemSpyServer.exe" );
+
+
+//
+enum TMemSpyOperations
+    {
+	//Output operations
+	
+//	EGetSinkType,
+//	EOutputToDebug,
+//	EOutputToFile,
+//	EOutputKernelObjects,
+//	ESetServerTimeOutStatus,
+//	EOutputProcessInfo,
+	
+	//Processes operations
+	
+	EGetProcessCount,
+	EGetProcesses,
+	EGetThreadCount,
+	EGetThreads,
+	ESetThreadPriority,
+	EProcessSystemPermanentOrCritical,
+	EEndProcess,
+	ESwitchToProcess,
+//	EOpenCloseCurrentProcess
+	
+	//Threads operations
+	EThreadSystemPermanentOrCritical,	
+	EEndThread,
+	ESwitchToThread,
+	
+	//Kernel Objects operations
+	EGetKernelObjectTypeCount,
+	EGetKernelObjects,
+	EGetKernelObjectItemsCount,
+	EGetKernelObjectItems,
+	//EOutputKernelObjects
+	
+	//Heap operations
+	EGetHeap
+    };
+
+enum TSortType
+	{
+	ESortProcById,
+	ESortProcByName,
+	ESortProcByThreadCount,
+	ESortProcByCodeSegs,
+	ESortProcByHeapUsage,
+	ESortProcByStackUsage
+	};
+
+enum TEndType
+	{
+	ETerminate,
+	EKill,
+	EPanic
+};
+
+NONSHARABLE_CLASS( RMemSpySession ) : public RSessionBase
+    {
+public:
+    IMPORT_C RMemSpySession();
+    IMPORT_C TInt Connect();
+    
+public:	//API
+    //Output operations
+    //inline TMemSpySinkType GetSinkType();    
+    //inline void OutputToDebug();
+    //inline void OutputToFile();    
+    //inline void OutputKernelObjects();    
+    //inline void SetServerTimeOutStatus( TUint32 aValue, TBool aEnabled );
+    //inline void OutputProcessInfo( TMemSpyProcess aProcess );
+    
+    //Processes operations    
+    /**
+     * 
+     */
+    IMPORT_C void GetProcessesL(RArray<CMemSpyApiProcess*> &aProcesses, TSortType aSortType = ESortProcById);        
+    
+    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, TEndType aType );
+    
+    IMPORT_C TInt SwitchToProcess( TProcessId aId, TBool aBrought  );
+    
+    //inline void OpenCloseCurrentProcess( TProcessId aId, TBool aOpen );
+    
+    //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, TEndType aType );
+    
+    IMPORT_C TInt SwitchToThread( TThreadId aId, TBool aBrought );
+    
+    //KernelObjects operations    
+    /**
+     * 
+     */
+    IMPORT_C TInt GetKernelObjects( RArray<CMemSpyApiKernelObject*> &aKernelObjects );
+    
+    IMPORT_C TInt GetKernelObjectItems( RArray<CMemSpyApiKernelObjectItem*> &aKernelObjectItems, TMemSpyDriverContainerType aForContainer );
+    
+    /**
+     * 
+     */
+    //IMPORT_C TInt GetHeap( RArray<CMemSpyApiHeap*> &aHeap );
+	//IMPORT_C TInt GetHeap( CMemSpyApiHeap* aHeap );
+	IMPORT_C CMemSpyApiHeap* GetHeap();
+    
+private:
+    TInt StartServer();
+    };
+
+#endif // MEMSPYSESSION_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyClient/inc/memspythreaddata.h	Fri May 14 17:25:03 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/src/memspyapiheap.cpp	Fri May 14 17:25:03 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	Fri May 14 17:25:03 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	Fri May 14 17:25:03 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/memspyapiprocess.cpp	Fri May 14 17:25:03 2010 +0300
@@ -0,0 +1,84 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#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;
+	}
+
+
+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	Fri May 14 17:25:03 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/memspysession.cpp	Fri May 14 17:25:03 2010 +0300
@@ -0,0 +1,394 @@
+/*
+* 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 <memspy/api/memspyapiprocess.h>
+#include <memspy/api/memspyapikernelobject.h>
+#include <memspy/api/memspyapikernelobjectitem.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(KMemSpyServer2, 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(KMemSpyServer2, 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;
+	}
+
+//inline void RMemSpySession::Close()
+//    {
+//    RSessionBase::Close();
+//    }
+//
+//inline TMemSpySinkType RMemSpySession::GetSinkType()
+//	{
+//	TPckgBuf<TMemSpySinkType> OutBuf;
+//	TIpcArgs args( &OutBuf );
+//	SendReceive( EGetSinkType, args );
+//	return OutBuf();
+//	}
+//
+//inline void RMemSpySession::OutputKernelObjects()
+//	{
+//	SendReceive( EOutputKernelObjects );
+//	}
+//
+//inline void RMemSpySession::OutputToDebug()
+//	{
+//	SendReceive( EOutputToDebug );
+//	}
+//
+//inline void RMemSpySession::OutputToFile()
+//	{
+//	SendReceive( EOutputToFile );
+//	}
+//
+//inline void RMemSpySession::SetServerTimeOutStatus( TUint32 aValue, TBool aEnabled )
+//	{
+//	TPckgBuf<TUint32> In1(aValue);
+//	TPckgBuf<TBool> In2(aEnabled);
+//	TIpcArgs args( &In1, &In2 );
+//	SendReceive( ESetServerTimeOutStatus, args );	
+//	}
+
+//inline void RMemSpySession::OutputProcessInfo( TMemSpyProcess aProcess )
+//	{
+//	TProcessId iId = aProcess.iId;
+//	TPckgBuf<TProcessId> In( iId );
+//	TIpcArgs args( &In );
+//	SendReceive( EOutputProcessInfo, args );
+//	}
+
+////Processes operations
+//inline TInt RMemSpySession::ProcessesCount()
+//	{
+//	TPckgBuf<TInt> Out;
+//	TIpcArgs args( &Out );
+//	SendReceive( EProcessesCount, args );
+//	return Out();
+//	}
+//
+//inline TMemSpyProcess RMemSpySession::GetProcessByIndex( TInt aIndex )
+//	{
+//	TPckgBuf<TInt> In( aIndex );
+//	TPckgBuf<TMemSpyProcess> Out;
+//	TIpcArgs args( &In, &Out );
+//	SendReceive( EProcessByIndex, args );
+//	return Out();
+//	}
+//
+//inline TInt RMemSpySession::ProcessIndexById( TProcessId aId )
+//	{
+//	TPckgBuf<TProcessId> In( aId );
+//	TPckgBuf<TInt> Out;
+//	TIpcArgs args( &In, &Out );
+//	SendReceive( EProcessIndexById, args );
+//	return Out();
+//	}
+//
+//inline TBool RMemSpySession::ProcessIsDead( TMemSpyProcess aProcess )
+//	{
+//	TProcessId iId = aProcess.iId;
+//	TPckgBuf<TProcessId> In( iId );
+//	TPckgBuf<TBool> Out;
+//	TIpcArgs args( &In, &Out );
+//	SendReceive( EProcessIsDead, args );
+//	return Out();
+//	}
+
+EXPORT_C void RMemSpySession::GetProcessesL(RArray<CMemSpyApiProcess*> &aProcesses, TSortType aSortType)
+	{
+	TPckgBuf<TInt> count;
+	User::LeaveIfError(SendReceive(EGetProcessCount, TIpcArgs(&count)));
+	
+	TInt requestedCount = count();
+	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyProcessData));
+	TPtr8 bufferPtr(buffer->Des());
+	
+	User::LeaveIfError(SendReceive(EGetProcesses, 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 TInt RMemSpySession::ProcessSystemPermanentOrCritical( TProcessId aId, TBool aValue )
+	{
+	TPckgBuf<TProcessId> arg1( aId );
+	TPckgBuf<TBool> arg2( aValue );
+	TIpcArgs args( &arg1, &arg2 );
+		
+	TInt error = SendReceive( EProcessSystemPermanentOrCritical, args );
+	
+	return error;
+	}
+
+EXPORT_C TInt RMemSpySession::EndProcess( TProcessId aId, TEndType aType )
+	{
+	TPckgBuf<TProcessId> arg1( aId );
+	TPckgBuf<TEndType> arg2( aType );
+	TIpcArgs args( &arg1, &arg2 );
+	
+	TInt error = SendReceive( EEndProcess, 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( ESwitchToProcess, 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(EGetThreadCount, TIpcArgs(&count, &pid)));
+	
+	TInt requestedCount = count();
+	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyThreadData));
+	TPtr8 bufferPtr(buffer->Des());
+	
+	User::LeaveIfError(SendReceive(EGetThreads, 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( ESetThreadPriority, 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( EThreadSystemPermanentOrCritical, args );
+	
+	return error;
+	}
+
+EXPORT_C TInt RMemSpySession::EndThread( TThreadId aId, TEndType aType )
+	{
+	TPckgBuf<TThreadId> arg1( aId );
+	TPckgBuf<TEndType> arg2( aType );
+	TIpcArgs args( &arg1, &arg2 );
+	
+	TInt error = SendReceive( EEndThread, args );
+	
+	return error;
+	}
+
+EXPORT_C TInt RMemSpySession::SwitchToThread( TThreadId aId, TBool aBrought )
+	{
+	
+	}
+/*
+EXPORT_C TInt RMemSpySession::TerminateThread( TThreadId aId )
+	{
+	TPckgBuf<TThreadId> arg( aId );
+	TIpcArgs args( &arg );
+	
+	TInt error = SendReceive( ETerminateThread, args );
+	
+	return error;
+	}
+*/
+
+//inline void RMemSpySession::SortProcessesBy( TSortType aType )
+//	{
+//	TPckgBuf<TSortType> In( aType );
+//	TIpcArgs args( &In );
+//	SendReceive( ESortProcessesBy, args );
+//	}
+
+//inline void RMemSpySession::OpenCloseCurrentProcess( TProcessId aId, TBool  aOpen )
+//	{
+//	TPckgBuf<TProcessId> In1( aId );
+//	TPckgBuf<TBool> In2( aOpen );
+//	TIpcArgs args( &In1, &In2 );
+//	SendReceive( EOpenCloseCurrentProcess, args );
+//	}
+
+//Kernel Objects specific operations
+EXPORT_C TInt RMemSpySession::GetKernelObjects( RArray<CMemSpyApiKernelObject*> &aKernelObjects )
+	{		
+	TPckgBuf<TInt> count;
+	TInt error = SendReceive( EGetKernelObjectTypeCount, TIpcArgs(&count) );
+	
+	if( error == KErrNone )
+		{			
+		TInt requestedCount = count();
+		HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyKernelObjectData));
+		TPtr8 bufferPtr(buffer->Des());
+			
+		TPckgBuf<TInt> count(requestedCount);
+		TIpcArgs args( &count, &bufferPtr );
+		TInt error = SendReceive( EGetKernelObjects, args );
+			
+		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::NewL(data()));
+			}
+				
+		CleanupStack::PopAndDestroy(buffer);						
+		}	
+	return KErrNone;		
+	}
+
+EXPORT_C TInt RMemSpySession::GetKernelObjectItems( RArray<CMemSpyApiKernelObjectItem*> &aKernelObjectItems, TMemSpyDriverContainerType aForContainer )
+	{
+	TPckgBuf<TInt> count;
+	TPckgBuf<TMemSpyDriverContainerType> type(aForContainer);
+	TInt error = SendReceive( EGetKernelObjectItemsCount, TIpcArgs(&count, &type) );
+		
+	if (error == KErrNone)
+		{
+		TInt requestedCount = count();
+		HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyDriverHandleInfoGeneric));
+		TPtr8 bufferPtr(buffer->Des());
+		
+		TPckgBuf<TInt> count(requestedCount);
+		TIpcArgs args( &count, &type, &bufferPtr );
+		TInt error = SendReceive( EGetKernelObjectItems, args );
+		
+		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::NewL( data() ) );
+			}
+						
+		CleanupStack::PopAndDestroy(buffer);				
+		}
+	return KErrNone;
+	}
+
+//Heap specific operations
+EXPORT_C CMemSpyApiHeap* RMemSpySession::GetHeap()
+	{
+	CMemSpyApiHeap* aHeap;
+	TInt error = KErrNone;
+	
+	HBufC8* buffer = HBufC8::NewLC( sizeof(TMemSpyHeapData) );
+	TPtr8 bufferPtr(buffer->Des());
+	TIpcArgs args( &bufferPtr );
+	
+	error = SendReceive( EGetHeap, args );
+	
+	if( error == KErrNone )
+		{
+		TPckgBuf<TMemSpyHeapData> data;
+		data.Copy(bufferPtr.Ptr(), sizeof(TMemSpyHeapData));		
+		aHeap = CMemSpyApiHeap::NewL( data() );
+		}
+	CleanupStack::PopAndDestroy(buffer);
+		
+	return aHeap;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyServer/Include/MemSpyServer.h	Fri May 14 17:25:03 2010 +0300
@@ -0,0 +1,57 @@
+/*
+* 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 headder file to declare MemSpyServer class
+*
+*/
+
+#ifndef MEMSPYSERVER_H
+#define MEMSPYSERVER_H
+
+// System includes
+#include <e32base.h>
+
+#include <flogger.h>
+
+// User includes
+#include <memspyengineclientinterface.h>
+
+// Classes referenced
+class CMemSpyEngine;
+
+// Literal constants 
+//_LIT( KMemSpyServer2, "MemSpyServer.exe" );
+
+// MemSpyServer class declaration
+NONSHARABLE_CLASS( CMemSpyServer ) : public CServer2
+    {
+    public:
+        static CMemSpyServer* NewL( CMemSpyEngine& aEngine );
+        static CMemSpyServer* NewLC( CMemSpyEngine& aEngine );
+        ~CMemSpyServer();
+
+    private:
+        CMemSpyServer( CMemSpyEngine& aEngine );
+    	void ConstructL();
+
+    protected: // From CServer2
+    	CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const;
+
+    private:
+        CMemSpyEngine& iEngine;
+        
+        RFileLogger iLog;
+    };
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyServer/Include/MemSpyServerSession.h	Fri May 14 17:25:03 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:
+* MemSpyServer headder file to declare MemSpyServer class
+*
+*/
+
+#ifndef MEMSPYSERVERSESSION_H
+#define MEMSPYSERVERSESSION_H
+
+// System includes
+#include <e32base.h>
+#include <BADESCA.H>
+
+// User includes
+#include <memspyengineclientinterface.h>
+#include <memspy/engine/memspyengineobjectthreadinfoobjects.h>
+
+    // Classes referenced
+class CMemSpyEngine;
+
+
+NONSHARABLE_CLASS( CMemSpyServerSession ) : public CSession2
+	{
+public:
+	static CMemSpyServerSession* NewL( CMemSpyEngine& aEngine, const RMessage2& aMessage );
+	~CMemSpyServerSession();
+
+private:
+	CMemSpyServerSession( CMemSpyEngine& aEngine );
+	void ConstructL( const RMessage2& aMessage );
+
+private: // From CSession2
+	void ServiceL( const RMessage2& aMessage );
+
+private: // Internal methods
+    void DoServiceL( 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 );
+    
+private:
+    CMemSpyEngine& iEngine;
+    HBufC* iClientThreadName;
+    TUint32 iClientThreadId;
+    };
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyServer/Source/MemSpyServer.cpp	Fri May 14 17:25:03 2010 +0300
@@ -0,0 +1,124 @@
+/*
+* 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:
+* Implementation of the new MemSpyServer
+*/
+
+//user includes
+#include "MemSpyServer.h"
+#include "MemSpyServerSession.h"
+
+// System includes
+#include <e32svr.h>
+
+// User includes
+#include <memspy/engine/memspyengine.h>
+#include <memspy/engine/memspyenginelogger.h>
+//#include <memspyengineclientinterface.h>
+#include <memspy/engine/memspyengineobjectthread.h>
+#include <memspy/engine/memspyengineobjectprocess.h>
+#include <memspy/engine/memspyengineobjectcontainer.h>
+#include <memspy/engine/memspyenginehelperchunk.h>
+#include <memspy/engine/memspyenginehelpercodesegment.h>
+#include <memspy/engine/memspyenginehelperheap.h>
+#include <memspy/engine/memspyenginehelperstack.h>
+#include <memspy/engine/memspyenginehelperthread.h>
+#include <memspy/engine/memspyenginehelperprocess.h>
+#include <memspy/engine/memspyenginehelperfilesystem.h>
+#include <memspy/engine/memspyenginehelperram.h>
+#include <memspy/engine/memspyenginehelpersysmemtracker.h>
+#include <memspy/engine/memspyenginehelpersysmemtrackerconfig.h>
+#include <memspy/engine/memspyenginehelperkernelcontainers.h>
+
+#include <memspysession.h>
+
+// ---------------------------------------------------------
+// CMemSpyServer( CMemSpyEngine& aEngine )
+// ---------------------------------------------------------
+//
+CMemSpyServer::CMemSpyServer( CMemSpyEngine& aEngine )
+:   CServer2( EPriorityNormal ), iEngine( aEngine )
+    {
+    }
+
+// ---------------------------------------------------------
+// ~CMemSpyServer()
+// ---------------------------------------------------------
+//
+CMemSpyServer::~CMemSpyServer()
+    {
+	iLog.CloseLog();
+	iLog.Close();
+    }
+
+// ---------------------------------------------------------
+// ConstructL()
+// ---------------------------------------------------------
+//
+void CMemSpyServer::ConstructL()
+    {
+    StartL( KMemSpyServer2 );
+	//TInt error = Start( KMemSpyServerName );
+    RDebug::Printf( "[MemSpy] CMemSpyServer::ConstructL() - server started" );
+    
+    iLog.Connect();
+    iLog.CreateLog(_L("memspy"), _L("server.txt"), EFileLoggingModeAppend);
+    iLog.Write(_L("[MemSpy] CMemSpyServer::ConstructL() - server started"));
+    iLog.Write(_L("[MemSpy] CMemSpyServer::ConstructL() - server name: "));
+    iLog.Write(KMemSpyServer2);
+    }
+
+// ---------------------------------------------------------
+// NewL( CMemSpyEngine& aEngine )
+// Two phased constructor
+// ---------------------------------------------------------
+//
+CMemSpyServer* CMemSpyServer::NewL( CMemSpyEngine& aEngine )
+    {
+	CMemSpyServer* self = CMemSpyServer::NewLC(aEngine);
+	CleanupStack::Pop(self);
+	return (self);
+    }
+
+// ---------------------------------------------------------
+// NewLC( CMemSpyEngine& aEngine )
+// Two phased constructor
+// ---------------------------------------------------------
+//
+CMemSpyServer* CMemSpyServer::NewLC( CMemSpyEngine& aEngine )
+    {
+    CMemSpyServer* self = new(ELeave) CMemSpyServer( aEngine );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------
+// NewSessionL( const TVersion& aVersion, const RMessage2& aMessage )
+// Creates new client server session
+// ---------------------------------------------------------
+//
+CSession2* CMemSpyServer::NewSessionL( const TVersion& aVersion, const RMessage2& aMessage ) const
+    {
+	if  ( aVersion.iMajor != KMemSpyClientServerVersion )
+        {
+        RDebug::Printf( "[MemSpy] CMemSpyServerSession::NewSessionL() - BAD VERSION" );
+        User::Leave( KErrNotSupported );
+        }
+    //
+    CMemSpyServerSession* session = CMemSpyServerSession::NewL( iEngine, aMessage );
+	return session;
+    }
+
+// END OF FILE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyServer/Source/MemSpyServerMain.cpp	Fri May 14 17:25:03 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:
+* 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);
+    
+    // MemSpyServer initialization
+    CMemSpyServer::NewLC(*engine);
+
+    // Play nicely with external processes
+    RProcess::Rendezvous( KErrNone );       
+
+    // Start wait loop.
+    CActiveScheduler::Start();
+    
+    // Tidy up
+    CleanupStack::PopAndDestroy( 4, 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/Source/MemSpyServerSession.cpp	Fri May 14 17:25:03 2010 +0300
@@ -0,0 +1,949 @@
+/*
+* 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:
+* Implementation of the new MemSpyServer
+*/
+
+// System includes
+#include <e32svr.h>
+#include <e32cmn.h>
+#include <e32base.h>
+#include <w32std.h>
+//#include <apgtask.h>
+//#include <apgwgnam.h>
+
+//user includes
+#include "MemSpyServerSession.h"
+
+// User includes
+#include <memspy/engine/memspyengine.h>
+#include <memspy/engine/memspyenginelogger.h>
+#include <memspyengineclientinterface.h>
+#include <memspy/engine/memspyengineobjectthread.h>
+#include <memspy/engine/memspyengineobjectprocess.h>
+#include <memspy/engine/memspyengineobjectcontainer.h>
+#include <memspy/engine/memspyenginehelperchunk.h>
+#include <memspy/engine/memspyenginehelpercodesegment.h>
+#include <memspy/engine/memspyenginehelperheap.h>
+#include <memspy/engine/memspyenginehelperstack.h>
+#include <memspy/engine/memspyenginehelperthread.h>
+#include <memspy/engine/memspyenginehelperprocess.h>
+#include <memspy/engine/memspyenginehelperfilesystem.h>
+#include <memspy/engine/memspyenginehelperram.h>
+#include <memspy/engine/memspyenginehelpersysmemtracker.h>
+#include <memspy/engine/memspyenginehelpersysmemtrackerconfig.h>
+#include <memspy/engine/memspyenginehelperkernelcontainers.h>
+#include <memspy/engine/memspyenginehelperserver.h>
+
+//cigasto
+#include <memspysession.h>
+//#include <memspy/driver/memspydriverclient.h>
+
+// ---------------------------------------------------------
+// CMemSpyServerSession( CMemSpyEngine& aEngine )
+// ---------------------------------------------------------
+//
+CMemSpyServerSession::CMemSpyServerSession( CMemSpyEngine& aEngine )
+:   iEngine( aEngine )
+    {	
+    }
+
+// ---------------------------------------------------------
+// ~CMemSpyServerSession()
+// ---------------------------------------------------------
+//
+CMemSpyServerSession::~CMemSpyServerSession()
+    {
+#ifdef _DEBUG
+    TPtrC pThreadName( KNullDesC );
+    if  ( iClientThreadName )
+        {
+        pThreadName.Set( *iClientThreadName );
+        }
+
+    RDebug::Print( _L("[MemSpy] CMemSpyServerSession::~CMemSpyServerSession() - DEAD SESSION - this: 0x%08x, id: %4d, name: %S"), this, iClientThreadId, iClientThreadName );
+#endif
+
+    delete iClientThreadName;
+    }
+
+// ---------------------------------------------------------
+// ConstructL( const RMessage2& aMessage )
+// ---------------------------------------------------------
+//
+void CMemSpyServerSession::ConstructL( const RMessage2& aMessage )
+    {
+	RThread thread;
+    const TInt error = aMessage.Client( thread );
+    CleanupClosePushL( thread );
+
+    TRACE( RDebug::Printf( "[MemSpy] CMemSpyServerSession::ConstructL() - this: 0x%08x - opening client thread - err: %d", this, error ) );
+
+    User::LeaveIfError( error );
+
+    const TFullName threadName( thread.FullName() );
+    iClientThreadName = threadName.AllocL();
+    iClientThreadId = thread.Id();
+
+    CleanupStack::PopAndDestroy( &thread );
+
+    TRACE( RDebug::Print( _L("[MemSpy] CMemSpyServerSession::ConstructL() - NEW SESSION - this: 0x%08x, id: %4d, client: %S"), this, iClientThreadId, iClientThreadName ) );
+    }
+
+// ---------------------------------------------------------
+// NewL( CMemSpyEngine& aEngine, const RMessage2& aMessage )
+// Two-phased constructor
+// ---------------------------------------------------------
+//
+CMemSpyServerSession* CMemSpyServerSession::NewL( CMemSpyEngine& aEngine, const RMessage2& aMessage )
+    {
+    CMemSpyServerSession* self = new(ELeave) CMemSpyServerSession( aEngine );
+    CleanupStack::PushL( self );
+    self->ConstructL( aMessage );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------
+// ServiceL( const RMessage2& aMessage )
+// Method from which the clients request arrives
+// ---------------------------------------------------------
+//
+void CMemSpyServerSession::ServiceL( const RMessage2& aMessage )
+    {
+    TRACE( RDebug::Print( _L("[MemSpy] CMemSpyServerSession::ServiceL() - START - this: 0x%08x, fn: 0x%08x, id: %4d, client: %S"), this, aMessage.Function(), iClientThreadId, iClientThreadName ) );   
+    
+    TRAPD( error, DoServiceL( aMessage ) );
+    if  ( error != KErrNone )
+        {
+        RDebug::Print( _L("[MemSpy] CMemSpyServerSession::ServiceL() - SERVICE ERROR - this: 0x%08x, fn: %d, err: %d, client: %S"), this, aMessage.Function(), error, iClientThreadName );
+        }
+    aMessage.Complete( error );
+
+    TRACE( RDebug::Print( _L("[MemSpy] CMemSpyServerSession::ServiceL() - END - this: 0x%08x, fn: 0x%08x, id: %4d, client: %S"), this, aMessage.Function(), iClientThreadId, iClientThreadName ) );
+	}
+
+// ---------------------------------------------------------
+// DoServiceL( const RMessage2& aMessage )
+// ---------------------------------------------------------
+//
+void CMemSpyServerSession::DoServiceL( const RMessage2& aMessage )
+    {
+    TInt error = KErrNone;
+
+    // Check function attributes
+    const TInt function = aMessage.Function() & KMemSpyOpFlagsTypeMask;    
+    const TInt argSpec = aMessage.Function() & KMemSpyOpFlagsInclusionMask;
+    const TBool byThreadId = ( argSpec == KMemSpyOpFlagsIncludesThreadId );
+    const TBool byThreadName = ( argSpec == KMemSpyOpFlagsIncludesThreadName );
+
+    TRACE( RDebug::Printf( "[MemSpy] CMemSpyServerSession::DoServiceL() - START - unmodified function: 0x%08x, opCode: %d [TID: %d, TN: %d]", aMessage.Function(), function, byThreadId, byThreadName ) );   
+    
+    switch (function)
+    	{
+		case EGetProcessCount:
+			{
+			aMessage.WriteL(0, TPckgBuf<TInt>(iEngine.Container().Count()));
+			break;
+			}
+		case EGetProcesses:
+			{
+			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.iId = process.Id();
+				data.iName.Copy(process.Name());
+				
+				TPckgBuf<TMemSpyProcessData> buffer(data);
+				aMessage.WriteL(1, buffer, offset);
+				}
+			
+			a0 = list.Count();
+			aMessage.WriteL(0, a0);
+
+			break;
+			}
+		case EProcessSystemPermanentOrCritical:
+			{
+			TBool ret = EFalse;
+			TPckgBuf<TProcessId> id;
+			aMessage.ReadL( 0, id );
+			
+			CMemSpyEngineObjectContainer& container = iEngine.Container();
+			CMemSpyProcess& process = container.ProcessByIdL( id() );
+			
+			process.Open();
+
+			if  ( process.IsSystemPermanent() || process.IsSystemCritical() )
+				{
+				ret = ETrue;
+				}
+			TPckgBuf<TBool> retBuf( ret );
+			aMessage.WriteL( 1, retBuf );
+			
+			break;
+			}
+		case EEndProcess:
+			{
+			TPckgBuf<TProcessId> id;
+			aMessage.ReadL( 0, id );
+			TPckgBuf<TEndType> 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 ESwitchToProcess:
+			{/*
+		    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 EGetThreadCount:
+			{
+			TPckgBuf<TProcessId> pid;
+			aMessage.ReadL(1, pid);
+			CMemSpyProcess& process = iEngine.Container().ProcessByIdL(pid());
+			process.Open();
+			aMessage.WriteL(0, TPckgBuf<TInt>(process.Count()));
+			process.Close();
+			break;
+			}
+		case EGetThreads:
+			{
+			TPckgBuf<TProcessId> pid;
+			aMessage.ReadL(2, pid);
+			
+			CMemSpyProcess& list = iEngine.Container().ProcessByIdL(pid());
+			list.Open();
+			
+			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);
+				thread.Open();
+				
+				TMemSpyThreadData data;
+				data.iId = thread.Id();
+				data.iName.Copy(thread.Name());
+				data.iThreadPriority = thread.Priority();
+				
+				TPckgBuf<TMemSpyThreadData> buffer(data);
+				aMessage.WriteL(1, buffer, offset);
+				
+				thread.Close();
+				}
+			
+			a0 = list.Count();
+			aMessage.WriteL(0, a0);
+			
+			list.Close();
+
+			break;
+			}
+		case ESetThreadPriority:
+			{
+			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->Open();
+				thread->SetPriorityL(static_cast<TThreadPriority>(priority()));				
+				thread->Close();
+				}					
+			break;
+			}
+		case EThreadSystemPermanentOrCritical:
+			{
+			TBool ret = EFalse;
+			TPckgBuf<TThreadId> id;
+			aMessage.ReadL( 0, id );
+			
+			CMemSpyEngineObjectContainer& container = iEngine.Container();            
+            CMemSpyProcess* process = NULL;
+            CMemSpyThread* thread = NULL; 
+            User::LeaveIfError( container.ProcessAndThreadByThreadId( id(), process, thread ) );
+            
+            if ( thread )
+            	{				
+				thread->Open();
+				
+				if  ( thread->IsSystemPermanent() || thread->IsSystemCritical() )
+					{			
+					ret = ETrue;					
+					}
+				thread->Close();
+            	}
+            TPckgBuf<TBool> retBuf( ret );
+            aMessage.WriteL( 1, retBuf );
+            				
+			break;
+			}
+		case EEndThread:
+			{
+			TPckgBuf<TThreadId> id;
+			aMessage.ReadL( 0, id );
+			TPckgBuf<TEndType> 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;
+			}
+		// --- KernelObjects related functions ---
+		case EGetKernelObjectTypeCount:
+			{
+			TInt iCount = EMemSpyDriverContainerTypeChunk - EMemSpyDriverContainerTypeFirst;
+			//TInt iCount = EMemSpyDriverContainerTypeLast - EMemSpyDriverContainerTypeFirst;
+			TPckgBuf<TInt> ret( iCount );
+			aMessage.WriteL(0, ret);			
+			break;
+			}
+		case EGetKernelObjects:
+			{
+			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;								
+												
+				data.iName.Append( model->At(i).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 EGetKernelObjectItemsCount:
+			{
+			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 EGetKernelObjectItems:
+			{
+			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;
+			}
+		// --- Kernel Heap related functions ---
+		case EGetHeap:
+			{
+			TMemSpyHeapInfo heapInfo;			
+			iEngine.HelperHeap().GetHeapInfoKernelL( heapInfo );
+			TMemSpyHeapData data = iEngine.HelperHeap().NewHeapRawInfo( heapInfo );
+			
+			TPckgBuf<TMemSpyHeapData> buffer(data);
+			aMessage.WriteL(0, buffer);
+			
+			break;
+			}
+    	}
+//    else if( function == EProcessByIndex )
+//    	{
+//		TMemSpyProcess iProcess;
+//		TInt in;
+//		TPckgBuf<TInt> index( in );
+//		aMessage.ReadL( 0, index );
+//		CMemSpyProcess& process = iEngine.Container().At( index() );
+//		//fill the data structure
+//		iProcess.iId = process.Id(); //process ID
+//		iProcess.iName.Append( process.Name() ); //raw process name
+//		iProcess.iThreadCount = process.Count(); //thread count
+//		iProcess.iPriority = process.Priority();
+//		//			
+//		TPckgBuf<TMemSpyProcess> buf( iProcess );
+//		aMessage.WriteL( 1, buf );
+//		aMessage.Complete( KErrNone );
+//    	}
+//    else if( function == EProcessIndexById )
+//    	{
+//		TProcessId iId;
+//		TPckgBuf<TProcessId> buf( iId );
+//    	aMessage.ReadL( 0, buf );
+//    	TInt index = iEngine.Container().ProcessIndexById( buf() );
+//    	TPckgBuf<TInt> out( index );
+//    	aMessage.WriteL( 1, out );
+//    	aMessage.Complete( KErrNone );
+//    	}
+//    else if( function == EOutputProcessInfo )
+//    	{
+//		TProcessId iId;
+//		TPckgBuf<TProcessId> buf( iId );
+//		aMessage.ReadL( 0, buf );
+//		CMemSpyProcess& process = iEngine.Container().ProcessByIdL( buf() );
+//		iEngine.HelperProcess().OutputProcessInfoL( process );
+//    	}
+//    else if( function == EProcessIsDead )
+//    	{
+//		TProcessId iId;
+//		TPckgBuf<TProcessId> buf( iId );
+//		aMessage.ReadL( 0, buf );
+//		CMemSpyProcess& process = iEngine.Container().ProcessByIdL( buf() );
+//		TBool dead = process.IsDead();
+//		TPckgBuf<TBool> out( dead );
+//		aMessage.WriteL( 1, out );
+//		aMessage.Complete( KErrNone );
+//    	}
+//    else if( function == ESortProcessesBy )
+//    	{
+//		TSortType type;
+//		TPckgBuf<TSortType> buf(type);
+//		aMessage.ReadL( 0, buf );
+//		if( buf() == ESortProcById )
+//			{
+//			iEngine.Container().SortById();
+//			}
+//		else if( buf() == ESortProcByName )
+//			{
+//			iEngine.Container().SortByName();
+//			}
+//		else if( buf() == ESortProcByThreadCount )
+//			{
+//			iEngine.Container().SortByThreadCount();
+//			}
+//		else if( buf() == ESortProcByCodeSegs )
+//			{
+//			iEngine.Container().SortByCodeSegs();
+//			}
+//		else if( buf() == ESortProcByHeapUsage )
+//			{
+//			iEngine.Container().SortByHeapUsage();			
+//			}
+//		else if( buf() == ESortProcByStackUsage )
+//			{
+//			iEngine.Container().SortByStackUsage();
+//			}			
+//    	}
+//    else if( function == EOpenCloseCurrentProcess )
+//    	{
+//		TProcessId id;
+//		TBool open;
+//    	TPckgBuf<TProcessId> buf(id);
+//    	TPckgBuf<TBool> buf2(open);
+//    	aMessage.ReadL( 0, buf );
+//    	aMessage.ReadL( 1, buf2 );
+//    	if( buf2() == 1 )
+//    		{
+//			iEngine.Container().ProcessByIdL( buf() ).Open();
+//    		}
+//    	else
+//    		{
+//			iEngine.Container().ProcessByIdL( buf() ).Close();
+//    		}
+//    	}
+    
+//    // Check function is supported and argument combination is valid
+//    error = ValidateFunction( function, byThreadId, byThreadName );
+//    TRACE( RDebug::Printf( "[MemSpy] CMemSpyServerSession::DoServiceL() - validation result: %d", error ) );
+//    
+//    // Process function request
+//    if  ( error == KErrNone )
+//        {
+//        if  ( byThreadId )
+//            {
+//            TRACE( RDebug::Printf( "[MemSpy] CMemSpyServerSession::DoServiceL() - [TID] thread-specific..." ) );
+//            
+//            const TThreadId threadId( aMessage.Int0() );
+//            HandleThreadSpecificOpL( function, threadId );
+//            }
+//        else if ( byThreadName )
+//            {
+//            TRACE( RDebug::Printf( "[MemSpy] CMemSpyServerSession::DoServiceL() - [TN] thread-specific..." ) );
+//
+//            error = aMessage.GetDesLength( 0 /*slot 0*/ );
+//        
+//            if  ( error > 0 && error <= KMaxFullName )
+//                {
+//                TFullName* threadName = new(ELeave) TFullName();
+//                CleanupStack::PushL( threadName );
+//                aMessage.ReadL( 0, *threadName );
+//                HandleThreadSpecificOpL( function, *threadName );
+//                CleanupStack::PopAndDestroy( threadName );
+//                }
+//            else
+//                {
+//                error = KErrArgument;
+//                }
+//            }
+//        else
+//            {
+//            TRACE( RDebug::Printf( "[MemSpy] CMemSpyServerSession::DoServiceL() - thread-agnostic..." ) );
+//
+//            HandleThreadAgnosticOpL( function, aMessage );
+//            }
+//        }
+
+    User::LeaveIfError( error );
+
+    TRACE( RDebug::Printf( "[MemSpy] CMemSpyServerSession::DoServiceL() - HELLOOOOOO" ) );
+    TRACE( RDebug::Printf( "[MemSpy] CMemSpyServerSession::DoServiceL() - END" ) );
+    }
+
+// ---------------------------------------------------------
+// ValidateFunction( TInt aFunction, TBool aIncludesThreadId, TBool aIncludesThreadName )
+// Validates the MemSpy operation types
+// ---------------------------------------------------------
+//
+TInt CMemSpyServerSession::ValidateFunction( TInt aFunction, TBool aIncludesThreadId, TBool aIncludesThreadName )
+    {
+    TInt err = KErrNotSupported;
+    
+    // Check the operation is within op-code range
+    if  ( aFunction >= EMemSpyClientServerOpMarkerFirst && aFunction < EMemSpyClientServerOpMarkerLast )
+        {
+        // Check the operation doesn't include unnecessary or not supported information
+        const TBool includesThreadIdentifier = ( aIncludesThreadId || aIncludesThreadName );
+        if  ( includesThreadIdentifier && aFunction >= EMemSpyClientServerOpMarkerThreadAgnosticFirst )
+            {
+            // Passing a thread identifier to a thread agnostic operation
+            err = KErrArgument;
+            }
+        else
+            {
+            err = KErrNone;
+            }
+        }
+    //
+    if  ( err != KErrNone )
+        {
+        RDebug::Printf( "[MemSpy] CMemSpyServerSession::ValidateFunction() - function request did not validate - [withId: %d, withName: %d]", aIncludesThreadId, aIncludesThreadName );
+        }
+    //
+    return err;
+    }
+
+// ---------------------------------------------------------
+// HandleThreadSpecificOpL( TInt aFunction, const TThreadId& aThreadId )
+// ---------------------------------------------------------
+//
+void CMemSpyServerSession::HandleThreadSpecificOpL( TInt aFunction, const TThreadId& aThreadId )
+    {
+//    TRACE( RDebug::Printf( "[MemSpy] CMemSpyServerSession::HandleThreadSpecificOpL() - START - aFunction: %d, aThreadId: %d", aFunction, (TUint) aThreadId ) );
+//
+//    ASSERT( (TUint) aThreadId != 0 );
+//    TInt error = KErrNone;
+//
+//    // Check if its a kernel thread identifier
+//    const TBool isKernel = ( static_cast<TUint32>( aThreadId ) == KMemSpyClientServerThreadIdKernel );
+//
+//    // Treat as thread specific operation
+//    CMemSpyProcess* process = NULL;
+//    CMemSpyThread* thread = NULL;
+//    if  ( !isKernel )
+//        {
+//        error = iEngine.Container().ProcessAndThreadByThreadId( aThreadId, process, thread );
+//        TRACE( RDebug::Printf( "[MemSpy] CMemSpyServerSession::HandleThreadSpecificOpL() - search result: %d, proc: 0x%08x, thread: 0x%08x", error, process, thread ) );
+//        }
+//    else
+//        {
+//        // Kernel is only supported for a couple of operations
+//        if  ( aFunction == EMemSpyClientServerOpHeapInfo || aFunction == EMemSpyClientServerOpHeapData )
+//            {
+//            }
+//        else
+//            {
+//            TRACE( RDebug::Printf( "[MemSpy] CMemSpyServerSession::HandleThreadSpecificOpL() - trying to call unsupported function for kernel thread!" ) );
+//            error = KErrArgument;
+//            }
+//        }
+//
+//    // Must be no error so far and we must have a valid thread & process when performing a non-kernel op
+//    // or then if we are performing a kernel op, we don't need the thread or process.
+//    if  ( error == KErrNone && ( ( thread && process && !isKernel ) || ( isKernel ) ) )
+//        {
+//#ifdef _DEBUG
+//        if  ( thread )
+//            {
+//            HBufC* threadName = thread->FullName().AllocLC();
+//            _LIT( KTrace2, "[MemSpy] CMemSpyServerSession::HandleThreadSpecificOpL() - thread: %S" );
+//            RDebug::Print( KTrace2, threadName );
+//            CleanupStack::PopAndDestroy( threadName );
+//            }
+//        else if ( isKernel )
+//            {
+//            _LIT( KTrace2, "[MemSpy] CMemSpyServerSession::HandleThreadSpecificOpL() - thread: Kernel" );
+//            RDebug::Print( KTrace2 );
+//            }
+//#endif
+//
+//        // Got a valid thread object - now work out which operation to perform...
+//        switch( aFunction )
+//            {
+//        case EMemSpyClientServerOpSummaryInfo:
+//            iEngine.HelperProcess().OutputProcessInfoL( *process );
+//            break;
+//        case EMemSpyClientServerOpSummaryInfoDetailed:
+//            iEngine.HelperProcess().OutputProcessInfoDetailedL( *process );
+//            break;
+//        case EMemSpyClientServerOpHeapInfo:
+//            if  ( isKernel )
+//                {
+//                iEngine.HelperHeap().OutputHeapInfoKernelL();
+//                }
+//            else
+//                {
+//                iEngine.HelperHeap().OutputHeapInfoUserL( *thread );
+//                }
+//            break;
+//        case EMemSpyClientServerOpHeapCellListing:
+//            iEngine.HelperHeap().OutputCellListingUserL( *thread );
+//            break;
+//        case EMemSpyClientServerOpHeapData:
+//            if  ( isKernel )
+//                {
+//                iEngine.HelperHeap().OutputHeapDataKernelL();
+//                }
+//            else
+//                {
+//                iEngine.HelperHeap().OutputHeapDataUserL( *thread );
+//                }
+//            break;
+//        case EMemSpyClientServerOpStackInfo:
+//            iEngine.HelperStack().OutputStackInfoL( *thread );
+//            break;
+//        case EMemSpyClientServerOpStackDataUser:
+//            iEngine.HelperStack().OutputStackDataL( *thread, EMemSpyDriverDomainUser, EFalse );
+//            break;
+//        case EMemSpyClientServerOpStackDataKernel:
+//            iEngine.HelperStack().OutputStackDataL( *thread, EMemSpyDriverDomainKernel, EFalse );
+//            break;
+//        case EMemSpyClientServerOpOpenFiles:
+//            iEngine.HelperFileSystem().ListOpenFilesL( aThreadId );
+//            break;
+//
+//        default:
+//            error = KErrNotSupported;
+//            break;
+//            }
+//        }
+//
+//    TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadSpecificOpL() - END - aFunction: %d, aThreadId: %d, error: %d", aFunction, (TUint) aThreadId, error ) );
+//    User::LeaveIfError( error );
+    }
+
+// ---------------------------------------------------------
+// HandleThreadSpecificOpL( TInt aFunction, const TDesC& aThreadName )
+// Gets thread ID from aThreadName 
+// and calls HandleThreadSpecificOpL( , const TThreadId& aThreadId )
+// ---------------------------------------------------------
+//
+void CMemSpyServerSession::HandleThreadSpecificOpL( TInt aFunction, const TDesC& aThreadName )
+    {
+//    TRACE( RDebug::Print( _L("[MemSpy] CMemSpyServerSession::HandleThreadSpecificOpL() - START - aFunction: %d, aThreadName: %S"), aFunction, &aThreadName ) );
+//    //
+//    CMemSpyProcess* process = NULL;
+//    CMemSpyThread* thread = NULL;
+//    TInt error = iEngine.Container().ProcessAndThreadByPartialName( aThreadName, process, thread );
+//    User::LeaveIfError( error );
+//    //
+//    const TThreadId threadId( thread->Id() );
+//    HandleThreadSpecificOpL( aFunction, threadId );
+//    //
+//    TRACE( RDebug::Print( _L("[MemSpy] CMemSpyServerSession::HandleThreadSpecificOpL() - END - aFunction: %d, aThreadName: %S"), aFunction, &aThreadName ) );
+    }
+
+// ---------------------------------------------------------
+// HandleThreadAgnosticOpL( TInt aFunction, const RMessage2& aMessage )
+// ---------------------------------------------------------
+//
+void CMemSpyServerSession::HandleThreadAgnosticOpL( TInt aFunction, const RMessage2& aMessage )
+    {
+//    TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - START" ) );
+//    //
+//    if  ( aFunction ==  EMemSpyClientServerOpHeapInfoCompact )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpHeapInfoCompact") );
+//        iEngine.HelperHeap().OutputHeapInfoForDeviceL();
+//        }
+//    else if ( aFunction ==  EMemSpyClientServerOpStackInfoCompact )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpStackInfoCompact") );
+//        iEngine.HelperStack().OutputStackInfoForDeviceL();
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingTimerStart )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingTimerStart") );
+//        iEngine.HelperSysMemTracker().StartL();
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingTimerStop )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingTimerStop") );
+//        iEngine.HelperSysMemTracker().StopL();
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingReset )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingReset") );
+//        iEngine.HelperSysMemTracker().Reset();
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingForceUpdate )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingForceUpdate") );
+//        iEngine.HelperSysMemTracker().CheckForChangesNowL();
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingTimerPeriodSet )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingTimerPeriodSet") );
+//        
+//        // Get current config
+//        TMemSpyEngineHelperSysMemTrackerConfig config;
+//        iEngine.HelperSysMemTracker().GetConfig( config );
+//
+//        // Set new timer value
+//        config.iTimerPeriod = aMessage.Int0();
+//
+//        // And update config... which will leave if the config is invalid
+//        iEngine.HelperSysMemTracker().SetConfigL( config );
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingCategoriesSet )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingCategoriesSet") );
+//        // Get current config
+//        TMemSpyEngineHelperSysMemTrackerConfig config;
+//        iEngine.HelperSysMemTracker().GetConfig( config );
+//
+//        // Set new categories
+//        config.iEnabledCategories = aMessage.Int0();
+//
+//        // And update config... which will leave if the config is invalid
+//        iEngine.HelperSysMemTracker().SetConfigL( config );
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingThreadNameFilterSet )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingThreadNameFilterSet") );
+//        // Get current config
+//        TMemSpyEngineHelperSysMemTrackerConfig config;
+//        iEngine.HelperSysMemTracker().GetConfig( config );
+//
+//        // Set new filter
+//        RBuf buf;
+//        buf.CleanupClosePushL();
+//        TInt len = aMessage.GetDesLength( 0 );
+//        if ( len > 0 )
+//            {
+//            buf.CreateL( len );
+//            aMessage.ReadL( 0, buf, 0 );
+//            config.iThreadNameFilter.Copy( buf );            
+//            }
+//        else
+//            {
+//            config.iThreadNameFilter.Zero();
+//            }
+//        CleanupStack::PopAndDestroy( &buf );
+//
+//        // And update config... which will leave if the config is invalid
+//        iEngine.HelperSysMemTracker().SetConfigL( config );
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingHeapDumpSet )
+//        {
+//        // Get current config
+//        TMemSpyEngineHelperSysMemTrackerConfig config;
+//        iEngine.HelperSysMemTracker().GetConfig( config );
+//        
+//        // Set new Heap Dump value
+//        config.iDumpData = aMessage.Int0();
+//        
+//        // And update config... which will leave if the config is invalid
+//        iEngine.HelperSysMemTracker().SetConfigL( config );
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpSwitchOutputSinkTrace )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSwitchOutputSinkTrace") );
+//        iEngine.InstallSinkL( ESinkTypeDebug );
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpSwitchOutputSinkFile )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSwitchOutputSinkFile") );
+//        iEngine.InstallSinkL( ESinkTypeFile );
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpEnumerateKernelContainer )
+//        {
+//        const TMemSpyDriverContainerType type = CMemSpyEngineHelperKernelContainers::MapToType( static_cast< TObjectType >( aMessage.Int0() ) );
+//
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpEnumerateKernelContainer - type: %d", type ) );
+//
+//        CMemSpyEngineGenericKernelObjectList* model = iEngine.HelperKernelContainers().ObjectsForSpecificContainerL( type );
+//        CleanupStack::PushL( model );
+//        model->OutputL( iEngine.Sink() );
+//        CleanupStack::PopAndDestroy( model );
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpEnumerateKernelContainerAll )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpEnumerateKernelContainerAll") );
+//        CMemSpyEngineGenericKernelObjectContainer* model = iEngine.HelperKernelContainers().ObjectsAllL();
+//        CleanupStack::PushL( model );
+//        model->OutputL( iEngine.Sink() );
+//        CleanupStack::PopAndDestroy( model );
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpOpenFiles )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpOpenFiles") );
+//        iEngine.ListOpenFilesL();
+//        }
+//    else if ( aFunction == EMemSpyClientServerOpDisableAknIconCache )
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpDisableAknIconCache") );
+//        iEngine.HelperRAM().SetAknIconCacheStatusL( EFalse );
+//        }
+//    else
+//        {
+//        TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - [device-wide operation] => invoking UI") );
+//        iEngine.NotifyClientServerOperationRequestL( aFunction );
+//        }
+//    //
+//    TRACE( RDebug::Printf("[MemSpy] CMemSpyServerSession::HandleThreadAgnosticOpL() - END" ) );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyServer/group/MemSpyServer.mmp	Fri May 14 17:25:03 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:
+*
+*/
+
+#include <bldvariant.hrh>
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGETTYPE EXE
+TARGET MemSpyServer.exe
+EPOCSTACKSIZE 0x4000
+EPOCHEAPSIZE 0x100000 0x4000000
+UID 0 0x2002EA8D
+SECUREID     0xE5883BC2
+VENDORID	 0x101FB657 // Nokia
+
+SOURCEPATH ../Source
+SOURCE 		MemSpyServer.cpp 
+SOURCE		MemSpyServerSession.cpp 
+SOURCE		MemSpyServerMain.cpp 
+
+USERINCLUDE ../Include
+
+CAPABILITY ReadUserData WriteUserData ReadDeviceData WriteDeviceData
+
+OS_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	
+LIBRARY			apparc.lib	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/MemSpyServer/group/bld.inf	Fri May 14 17:25:03 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/bld.inf	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/group/bld.inf	Fri May 14 17:25:03 2010 +0300
@@ -32,7 +32,12 @@
 // 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/memspy/driver/shared/MemSpyDriverObjectsSharedRHeap.h	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/driver/shared/MemSpyDriverObjectsSharedRHeap.h	Fri May 14 17:25:03 2010 +0300
@@ -92,7 +92,7 @@
 	TInt iMinCell;
 	TInt iPageSize;
 #ifdef __SYMBIAN_KERNEL_HYBRID_HEAP__
-	struct SCell { TInt len; SCell* next };
+	struct SCell { TInt len; SCell* next; };
     SCell iFree;
 #else
     RHeap::SCell iFree;
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperHeap.h	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperHeap.h	Fri May 14 17:25:03 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;
@@ -61,6 +64,8 @@
     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 );
+    //cigasto    
+    IMPORT_C TMemSpyHeapData NewHeapRawInfo( const TMemSpyHeapInfo& aInfo ); //not formatted heap info
 
 public: // But not exported
     void OutputHeapDataKernelL( TBool aCreateDataStream );
--- a/memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperKernelContainers.h	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/Helpers/MemSpyEngineHelperKernelContainers.h	Fri May 14 17:25:03 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/ThreadAndProcess/MemSpyEngineObjectThread.h	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/memspy_plat/memspy_api/include/memspy/engine/ThreadAndProcess/MemSpyEngineObjectThread.h	Fri May 14 17:25:03 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/rom/memspy.iby	Mon May 03 13:58:41 2010 +0300
+++ b/memspy/rom/memspy.iby	Fri May 14 17:25:03 2010 +0300
@@ -22,6 +22,10 @@
 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
 
--- a/stif/ATSInterface/src/ATSInterface.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/ATSInterface/src/ATSInterface.cpp	Fri May 14 17:25:03 2010 +0300
@@ -561,12 +561,12 @@
     _LIT( KEngineIniFile, "-engineini" );
     _LIT( KModuleIniFile, "-moduleini" );
 
-	const TInt length = User().CommandLineLength();
+	const TInt length = User::CommandLineLength();
 
     HBufC* cmdLine = HBufC::NewLC( length );
     TPtr ptr = cmdLine->Des();
 
-	User().CommandLine( ptr );
+	User::CommandLine( ptr );
 
     TBool moduleFound( EFalse );
     TLex lex( ptr );
--- a/stif/StifTFwIf/src/UIEngineContainer.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/StifTFwIf/src/UIEngineContainer.cpp	Fri May 14 17:25:03 2010 +0300
@@ -480,7 +480,6 @@
         {
         // Call TestExecuted of CUIEngine interface
         iUIEngine->TestExecuted(this, iRunner->FullResult() );
-        iState = EFinished;
         }
     }
     
--- a/stif/TestCombiner/inc/TestCombiner.h	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestCombiner/inc/TestCombiner.h	Fri May 14 17:25:03 2010 +0300
@@ -655,6 +655,10 @@
         RTimer                      iPauseTimer;
         TName                       iPausedTestCase;
         TInt                        iPauseTime;
+        
+        // Pause combiner timer
+        RTimer                      iPauseCombTimer;
+        TInt                        iPauseCombRemainingTime;
 
         // Temporary line buffer 
         HBufC*                      iLine;
--- a/stif/TestCombiner/src/TestCombiner.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestCombiner/src/TestCombiner.cpp	Fri May 14 17:25:03 2010 +0300
@@ -2445,8 +2445,21 @@
 */
 void CTestRunner::ConstructL()
     {
-    
-    iPauseTimer.CreateLocal();
+    TInt ret;
+    
+    ret = iPauseTimer.CreateLocal();
+    if(ret != KErrNone)
+        {
+        __TRACE( KError, (_L("Unable to create RTimer: iPauseTimer [%d] "), ret));
+        User::Leave(ret);
+        }
+        
+    ret = iPauseCombTimer.CreateLocal();
+    if(ret != KErrNone)
+        {
+        __TRACE( KError, (_L("Unable to create RTimer: iPauseCombTimer [%d] "), ret));
+        User::Leave(ret);
+        }
     
     iRemoteTimer = CRemoteTimer::NewL( iTestCombiner );
     
@@ -2515,6 +2528,8 @@
     iLine = 0;
     
     iPauseTimer.Close();
+    
+    iPauseCombTimer.Close();
          
     }
 
@@ -2550,8 +2565,34 @@
         User::Leave( KErrGeneral );
         }
         
-    TBool continueTask = EFalse; 
+    TBool continueTask = EFalse;
+    
+    // Check if there is still some time for combiner pause and we need to 
+    // continue pausing
+    if(iPauseCombRemainingTime > 0)
+        {           
+        // Maximum time for one RTimer::After request                   
+        TInt maximumTime = KMaxTInt / 1000;                       
+        
+        __TRACE( KMessage, (_L("CTestRunner::RunL: Going to reissue PauseCombiner request ") ) );           
+        __TRACE( KMessage, (_L("CTestRunner::RunL: iRemainingTimeValue = %d"), iPauseCombRemainingTime ) );        
         
+        if( iPauseCombRemainingTime < maximumTime )
+            {                           
+            iPauseCombTimer.After(iStatus, (iPauseCombRemainingTime * 1000));
+            iPauseCombRemainingTime = 0;
+            }
+        else
+            {            
+            iPauseCombRemainingTime -= maximumTime;
+            iPauseCombTimer.After(iStatus, (maximumTime * 1000));        
+            }     
+            
+        SetActive();
+        return;
+        }     
+ 
+    // Handling runner states
     switch( iState )
         {
         case ERunnerWaitTimeout:
@@ -2695,6 +2736,8 @@
     __TRACE( KMessage, (_L("CTestRunner::DoCancel")));
     iTestCombiner->TestModuleIf().Printf( KPrintPriLow, _L("Runner"), _L("DoCancel"));
     
+    iPauseCombTimer.Cancel();
+    
     switch( iState )
         {
         case ERunnerWaitTimeout:
@@ -3397,7 +3440,7 @@
 	_LIT( KErrMsgPauseTimeoutNotDefined, "PauseCombiner : No timeout value given or value has invalid format" );
 	_LIT( KErrMsgPauseTimeoutNotPositive, "PauseCombiner : Timeout value can't be <0" );
 
-    TBool continueTask = ETrue;
+    TBool continueTask = EFalse;
     TInt pauseTime;
     TInt ret = KErrNone;
     
@@ -3416,12 +3459,31 @@
         User::Leave( KErrArgument );
         }    
     
-    //Time given by End User should be given in miliseconds
-    pauseTime*=1000;
-
-    __TRACE( KMessage, (_L("time=%d"), pauseTime ) );
-
-    User::After( pauseTime );
+    
+    // Maximum time for one RTimer::After request
+    TInt maximumTime = KMaxTInt / 1000;
+
+    // Check if pause value is suitable for RTimer::After
+    if(pauseTime < maximumTime)
+        {
+        iPauseCombTimer.After(iStatus, pauseTime * 1000);
+        iPauseCombRemainingTime = 0;
+        }
+    else
+        {
+        // Given pause value after multiplication with 1000 is
+        // larger than KMaxTInt, so we need to split it and 
+        // re-request After with remaining value from RunL
+
+        iPauseCombRemainingTime = pauseTime - maximumTime;
+        iPauseCombTimer.After(iStatus, maximumTime * 1000);
+        }
+
+    SetActive();
+
+    __TRACE(KMessage, (_L("Executing pause, time=[%d]"), pauseTime));
+    
+    iState = ERunnerRunning;
     
     return continueTask;
 }
--- a/stif/TestEngine/inc/TestEngine.h	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestEngine/inc/TestEngine.h	Fri May 14 17:25:03 2010 +0300
@@ -59,20 +59,25 @@
     };
 
 // Struct to Test report settings
-class TTestReportSettings
+NONSHARABLE_CLASS(CTestReportSettings)
+	:public CBase
     {
     public:
+    
+        /**
+        * NewL is two-phased constructor.
+        */
+        static CTestReportSettings* NewL();
 
-        TTestReportSettings(){ iCreateTestReport = ETrue;
-                                iPath = NULL;
-                                iName = NULL;
-                                iFormat = CStifLogger::ETxt;
-                                iOutput = CStifLogger::EFile;
-                                iOverwrite = ETrue; 
-                                iXML = EFalse;
-                             }
 
-       ~TTestReportSettings(){ delete iPath; delete iName; }
+       ~CTestReportSettings();
+       
+    private:
+       CTestReportSettings();
+       /**
+       * By default Symbian OS constructor is private.
+       */
+       void ConstructL();
 
     public:
 
@@ -231,7 +236,7 @@
 
     public:     // Data
         // Test report settings
-        TTestReportSettings     iTestReportSettings;
+        CTestReportSettings*     iTestReportSettings;
 
         // Logger overwrite settings
         TLoggerSettings         iLoggerSettings;
--- a/stif/TestEngine/inc/TestReport.h	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestEngine/inc/TestReport.h	Fri May 14 17:25:03 2010 +0300
@@ -156,7 +156,7 @@
         /**
         * Two-phased constructor.
         */
-        static CTestReport* NewL( TTestReportSettings& aTestReportSettings,
+        static CTestReport* NewL( CTestReportSettings& aTestReportSettings,
                                   const TTestReportMode aReportMode );
         
         /**
@@ -199,7 +199,7 @@
         /**
         * By default Symbian OS constructor is private.
         */
-        void ConstructL(  TTestReportSettings& aTestReportSettings );
+        void ConstructL(  CTestReportSettings& aTestReportSettings );
 
         /**
         * Default C++ constructor.
--- a/stif/TestEngine/src/TestCaseController.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestEngine/src/TestCaseController.cpp	Fri May 14 17:25:03 2010 +0300
@@ -2567,18 +2567,7 @@
         __TRACE( KInit, (  _L("Loaded reset module[%S]"), &dllName ) );
         }
 
-    // Verify the UID
-    TUid KUidTestModule = TUid::Uid ( 0x101FB3E7 );
-    TUidType requiredUID( KDynamicLibraryUid, KSharedLibraryUid, KUidTestModule );
-
-    TUidType moduleUID = resetModule.Type();    
-    if ( moduleUID != requiredUID )
-        {
-        // New instance can't be created
-        RDebug::Print( ( _L("STIF TF: Reset module has invalid UID. Aborting loading!") ) );
-        __TRACE ( KError, ( CStifLogger::EError, _L("Reset module has invalid UID. Aborting loading!" ) ) );
-        return KErrNotSupported;
-        }
+    
 
     // Get pointer to first exported function
     CTestInterfaceFactory libEntry;
--- a/stif/TestEngine/src/TestEngine.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestEngine/src/TestEngine.cpp	Fri May 14 17:25:03 2010 +0300
@@ -411,6 +411,8 @@
 */
 void CTestEngineServer::ConstructL()
     {
+    // Create report setting
+    iTestReportSettings = CTestReportSettings::NewL();
     // Create container
     iContainerIndex = CObjectConIx::NewL();
 
@@ -505,6 +507,8 @@
     __TRACE(KAlways, ( _L( "---------------- Log Ended ----------------" ) ) );
     delete iLogger;
 
+    delete iTestReportSettings;
+    iTestReportSettings = NULL;
     }
 
 /*
@@ -881,6 +885,7 @@
         iTestCases = NULL;
         }
     
+    iTestCaseArray.Close();    
     delete iTestEngineSubSessions;
     iTestEngineSubSessions = NULL;
 
@@ -1234,14 +1239,18 @@
 void CTestEngine::InitTestReportAndLoggerVarL()
     {
     // Test report settings initialization
-    iTestEngineServer->iTestReportSettings.iCreateTestReport = ETrue;
+    iTestEngineServer->iTestReportSettings->iCreateTestReport = ETrue;
     _LIT( path, "C:\\LOGS\\TestFramework\\");
     _LIT( name, "TestReport");
-    iTestEngineServer->iTestReportSettings.iPath = path().AllocL();
-    iTestEngineServer->iTestReportSettings.iName = name().AllocL();
-    iTestEngineServer->iTestReportSettings.iFormat = CStifLogger::ETxt;
-    iTestEngineServer->iTestReportSettings.iOutput = CStifLogger::EFile;
-    iTestEngineServer->iTestReportSettings.iOverwrite = ETrue;
+    delete iTestEngineServer->iTestReportSettings->iPath;
+    iTestEngineServer->iTestReportSettings->iPath = NULL;
+    iTestEngineServer->iTestReportSettings->iPath = path().AllocL();
+    delete iTestEngineServer->iTestReportSettings->iName;
+    iTestEngineServer->iTestReportSettings->iName = NULL;
+    iTestEngineServer->iTestReportSettings->iName = name().AllocL();
+    iTestEngineServer->iTestReportSettings->iFormat = CStifLogger::ETxt;
+    iTestEngineServer->iTestReportSettings->iOutput = CStifLogger::EFile;
+    iTestEngineServer->iTestReportSettings->iOverwrite = ETrue;
 
     // Initializations to indicator is setting in use
     iTestEngineServer->iLoggerSettings.iIsDefined.iCreateLogDir = EFalse;
@@ -1370,10 +1379,10 @@
     Logger()->WriteDelimiter();
     
     // Create Test Reporter if allowed
-    if ( iTestEngineServer->iTestReportSettings.iCreateTestReport )
+    if ( iTestEngineServer->iTestReportSettings->iCreateTestReport )
         {
         TRAPD(err, iTestReport = 
-            CTestReport::NewL( iTestEngineServer->iTestReportSettings, 
+            CTestReport::NewL( *(iTestEngineServer->iTestReportSettings), 
                                ( CTestReport::TTestReportMode ) iReportMode ));
         if(err!=KErrNone)
             {
@@ -1476,7 +1485,7 @@
         if ( get_ret == KErrNone )
             {
             __TRACE( KInit,( _L( "Test report creation indicator: %d"), createTestReport ) );
-            iTestEngineServer->iTestReportSettings.iCreateTestReport = createTestReport;
+            iTestEngineServer->iTestReportSettings->iCreateTestReport = createTestReport;
             }
         else
             {
@@ -1484,7 +1493,7 @@
             }
 
         // Get Test report path settings
-        if ( iTestEngineServer->iTestReportSettings.iCreateTestReport )
+        if ( iTestEngineServer->iTestReportSettings->iCreateTestReport )
             {
             __TRACE( KInit,( _L( "Parsing Test report path" ) ) );
             TPtrC path;
@@ -1494,9 +1503,9 @@
                 {
                 __TRACE( KInit,( _L( "Test report path: %S"), &path ) );
                 // Delete old one before setting new one
-                delete iTestEngineServer->iTestReportSettings.iPath;
-				iTestEngineServer->iTestReportSettings.iPath = NULL;
-                iTestEngineServer->iTestReportSettings.iPath = path.AllocL();
+                delete iTestEngineServer->iTestReportSettings->iPath;
+				iTestEngineServer->iTestReportSettings->iPath = NULL;
+                iTestEngineServer->iTestReportSettings->iPath = path.AllocL();
                 }
             else
                 {
@@ -1505,7 +1514,7 @@
             }
 
         // Get Test report name settings
-        if ( iTestEngineServer->iTestReportSettings.iCreateTestReport )
+        if ( iTestEngineServer->iTestReportSettings->iCreateTestReport )
             {
             __TRACE( KInit,( _L( "Parsing Test report filename" ) ) );
             TPtrC name;
@@ -1515,9 +1524,9 @@
                 {
                 __TRACE( KInit,( _L( "Test report filename: %S"), &name ) );
                 // Delete old one before setting new one
-                delete iTestEngineServer->iTestReportSettings.iName;
-				iTestEngineServer->iTestReportSettings.iName = NULL;
-                iTestEngineServer->iTestReportSettings.iName = name.AllocL();
+                delete iTestEngineServer->iTestReportSettings->iName;
+				iTestEngineServer->iTestReportSettings->iName = NULL;
+                iTestEngineServer->iTestReportSettings->iName = name.AllocL();
                 }
             else
                 {
@@ -1526,7 +1535,7 @@
             }
 
         // Get Test report format settings
-        if ( iTestEngineServer->iTestReportSettings.iCreateTestReport )
+        if ( iTestEngineServer->iTestReportSettings->iCreateTestReport )
             {
             __TRACE( KInit,( _L( "Parsing Test report format" ) ) );
             CStifLogger::TLoggerType type;
@@ -1536,8 +1545,8 @@
             if ( get_ret == KErrNone )
                 {
                 __TRACE( KInit,( _L( "Test report format: %d, xml: %d"), type, xml ) );
-                iTestEngineServer->iTestReportSettings.iFormat = type;
-                iTestEngineServer->iTestReportSettings.iXML = xml;
+                iTestEngineServer->iTestReportSettings->iFormat = type;
+                iTestEngineServer->iTestReportSettings->iXML = xml;
                 }
             else
                 {
@@ -1546,7 +1555,7 @@
             }
 
         // Get Test report output settings
-        if ( iTestEngineServer->iTestReportSettings.iCreateTestReport )
+        if ( iTestEngineServer->iTestReportSettings->iCreateTestReport )
             {
             __TRACE( KInit,( _L( "Parsing Test report output" ) ) );
             CStifLogger::TOutput output;
@@ -1555,7 +1564,7 @@
             if ( get_ret == KErrNone )
                 {
                 __TRACE( KInit,( _L( "Test report output: %d"), output ) );
-                iTestEngineServer->iTestReportSettings.iOutput = output;
+                iTestEngineServer->iTestReportSettings->iOutput = output;
                 }
             else
                 {
@@ -1564,7 +1573,7 @@
             }
 
         // Get Test report file creation mode (overwrite settings)
-        if ( iTestEngineServer->iTestReportSettings.iCreateTestReport )
+        if ( iTestEngineServer->iTestReportSettings->iCreateTestReport )
             {
             __TRACE( KInit,( _L( "Parsing Test report file writing mode" ) ) );
             TBool overwrite;
@@ -1573,7 +1582,7 @@
             if ( get_ret == KErrNone )
                 {
                 __TRACE( KInit,( _L( "Test report file creation mode: %d"), overwrite ) );
-                iTestEngineServer->iTestReportSettings.iOverwrite = overwrite;
+                iTestEngineServer->iTestReportSettings->iOverwrite = overwrite;
                 }
             else
                 {
@@ -5570,6 +5579,74 @@
 
     DESCRIPTION
 
+    Default constructor
+
+-------------------------------------------------------------------------------
+*/
+CTestReportSettings::CTestReportSettings()
+    {
+    iCreateTestReport = ETrue;
+    iPath = NULL;
+    iName = NULL;
+    iFormat = CStifLogger::ETxt;
+    iOutput = CStifLogger::EFile;
+    iOverwrite = ETrue; 
+    iXML = EFalse;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    Two-phased constructor.
+
+-------------------------------------------------------------------------------
+*/
+CTestReportSettings* CTestReportSettings::NewL()
+    {
+    CTestReportSettings* self = new ( ELeave ) CTestReportSettings();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    Symbian OS second phase constructor
+
+-------------------------------------------------------------------------------
+*/
+void CTestReportSettings::ConstructL()
+    {
+    
+    }
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    Destructor
+
+-------------------------------------------------------------------------------
+*/
+CTestReportSettings::~CTestReportSettings()
+    { 
+    delete iPath; 
+    iPath = NULL;
+    delete iName;
+    iName = NULL;
+    } 
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
     This module contains implementation of CRebootParams class member functions.
 
 -------------------------------------------------------------------------------
--- a/stif/TestEngine/src/TestModuleController.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestEngine/src/TestModuleController.cpp	Fri May 14 17:25:03 2010 +0300
@@ -250,6 +250,11 @@
 
     if ( r != KErrNone )
         {
+        if ( r == KErrBadName )
+            {
+            __TRACE( KError, ( CStifLogger::ERed, _L( "Test Module name or Configuration File name is too long: [%S]" ), &name) );
+            LeaveWithNotifyL( r,  _L( "Test Module name or Configuration File name is too long." ) );
+            }
         __TRACE( KError, ( CStifLogger::ERed, _L( "Can't connect to test module [%S], IniFile [%S]" ), &name, &aIniFile ) );
         LeaveWithNotifyL( r,  _L( "Can't connect to test module" ) );
         }
@@ -393,10 +398,11 @@
     iTestCaseArray.Close();
 
     // Release the config file array
+    iConfigFiles.ResetAndDestroy();
     iConfigFiles.Close();
 
     // Release the config file array
-    iFailedEnumerateConfig.Reset();
+    iFailedEnumerateConfig.ResetAndDestroy();
     iFailedEnumerateConfig.Close();
     
     // Release the children array
--- a/stif/TestEngine/src/TestReport.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestEngine/src/TestReport.cpp	Fri May 14 17:25:03 2010 +0300
@@ -194,7 +194,7 @@
 
 -------------------------------------------------------------------------------
 */
-void CTestReport::ConstructL( TTestReportSettings& aTestReportSettings )
+void CTestReport::ConstructL( CTestReportSettings& aTestReportSettings )
     {
     // Create summary for all test cases
     _LIT( KName, "All test cases" );
@@ -248,28 +248,24 @@
             {
             User::LeaveIfError( iFile.Replace( iFs, 
                            pathAndFile,
-                           EFileWrite | EFileStreamText | EFileShareAny ) );
+                           EFileWrite | EFileStreamText | EFileShareExclusive ) );
             }
         else
             {
-            TBool isOpen( EFalse );
-            TInt fileOpen = iFs.IsFileOpen( pathAndFile, isOpen );
+            TInt fileOpen = iFile.Open( iFs, 
+                                        pathAndFile, 
+                                        EFileWrite | EFileStreamText | EFileShareAny );
             if( fileOpen == KErrNotFound )
                 {
                 User::LeaveIfError( 
                     iFile.Create( iFs, 
                                   pathAndFile, 
-                                  EFileWrite | EFileStreamText | EFileShareAny ) );
+                                  EFileWrite | EFileStreamText | EFileShareExclusive ) );
                 }
             else if( fileOpen == KErrNone )
                 {
-                User::LeaveIfError( 
-                    iFile.Open( iFs, 
-                                pathAndFile, 
-                                EFileWrite | EFileStreamText | EFileShareAny ) );
                 TInt endPosOfFile = 0;
                 User::LeaveIfError( iFile.Seek( ESeekEnd, endPosOfFile ) );
-
                 }
             else
                 {
@@ -307,7 +303,7 @@
 
 -------------------------------------------------------------------------------
 */
-CTestReport* CTestReport::NewL( TTestReportSettings& aTestReportSettings,
+CTestReport* CTestReport::NewL( CTestReportSettings& aTestReportSettings,
                                 const TTestReportMode aReportMode )
     {
     CTestReport* self = new ( ELeave ) CTestReport( aReportMode );
@@ -339,6 +335,9 @@
 */
 CTestReport::~CTestReport()
     {
+    iTestModulesVersionsInfo.ResetAndDestroy();
+    iTestModulesVersionsInfo.Close();
+        
     // Reset and destroy arrays
     iTestSummaries.ResetAndDestroy();
     delete iTotalSummary;
--- a/stif/TestInterface/src/TestInterface.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestInterface/src/TestInterface.cpp	Fri May 14 17:25:03 2010 +0300
@@ -418,7 +418,7 @@
     //__UHEAP_MARK;
 
     // Get module name from command line
-	const TInt length = User().CommandLineLength();
+	const TInt length = User::CommandLineLength();
     HBufC* cmdLine = HBufC::New( length );
     
     if ( cmdLine == NULL )
@@ -428,7 +428,7 @@
         }
 
     TPtr moduleName = cmdLine->Des();
-    User().CommandLine( moduleName );
+    User::CommandLine( moduleName );
 
     RDebug::Print(_L("StartSession() Received data [%S]"), &moduleName);
 
Binary file stif/TestModuleTemplates/TestModuleTemplates.zip has changed
--- a/stif/TestServer/inc/TestServer.h	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestServer/inc/TestServer.h	Fri May 14 17:25:03 2010 +0300
@@ -703,7 +703,64 @@
 
     };
 
+// DESCRIPTION
+// CTestCasesList is a class, which contains list of test cases assosiated with
+// specified config file.
+NONSHARABLE_CLASS( CTestCasesList ): public CBase
+    {
+public:
+    /**
+    * NewL is first phase of two-phased constructor.
+    */
+    static CTestCasesList* NewL( const TDesC& aConfigFileName );
+public:
+    /**
+    * Destructor of CTestServer.
+    */
+    ~CTestCasesList();
 
+    /**
+     * Appends test case.
+     */
+    void AppendTestCaseL( const TDesC& aTestCaseTitle );
+    
+    /**
+     * Returns specified test case title.
+     */
+    const TDesC& GetTestCaseTitleL( TInt aIndex ) const;
+    
+    /**
+     * Returns config file name.
+     */
+    const TDesC& GetConfigFileName() const;
+    
+    /**
+     * Returns count of test cases.
+     */
+    TInt Count() const;
+    
+    /**
+     * Resets list of test cases.
+     */
+    void ResetAndDestroy();
+private:
+    /** 
+    * C++ default constructor.
+    */
+    CTestCasesList();
+    
+    /**
+    * By default Symbian OS constructor is private.
+    */
+    void ConstructL( const TDesC& aConfigFileName );
+private:
+    // Config file name
+    HBufC* iConfigFileName;
+    // List of test cases
+    RPointerArray<HBufC> iTestCases;
+    };
+
+        
 // DESCRIPTION
 // CTestModule is a session class.
 // Session for the CTestServer server, to a single client-side session
@@ -844,7 +901,7 @@
         /**
         * Get title of currently running test case
         */ 
-        void GetTestCaseTitleL(TInt aTestCaseNumber, TDes& aTestCaseTitle);
+        void GetTestCaseTitleL(TInt aTestCaseNumber, const TDesC& aConfigFile, TDes& aTestCaseTitle);
 
         /**
          * Get pointer to test server
@@ -901,7 +958,7 @@
 
         TBool iErrorMessageAvailable;            // Error message available?
         
-        RPointerArray<TDesC> iTestCaseTitles;    //Test case titles
+        RPointerArray<CTestCasesList> iTestCaseTitlesMap;    //Test case titles
         
     public:     // Friend classes
         // None
--- a/stif/TestServer/src/TestExecutionThread.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestServer/src/TestExecutionThread.cpp	Fri May 14 17:25:03 2010 +0300
@@ -272,22 +272,7 @@
         __TRACEI (KInit, (  _L("Loaded test module[%S]"), &moduleName ) );
         }
 
-    // Verify the UID
-    TUid KUidTestModule = TUid::Uid ( 0x101FB3E7 );
-    TUidType requiredUID( KDynamicLibraryUid, KSharedLibraryUid, KUidTestModule );
-
-    TUidType moduleUID = aModule.Type();    
-    if ( moduleUID != requiredUID )
-        {
-        // New instance can't be created
-        RDebug::Print( ( _L("STIF TF: Test module has invalid UID. Aborting loading!") ) );
-        __TRACEI (KError, ( CStifLogger::EError, _L("Test module has invalid UID. Aborting loading!")));
-        tmpBuffer.Format(_L("Module [%S] has invalid UID"), &moduleName);
-        ErrorPrint( 1, tmpBuffer ); 
-        ModuleContainer().OperationErrorResult() = KErrNotSupported;
-        return KErrNotSupported;
-        }
-
+    
     // Get pointer to first exported function
     ModuleContainer().OperationText() = _L("1st EXPORTED function");
     CTestInterfaceFactory libEntry;
--- a/stif/TestServer/src/TestModuleContainer.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestServer/src/TestModuleContainer.cpp	Fri May 14 17:25:03 2010 +0300
@@ -1747,19 +1747,7 @@
         __TRACE( KInit, (  _L("Loaded test module[%S]"), &dllName ) );
         }
 
-    // Verify the UID
-    TUid KUidTestModule = TUid::Uid ( 0x101FB3E7 );
-    TUidType requiredUID( KDynamicLibraryUid, KSharedLibraryUid, KUidTestModule );
-
-    TUidType moduleUID = testModule.Type();    
-    if ( moduleUID != requiredUID )
-        {
-        // New instance can't be created
-        RDebug::Print( ( _L("STIF TF: Test module has invalid UID. Aborting loading!") ) );
-        __TRACE ( KError, ( CStifLogger::EError, _L("Test module has invalid UID. Aborting loading!" ) ) );
-        testModule.Close();
-        return KErrNotSupported;
-        }
+    
 
     CTestInterfaceFactoryTestModule libEntry = NULL;
     
@@ -1973,7 +1961,10 @@
 */
 void CTestModuleContainer::GetTestCaseTitleL(TDes& aTestCaseTitle)
     {
-    iCTestModule->GetTestCaseTitleL(iOperationIntBuffer, aTestCaseTitle); //currently run test case stored in the iOperationIntBuffer variable 
+    //currently run test case stored in the iOperationIntBuffer variable
+    iCTestModule->GetTestCaseTitleL( iOperationIntBuffer, 
+                                     iCTestExecution->GetConfigFileName(),
+                                    aTestCaseTitle);  
     }
 
 
--- a/stif/TestServer/src/TestServerClient.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestServer/src/TestServerClient.cpp	Fri May 14 17:25:03 2010 +0300
@@ -120,6 +120,15 @@
     do
         {
         semName.Format(_L("%S%d"), &semaphoreName, x);
+        if (semName.Length() > KMaxKernelName)
+            {
+            // if the cfg file name is larger than maximum length of acceptable length of semaphore .
+            RDebug::Print(_L("Test Module name or Configuration File name is too long."));
+            
+            semName.Close();
+            return KErrBadName;
+            }
+        
         ret = startSemaphore.CreateGlobal(semName, 0);
         RDebug::Print(_L("RTestServer::Connect() Creating global semaphore [%S] with result [%d]"), &semName, ret);
         if(ret != KErrAlreadyExists)
@@ -153,7 +162,7 @@
     // Data to be passed to new process. It will contain module name and synchronization semaphore name separated with space.
     // I.e. it will be: "mymodule startupSemaphore0"
     RBuf data; 
-    ret = data.Create(KMaxName);
+    ret = data.Create(KMaxFileName);
     if(ret != KErrNone)
         {
         RDebug::Print(_L("RTestServer::Connect() Could not create buffer for data to be passed to process [%d]"), ret);
--- a/stif/TestServer/src/Testserversession.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestServer/src/Testserversession.cpp	Fri May 14 17:25:03 2010 +0300
@@ -55,6 +55,234 @@
 
 // ================= MEMBER FUNCTIONS =========================================
 
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: NewL
+
+    Description: Create new test cases list    
+
+    Parameters: const TDesC& aConfigFileName :in:  Config file name
+
+    Return Values: CTestCasesList* Pointer to new test cases list
+
+    Errors/Exceptions: Leaves if memory allocation fails or ConstructL leaves.
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CTestCasesList* CTestCasesList::NewL( const TDesC& aConfigFileName )
+    {    
+    CTestCasesList* self = new(ELeave)CTestCasesList;
+    CleanupStack::PushL( self );
+    self->ConstructL( aConfigFileName );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: ~CTestCasesList
+
+    Description: Destructor    
+
+    Parameters: 
+
+    Return Values: 
+
+    Errors/Exceptions: 
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CTestCasesList::~CTestCasesList()
+    {
+    delete iConfigFileName;
+    iConfigFileName = NULL;
+    iTestCases.ResetAndDestroy();
+    iTestCases.Close();
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: AppendTestCaseL
+
+    Description: Appends test case.
+
+    Parameters: const TDesC& aTestCaseTitle  in: Test case title
+
+    Return Values: 
+
+    Errors/Exceptions: Leaves if memory allocation fails
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+void CTestCasesList::AppendTestCaseL( const TDesC& aTestCaseTitle )
+    {
+    HBufC* testCaseTitle = aTestCaseTitle.AllocL();
+    CleanupStack::PushL( testCaseTitle );
+    iTestCases.AppendL( testCaseTitle );
+    CleanupStack::Pop( testCaseTitle );
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: GetTestCaseTitleL
+
+    Description: Returns specified test case title  
+
+    Parameters: TInt aIndex: in: Requested test case index. 
+
+    Return Values: Test case title.
+
+    Errors/Exceptions: Leaves if test case index is invalid
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+const TDesC& CTestCasesList::GetTestCaseTitleL( TInt aIndex ) const
+    {    
+    if ( ( aIndex < 0 ) || ( aIndex >= iTestCases.Count() ) )
+        {
+        User::Leave( KErrNotFound );
+        }
+    return *iTestCases[ aIndex ];
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: GetConfigFileName
+
+    Description: Returns config file name  
+
+    Parameters: 
+
+    Return Values: Config file name.
+
+    Errors/Exceptions: 
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+const TDesC& CTestCasesList::GetConfigFileName() const
+    {    
+    return *iConfigFileName;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: Count
+
+    Description: Returns count of test cases.    
+
+    Parameters: 
+
+    Return Values: Test cases count.
+
+    Errors/Exceptions: 
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+TInt CTestCasesList::Count() const
+    {
+    return iTestCases.Count();
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: ResetAndDestroy
+
+    Description: Resets list of test cases.    
+
+    Parameters: 
+
+    Return Values: 
+
+    Errors/Exceptions: 
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+void CTestCasesList::ResetAndDestroy()
+    {    
+    iTestCases.ResetAndDestroy();
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: ~CTestCasesList
+
+    Description: Destructor    
+
+    Parameters: 
+
+    Return Values: 
+
+    Errors/Exceptions: 
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CTestCasesList::CTestCasesList()
+    {
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestCasesList
+
+    Method: ~CTestCasesList
+
+    Description: Destructor    
+
+    Parameters: 
+
+    Return Values: 
+
+    Errors/Exceptions: 
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+void CTestCasesList::ConstructL( const TDesC& aConfigFileName )
+    {
+    iConfigFileName = aConfigFileName.AllocL();
+    }
 
 /*
 -------------------------------------------------------------------------------
@@ -188,8 +416,8 @@
     iIniBuffer = NULL;
 
     // Delete array of test case titles
-    iTestCaseTitles.ResetAndDestroy();
-    iTestCaseTitles.Close();
+    iTestCaseTitlesMap.ResetAndDestroy();
+    iTestCaseTitlesMap.Close();
     }
 
 /*
@@ -690,18 +918,34 @@
         User::Leave( KErrGeneral );
         }
     
+    CTestCasesList* testCasesList = NULL;
+    for ( TInt i = 0; i < iTestCaseTitlesMap.Count(); i++ )
+        {
+        if ( iTestCaseTitlesMap[ i ]->GetConfigFileName() == config )
+            {
+            testCasesList = iTestCaseTitlesMap[ i ];
+            break;
+            }
+        }
+    if ( testCasesList == NULL )
+        {
+        testCasesList = CTestCasesList::NewL( config );
+        CleanupStack::PushL( testCasesList );
+        iTestCaseTitlesMap.AppendL( testCasesList );
+        CleanupStack::Pop( testCasesList );
+        }
+    
     // Store titles (for further use, i.e. when asked for title from the interface via CTestModuleIf->CTestThreadContainer->CTestModuleContainer)
-    iTestCaseTitles.ResetAndDestroy();
+    testCasesList->ResetAndDestroy();
     TInt i;
     for(i = 0; i < testCases->Count(); i++)
         {
         //Handle situation when test cases are enumerated not as 0-based (testscripter, ...)
         if(i == 0 && (*testCases)[i]->iCaseNumber > 0)
             {
-            iTestCaseTitles.Append(NULL);
+            testCasesList->AppendTestCaseL( KNullDesC );
             }
-        HBufC* title = (*testCases)[i]->iTitle.AllocL();
-        iTestCaseTitles.Append(title);
+        testCasesList->AppendTestCaseL( (*testCases)[i]->iTitle );
         }
     
     TPckgBuf<TInt> countPckg( testCases->Count() );
@@ -1380,10 +1624,25 @@
     
 -------------------------------------------------------------------------------
 */
-void CTestModule::GetTestCaseTitleL(TInt aTestCaseNumber, TDes& aTestCaseTitle)
+void CTestModule::GetTestCaseTitleL(TInt aTestCaseNumber, const TDesC& aConfigFile,TDes& aTestCaseTitle)
     {
-    RDebug::Print(_L("Trying to get test case title from module. Index=%d, count=%d"), aTestCaseNumber, iTestCaseTitles.Count());
-    aTestCaseTitle.Copy(*(iTestCaseTitles[aTestCaseNumber]));
+    CTestCasesList* testCasesList = NULL;
+    for ( TInt i = 0; i < iTestCaseTitlesMap.Count(); i++ )
+        {
+        if ( iTestCaseTitlesMap[ i ]->GetConfigFileName() == aConfigFile )
+            {
+            testCasesList = iTestCaseTitlesMap[ i ];
+            break;
+            }
+        }
+    if ( testCasesList == NULL )
+        {
+        User::Leave( KErrNotFound );
+        }
+    
+    RDebug::Print(_L("Trying to get test case title from module. Index=%d, count=%d"), aTestCaseNumber, testCasesList->Count() );
+    
+    aTestCaseTitle.Copy( testCasesList->GetTestCaseTitleL( aTestCaseNumber ) );
     }
 
 
--- a/stif/TestServerStarter/src/TestServerStarter.cpp	Mon May 03 13:58:41 2010 +0300
+++ b/stif/TestServerStarter/src/TestServerStarter.cpp	Fri May 14 17:25:03 2010 +0300
@@ -53,7 +53,7 @@
     RDebug::Print(_L("STIF: New process starting"));
 
     // Get module name from command line
-	const TInt length = User().CommandLineLength();
+	const TInt length = User::CommandLineLength();
 
     HBufC* cmdLine = HBufC::New( length );
     
@@ -64,7 +64,7 @@
 
     TPtr moduleName = cmdLine->Des();
 
-	User().CommandLine( moduleName );
+	User::CommandLine( moduleName );
 
     RDebug::Print(_L("STIF: Received data [%S]"), &moduleName);
 
--- a/stif/group/ReleaseNote.txt	Mon May 03 13:58:41 2010 +0300
+++ b/stif/group/ReleaseNote.txt	Fri May 14 17:25:03 2010 +0300
@@ -1,5 +1,5 @@
 ========================================================================
-RELEASE NOTE FOR STIF - STIF_201012 (7.3.29)
+RELEASE NOTE FOR STIF - STIF_201016 (7.3.31)
 SUPPORTING SERIES 60 3.0 ->
 ========================================================================
 
--- a/stif/inc/TestServerModuleIf.h	Mon May 03 13:58:41 2010 +0300
+++ b/stif/inc/TestServerModuleIf.h	Fri May 14 17:25:03 2010 +0300
@@ -470,6 +470,7 @@
         */
         TInt TestThreadMutexHandle() { return iTestThreadMutex.Handle(); };
 
+        const TDesC& GetConfigFileName() const { return iConfig; }
     public: // Functions from base classes
         // None
 
--- a/stif/inc/version.h	Mon May 03 13:58:41 2010 +0300
+++ b/stif/inc/version.h	Fri May 14 17:25:03 2010 +0300
@@ -20,9 +20,9 @@
 
 #define STIF_MAJOR_VERSION 7
 #define STIF_MINOR_VERSION 3
-#define STIF_BUILD_VERSION 29
+#define STIF_BUILD_VERSION 31
 
-#define STIF_REL_DATE "23th Mar 2010"
+#define STIF_REL_DATE "19th Apr 2010"
 
 #define TO_UNICODE(text) _L(text) 
 
Binary file stif/sis/Stif_31.sis has changed