perfsrv/memspy/Engine/Source/ClientServer/MemSpyEngineServer.cpp
author hgs
Tue, 26 Oct 2010 16:20:32 +0300
changeset 62 1c2bb2fc7c87
parent 52 c2f44e33b468
permissions -rw-r--r--
201043
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "MemSpyEngineServer.h"
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// System includes
hgs
parents:
diff changeset
    21
#include <e32svr.h>
hgs
parents:
diff changeset
    22
#include <w32std.h>
52
hgs
parents: 51
diff changeset
    23
//#include <coedef.h>  
51
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
// User includes
hgs
parents:
diff changeset
    26
#include <memspy/engine/memspyengine.h>
hgs
parents:
diff changeset
    27
#include <memspy/engine/memspyenginelogger.h>
hgs
parents:
diff changeset
    28
#include <memspyengineclientinterface.h>
hgs
parents:
diff changeset
    29
#include <memspy/engine/memspyengineobjectthread.h>
hgs
parents:
diff changeset
    30
#include <memspy/engine/memspyengineobjectprocess.h>
hgs
parents:
diff changeset
    31
#include <memspy/engine/memspyengineobjectcontainer.h>
hgs
parents:
diff changeset
    32
#include <memspy/engine/memspyenginehelperchunk.h>
hgs
parents:
diff changeset
    33
#include <memspy/engine/memspyenginehelpercodesegment.h>
hgs
parents:
diff changeset
    34
#include <memspy/engine/memspyenginehelperheap.h>
hgs
parents:
diff changeset
    35
#include <memspy/engine/memspyenginehelperstack.h>
hgs
parents:
diff changeset
    36
#include <memspy/engine/memspyenginehelperthread.h>
hgs
parents:
diff changeset
    37
#include <memspy/engine/memspyenginehelperprocess.h>
hgs
parents:
diff changeset
    38
#include <memspy/engine/memspyenginehelperfilesystem.h>
hgs
parents:
diff changeset
    39
#include <memspy/engine/memspyenginehelperram.h>
hgs
parents:
diff changeset
    40
#include <memspy/engine/memspyenginehelpersysmemtracker.h>
hgs
parents:
diff changeset
    41
#include <memspy/engine/memspyenginehelpersysmemtrackerconfig.h>
hgs
parents:
diff changeset
    42
#include <memspy/engine/memspyenginehelperkernelcontainers.h>
hgs
parents:
diff changeset
    43
#include <memspy/engine/memspyengineobjectthreadinfocontainer.h>
hgs
parents:
diff changeset
    44
#include <memspy/engine/memspyengineobjectthreadinfoobjects.h>
hgs
parents:
diff changeset
    45
#include <memspy/engine/memspyenginehelpersysmemtrackercycle.h>
hgs
parents:
diff changeset
    46
#include <memspy/engine/memspyenginehelperserver.h>
hgs
parents:
diff changeset
    47
#include <memspy/engine/memspyenginehelperecom.h>
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
#include <memspy/engine/memspyprocessdata.h>
hgs
parents:
diff changeset
    50
#include <memspy/engine/memspythreaddata.h>
hgs
parents:
diff changeset
    51
#include <memspy/engine/memspykernelobjectdata.h>
hgs
parents:
diff changeset
    52
#include <memspy/engine/memspythreadinfoitemdata.h>
hgs
parents:
diff changeset
    53
#include <memspy/engine/memspymemorytrackingcycledata.h>
hgs
parents:
diff changeset
    54
#include <memspy/engine/memspyengineoutputsink.h>
hgs
parents:
diff changeset
    55
#include <memspy/engine/memspyenginehelperactiveobject.h>
hgs
parents:
diff changeset
    56
#include <memspy/engine/memspyserverdata.h>
hgs
parents:
diff changeset
    57
#include <memspysession.h>
hgs
parents:
diff changeset
    58
#include <memspy/engine/memspyecomdata.h>
62
hgs
parents: 52
diff changeset
    59
#include <memspy/engine/memspychunkdata.h>
hgs
parents: 52
diff changeset
    60
#include <memspy/engine/memspycodesegmentdata.h>
51
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
inline CShutdown::CShutdown() :CTimer(-1)
hgs
parents:
diff changeset
    63
    {
hgs
parents:
diff changeset
    64
    CActiveScheduler::Add(this);
hgs
parents:
diff changeset
    65
    }
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
inline void CShutdown::ConstructL()
hgs
parents:
diff changeset
    68
    {
hgs
parents:
diff changeset
    69
    CTimer::ConstructL();
hgs
parents:
diff changeset
    70
    }
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
inline void CShutdown::Start()
hgs
parents:
diff changeset
    73
    {
hgs
parents:
diff changeset
    74
    After(KMyShutdownDelay);
hgs
parents:
diff changeset
    75
    }
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
void CShutdown::RunL()
hgs
parents:
diff changeset
    78
    //
hgs
parents:
diff changeset
    79
    // Initiate server exit when the timer expires
hgs
parents:
diff changeset
    80
    //
hgs
parents:
diff changeset
    81
    {
hgs
parents:
diff changeset
    82
    CActiveScheduler::Stop();
hgs
parents:
diff changeset
    83
    }
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
CMemSpyEngineServer::CMemSpyEngineServer( CMemSpyEngine& aEngine )
hgs
parents:
diff changeset
    86
:   CServer2( EPriorityNormal ), iEngine( aEngine )
hgs
parents:
diff changeset
    87
    {
hgs
parents:
diff changeset
    88
    }
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
CMemSpyEngineServer::~CMemSpyEngineServer()
hgs
parents:
diff changeset
    92
    {
62
hgs
parents: 52
diff changeset
    93
    if (iNotificationTracker) 
hgs
parents: 52
diff changeset
    94
        {
hgs
parents: 52
diff changeset
    95
        delete iNotificationTracker;
hgs
parents: 52
diff changeset
    96
        }
51
hgs
parents:
diff changeset
    97
    }
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
void CMemSpyEngineServer::ConstructL()
hgs
parents:
diff changeset
   101
    {
hgs
parents:
diff changeset
   102
    StartL( KMemSpyServerName );
62
hgs
parents: 52
diff changeset
   103
    
hgs
parents: 52
diff changeset
   104
    // create and setup notification tracker
hgs
parents: 52
diff changeset
   105
    iNotificationTracker = CMemSpyNotificationTracker::NewL();
hgs
parents: 52
diff changeset
   106
    iEngine.SetObserver( iNotificationTracker );
51
hgs
parents:
diff changeset
   107
        
hgs
parents:
diff changeset
   108
    iShutdown.ConstructL();
hgs
parents:
diff changeset
   109
    // ensure that the server still exits even if the 1st client fails to connect
hgs
parents:
diff changeset
   110
    iShutdown.Start();
hgs
parents:
diff changeset
   111
    }
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
CMemSpyEngineServer* CMemSpyEngineServer::NewL( CMemSpyEngine& aEngine )
hgs
parents:
diff changeset
   115
    {
hgs
parents:
diff changeset
   116
    CMemSpyEngineServer* self = new(ELeave) CMemSpyEngineServer( aEngine );
hgs
parents:
diff changeset
   117
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   118
    self->ConstructL();
hgs
parents:
diff changeset
   119
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
   120
    return self;
hgs
parents:
diff changeset
   121
    }
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
CSession2* CMemSpyEngineServer::NewSessionL( const TVersion& aVersion, const RMessage2& aMessage ) const
hgs
parents:
diff changeset
   125
    {
hgs
parents:
diff changeset
   126
    if  ( aVersion.iMajor != KMemSpyClientServerVersion )
hgs
parents:
diff changeset
   127
        {
hgs
parents:
diff changeset
   128
        RDebug::Printf( "[MemSpy] CMemSpyEngineSession::NewSessionL() - BAD VERSION" );
hgs
parents:
diff changeset
   129
        User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   130
        }
hgs
parents:
diff changeset
   131
    //
hgs
parents:
diff changeset
   132
    CMemSpyEngineSession* session = CMemSpyEngineSession::NewL( iEngine, aMessage );
hgs
parents:
diff changeset
   133
	return session;
hgs
parents:
diff changeset
   134
    }
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
void CMemSpyEngineServer::AddSession(TBool aCliRequest)
hgs
parents:
diff changeset
   137
    {
hgs
parents:
diff changeset
   138
    if (aCliRequest)
hgs
parents:
diff changeset
   139
        {
hgs
parents:
diff changeset
   140
        iCliConnected = ETrue;
hgs
parents:
diff changeset
   141
        }
hgs
parents:
diff changeset
   142
    else
hgs
parents:
diff changeset
   143
        {
hgs
parents:
diff changeset
   144
        ++iSessionCount;
hgs
parents:
diff changeset
   145
        }
hgs
parents:
diff changeset
   146
    iShutdown.Cancel();
hgs
parents:
diff changeset
   147
    }
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
void CMemSpyEngineServer::DropSession(TBool aCliRequest)
hgs
parents:
diff changeset
   150
    {
hgs
parents:
diff changeset
   151
    if (!aCliRequest)
hgs
parents:
diff changeset
   152
        {
hgs
parents:
diff changeset
   153
        --iSessionCount;
hgs
parents:
diff changeset
   154
        }
hgs
parents:
diff changeset
   155
    
hgs
parents:
diff changeset
   156
    if (iSessionCount == 0 && !iCliConnected)
hgs
parents:
diff changeset
   157
        {
hgs
parents:
diff changeset
   158
        iShutdown.Start();
hgs
parents:
diff changeset
   159
        }
hgs
parents:
diff changeset
   160
    }
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
CMemSpyEngineSession::CMemSpyEngineSession( CMemSpyEngine& aEngine )
hgs
parents:
diff changeset
   186
:   iEngine( aEngine )
hgs
parents:
diff changeset
   187
    {
hgs
parents:
diff changeset
   188
    }
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
CMemSpyEngineSession::~CMemSpyEngineSession()
hgs
parents:
diff changeset
   192
    {
hgs
parents:
diff changeset
   193
#ifdef _DEBUG
hgs
parents:
diff changeset
   194
    TPtrC pThreadName( KNullDesC );
hgs
parents:
diff changeset
   195
    if  ( iClientThreadName )
hgs
parents:
diff changeset
   196
        {
hgs
parents:
diff changeset
   197
        pThreadName.Set( *iClientThreadName );
hgs
parents:
diff changeset
   198
        }
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
    RDebug::Print( _L("[MemSpy] CMemSpyEngineSession::~CMemSpyEngineSession() - DEAD SESSION - this: 0x%08x, id: %4d, name: %S"), this, iClientThreadId, iClientThreadName );
hgs
parents:
diff changeset
   201
#endif
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
    delete iClientThreadName;
hgs
parents:
diff changeset
   204
        
hgs
parents:
diff changeset
   205
    Server().DropSession(iIsCliRequest);
hgs
parents:
diff changeset
   206
    }
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
void CMemSpyEngineSession::ConstructL( const RMessage2& aMessage )
hgs
parents:
diff changeset
   210
    {
hgs
parents:
diff changeset
   211
	RThread thread;
hgs
parents:
diff changeset
   212
    const TInt error = aMessage.Client( thread );
hgs
parents:
diff changeset
   213
    CleanupClosePushL( thread );
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
    TRACE( RDebug::Printf( "[MemSpy] CMemSpyEngineSession::ConstructL() - this: 0x%08x - opening client thread - err: %d", this, error ) );
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
    User::LeaveIfError( error );
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
    const TFullName threadName( thread.FullName() );
hgs
parents:
diff changeset
   220
    iClientThreadName = threadName.AllocL();
hgs
parents:
diff changeset
   221
    iClientThreadId = thread.Id();
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
    CleanupStack::PopAndDestroy( &thread );
hgs
parents:
diff changeset
   224
    
hgs
parents:
diff changeset
   225
    const TUid KCliUid3 = { 0x2002129D };
hgs
parents:
diff changeset
   226
    iIsCliRequest = aMessage.SecureId() == TSecureId(KCliUid3);
hgs
parents:
diff changeset
   227
    
hgs
parents:
diff changeset
   228
    TRACE( RDebug::Print( _L("[MemSpy] CMemSpyEngineSession::ConstructL() - NEW SESSION - this: 0x%08x, id: %4d, client: %S"), this, iClientThreadId, iClientThreadName ) );
hgs
parents:
diff changeset
   229
    }
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
void CMemSpyEngineSession::CreateL()
hgs
parents:
diff changeset
   232
    {   
hgs
parents:
diff changeset
   233
    Server().AddSession(iIsCliRequest);
hgs
parents:
diff changeset
   234
    }
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
CMemSpyEngineSession* CMemSpyEngineSession::NewL( CMemSpyEngine& aEngine, const RMessage2& aMessage )
hgs
parents:
diff changeset
   237
    {
hgs
parents:
diff changeset
   238
    CMemSpyEngineSession* self = new(ELeave) CMemSpyEngineSession( aEngine );
hgs
parents:
diff changeset
   239
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   240
    self->ConstructL( aMessage );
hgs
parents:
diff changeset
   241
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
   242
    return self;
hgs
parents:
diff changeset
   243
    }
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
hgs
parents:
diff changeset
   246
void CMemSpyEngineSession::ServiceL( const RMessage2& aMessage )
hgs
parents:
diff changeset
   247
    {
hgs
parents:
diff changeset
   248
    TRACE( RDebug::Print( _L("[MemSpy] CMemSpyEngineSession::ServiceL() - START - this: 0x%08x, fn: 0x%08x, id: %4d, client: %S"), this, aMessage.Function(), iClientThreadId, iClientThreadName ) );
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
    TRAPD( error, DoServiceL( aMessage ) );
hgs
parents:
diff changeset
   251
    if  ( error != KErrNone )
hgs
parents:
diff changeset
   252
        {
hgs
parents:
diff changeset
   253
        RDebug::Print( _L("[MemSpy] CMemSpyEngineSession::ServiceL() - SERVICE ERROR - this: 0x%08x, fn: %d, err: %d, client: %S"), this, aMessage.Function(), error, iClientThreadName );
hgs
parents:
diff changeset
   254
        }
hgs
parents:
diff changeset
   255
    
hgs
parents:
diff changeset
   256
    if ((aMessage.Function() & KMemSpyOpFlagsAsyncOperation) == 0 || error != KErrNone)
hgs
parents:
diff changeset
   257
    	{
hgs
parents:
diff changeset
   258
		aMessage.Complete( error );
hgs
parents:
diff changeset
   259
    	}
hgs
parents:
diff changeset
   260
hgs
parents:
diff changeset
   261
    TRACE( RDebug::Print( _L("[MemSpy] CMemSpyEngineSession::ServiceL() - END - this: 0x%08x, fn: 0x%08x, id: %4d, client: %S"), this, aMessage.Function(), iClientThreadId, iClientThreadName ) );
hgs
parents:
diff changeset
   262
	}
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
// ---------------------------------------------------------
hgs
parents:
diff changeset
   265
// DoServiceL( const RMessage2& aMessage )
hgs
parents:
diff changeset
   266
// ---------------------------------------------------------
hgs
parents:
diff changeset
   267
//
hgs
parents:
diff changeset
   268
void CMemSpyEngineSession::DoServiceL( const RMessage2& aMessage )
hgs
parents:
diff changeset
   269
	{
hgs
parents:
diff changeset
   270
	TInt function = aMessage.Function() & KMemSpyOpFlagsTypeMask;
hgs
parents:
diff changeset
   271
	if (function >= EMemSpyClientServerOpMarkerUiFirst && 
hgs
parents:
diff changeset
   272
		function < EMemSpyClientServerOpMarkerUiLast)
hgs
parents:
diff changeset
   273
		
hgs
parents:
diff changeset
   274
		DoUiServiceL(aMessage);
hgs
parents:
diff changeset
   275
	else
hgs
parents:
diff changeset
   276
		DoCmdServiceL(aMessage);
hgs
parents:
diff changeset
   277
	}
hgs
parents:
diff changeset
   278
// ---------------------------------------------------------
hgs
parents:
diff changeset
   279
// DoUiServiceL( const RMessage2& aMessage )
hgs
parents:
diff changeset
   280
// ---------------------------------------------------------
hgs
parents:
diff changeset
   281
//
hgs
parents:
diff changeset
   282
void CMemSpyEngineSession::DoUiServiceL( const RMessage2& aMessage )
hgs
parents:
diff changeset
   283
    {
hgs
parents:
diff changeset
   284
	switch (aMessage.Function() & KMemSpyOpFlagsTypeMask)
hgs
parents:
diff changeset
   285
		{
hgs
parents:
diff changeset
   286
	    case EMemSpyClientServerOpGetOutputSink:
hgs
parents:
diff changeset
   287
	        {
hgs
parents:
diff changeset
   288
	        TMemSpySinkType sink = iEngine.SinkType();
hgs
parents:
diff changeset
   289
	        TPckgBuf<TMemSpySinkType> type( sink );
hgs
parents:
diff changeset
   290
	        
hgs
parents:
diff changeset
   291
	        aMessage.WriteL( 0, type );
hgs
parents:
diff changeset
   292
	        break;
hgs
parents:
diff changeset
   293
	        }
hgs
parents:
diff changeset
   294
		case EMemSpyClientServerOpGetProcessCount:
hgs
parents:
diff changeset
   295
			{
hgs
parents:
diff changeset
   296
			aMessage.WriteL(0, TPckgBuf<TInt>(iEngine.Container().Count()));
hgs
parents:
diff changeset
   297
			break;
hgs
parents:
diff changeset
   298
			}
hgs
parents:
diff changeset
   299
		case EMemSpyClientServerOpGetProcesses:
hgs
parents:
diff changeset
   300
			{
hgs
parents:
diff changeset
   301
			CMemSpyEngineObjectContainer& list = iEngine.Container();
hgs
parents:
diff changeset
   302
			
hgs
parents:
diff changeset
   303
			TPckgBuf<TInt> a0;
hgs
parents:
diff changeset
   304
			aMessage.ReadL(0, a0);
hgs
parents:
diff changeset
   305
			TInt realCount = Min(a0(), list.Count());
hgs
parents:
diff changeset
   306
			
hgs
parents:
diff changeset
   307
			for(TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyProcessData))
hgs
parents:
diff changeset
   308
				{
hgs
parents:
diff changeset
   309
				CMemSpyProcess& process = iEngine.Container().At(i);
hgs
parents:
diff changeset
   310
				TMemSpyProcessData data;
hgs
parents:
diff changeset
   311
				data.iIsDead = process.IsDead();
hgs
parents:
diff changeset
   312
				data.iId = process.Id();
hgs
parents:
diff changeset
   313
				data.iName.Copy(process.Name().Left(KMaxFullName));
hgs
parents:
diff changeset
   314
				data.iThreadCount = process.Count();
hgs
parents:
diff changeset
   315
				data.iPriority = process.Priority();
hgs
parents:
diff changeset
   316
				data.iExitType = process.ExitType();
hgs
parents:
diff changeset
   317
				data.iExitReason = process.ExitReason();
hgs
parents:
diff changeset
   318
				data.iExitCategory = process.ExitCategory();
hgs
parents:
diff changeset
   319
				data.iSID = process.SID();
hgs
parents:
diff changeset
   320
				
hgs
parents:
diff changeset
   321
				TPckgBuf<TMemSpyProcessData> buffer(data);
hgs
parents:
diff changeset
   322
				aMessage.WriteL(1, buffer, offset);
hgs
parents:
diff changeset
   323
				}
hgs
parents:
diff changeset
   324
			
hgs
parents:
diff changeset
   325
			a0 = list.Count();
hgs
parents:
diff changeset
   326
			aMessage.WriteL(0, a0);
hgs
parents:
diff changeset
   327
hgs
parents:
diff changeset
   328
			break;
hgs
parents:
diff changeset
   329
			}
hgs
parents:
diff changeset
   330
		case EMemSpyClienServerOpGetProcessIdByName:
hgs
parents:
diff changeset
   331
			{
hgs
parents:
diff changeset
   332
			TFullName processName;
hgs
parents:
diff changeset
   333
			aMessage.ReadL(0, processName);
hgs
parents:
diff changeset
   334
			
hgs
parents:
diff changeset
   335
			TBool found(EFalse);
hgs
parents:
diff changeset
   336
			
hgs
parents:
diff changeset
   337
			for (TInt i=0; i<iEngine.Container().Count(); i++)
hgs
parents:
diff changeset
   338
				{
hgs
parents:
diff changeset
   339
				CMemSpyProcess& process = iEngine.Container().At(i);
hgs
parents:
diff changeset
   340
				if (process.Name().FindF(processName) >= 0)
hgs
parents:
diff changeset
   341
					{
hgs
parents:
diff changeset
   342
					found = ETrue;
hgs
parents:
diff changeset
   343
					TPckgBuf<TProcessId> procId(process.Id());
hgs
parents:
diff changeset
   344
					aMessage.WriteL(1, procId);
hgs
parents:
diff changeset
   345
					}
hgs
parents:
diff changeset
   346
				}
hgs
parents:
diff changeset
   347
			
hgs
parents:
diff changeset
   348
			if (!found)
hgs
parents:
diff changeset
   349
				{
hgs
parents:
diff changeset
   350
				User::Leave(KErrNotFound);
hgs
parents:
diff changeset
   351
				}
hgs
parents:
diff changeset
   352
			
hgs
parents:
diff changeset
   353
			break;
hgs
parents:
diff changeset
   354
			}
hgs
parents:
diff changeset
   355
		case EMemSpyClientServerOpProcessSystemPermanentOrCritical:
hgs
parents:
diff changeset
   356
			{
hgs
parents:
diff changeset
   357
			TBool ret = EFalse;
hgs
parents:
diff changeset
   358
			TPckgBuf<TProcessId> id;
hgs
parents:
diff changeset
   359
			aMessage.ReadL( 0, id );
hgs
parents:
diff changeset
   360
			
hgs
parents:
diff changeset
   361
			CMemSpyEngineObjectContainer& container = iEngine.Container();
hgs
parents:
diff changeset
   362
			CMemSpyProcess& process = container.ProcessByIdL( id() );
hgs
parents:
diff changeset
   363
			
hgs
parents:
diff changeset
   364
			if  ( process.IsSystemPermanent() || process.IsSystemCritical() )
hgs
parents:
diff changeset
   365
				{
hgs
parents:
diff changeset
   366
				ret = ETrue;
hgs
parents:
diff changeset
   367
				}
hgs
parents:
diff changeset
   368
			TPckgBuf<TBool> retBuf( ret );
hgs
parents:
diff changeset
   369
			aMessage.WriteL( 1, retBuf );
hgs
parents:
diff changeset
   370
			
hgs
parents:
diff changeset
   371
			break;
hgs
parents:
diff changeset
   372
			}
hgs
parents:
diff changeset
   373
		case EMemSpyClientServerOpEndProcess:
hgs
parents:
diff changeset
   374
			{
hgs
parents:
diff changeset
   375
			TPckgBuf<TProcessId> id;
hgs
parents:
diff changeset
   376
			aMessage.ReadL( 0, id );
hgs
parents:
diff changeset
   377
			TPckgBuf<TMemSpyEndType> type;
hgs
parents:
diff changeset
   378
			aMessage.ReadL( 1, type );
hgs
parents:
diff changeset
   379
					
hgs
parents:
diff changeset
   380
			CMemSpyEngineObjectContainer& container = iEngine.Container();			
hgs
parents:
diff changeset
   381
			CMemSpyProcess& process = container.ProcessByIdL( id() );
hgs
parents:
diff changeset
   382
									
hgs
parents:
diff changeset
   383
			switch ( type() )
hgs
parents:
diff changeset
   384
				{
hgs
parents:
diff changeset
   385
				case ETerminate:
hgs
parents:
diff changeset
   386
					{
hgs
parents:
diff changeset
   387
					process.TerminateL();
hgs
parents:
diff changeset
   388
					break;
hgs
parents:
diff changeset
   389
					}
hgs
parents:
diff changeset
   390
				case EPanic:
hgs
parents:
diff changeset
   391
					{
hgs
parents:
diff changeset
   392
					process.PanicL();
hgs
parents:
diff changeset
   393
					break;
hgs
parents:
diff changeset
   394
					}
hgs
parents:
diff changeset
   395
				case EKill:
hgs
parents:
diff changeset
   396
					{
hgs
parents:
diff changeset
   397
					process.KillL();
hgs
parents:
diff changeset
   398
					break;
hgs
parents:
diff changeset
   399
					}
62
hgs
parents: 52
diff changeset
   400
				case EExit:
hgs
parents: 52
diff changeset
   401
				    {
hgs
parents: 52
diff changeset
   402
				    if (!iEngine.IsHelperWindowServerSupported())
hgs
parents: 52
diff changeset
   403
				    	{
hgs
parents: 52
diff changeset
   404
						User::Leave(KErrNotSupported);
hgs
parents: 52
diff changeset
   405
				    	}
hgs
parents: 52
diff changeset
   406
				    
hgs
parents: 52
diff changeset
   407
				    MMemSpyEngineHelperWindowServer& windowServerManager = iEngine.HelperWindowServer();
hgs
parents: 52
diff changeset
   408
				    windowServerManager.EndTaskL( process.Name() );
hgs
parents: 52
diff changeset
   409
				            
hgs
parents: 52
diff changeset
   410
				    break;
hgs
parents: 52
diff changeset
   411
				    }
51
hgs
parents:
diff changeset
   412
				}																
hgs
parents:
diff changeset
   413
			break;
hgs
parents:
diff changeset
   414
			}
hgs
parents:
diff changeset
   415
		case EMemSpyClientServerOpSwitchToProcess:
hgs
parents:
diff changeset
   416
			{/*
hgs
parents:
diff changeset
   417
			TInt wgCount;
hgs
parents:
diff changeset
   418
			RWsSession wsSession;
hgs
parents:
diff changeset
   419
			User::LeaveIfError( wsSession.Connect() );
hgs
parents:
diff changeset
   420
			CleanupClosePushL( wsSession );
hgs
parents:
diff changeset
   421
			User::LeaveIfError( wgCount = wsSession.NumWindowGroups() );
hgs
parents:
diff changeset
   422
			RArray<RWsSession::TWindowGroupChainInfo> wgArray;
hgs
parents:
diff changeset
   423
			CleanupClosePushL( wgArray );
hgs
parents:
diff changeset
   424
			User::LeaveIfError( wsSession.WindowGroupList( &wgArray ) );
hgs
parents:
diff changeset
   425
			TApaTask task( wsSession );
hgs
parents:
diff changeset
   426
			TBool brought( EFalse );
hgs
parents:
diff changeset
   427
			TInt wgId( KErrNotFound );
hgs
parents:
diff changeset
   428
			TThreadId threadId;
hgs
parents:
diff changeset
   429
			
hgs
parents:
diff changeset
   430
			TPckgBuf<TProcessId> id;
hgs
parents:
diff changeset
   431
			aMessage.ReadL( 0, id );
hgs
parents:
diff changeset
   432
			CMemSpyEngineObjectContainer& container = iEngine.Container();
hgs
parents:
diff changeset
   433
			CMemSpyProcess& process = container.ProcessByIdL( id() );
hgs
parents:
diff changeset
   434
			
hgs
parents:
diff changeset
   435
			// loop trough threads in a process
hgs
parents:
diff changeset
   436
			for ( TInt i = 0; i < process.MdcaCount(); i++ )
hgs
parents:
diff changeset
   437
				{
hgs
parents:
diff changeset
   438
				TInt wgCountLocal = wgCount;
hgs
parents:
diff changeset
   439
							
hgs
parents:
diff changeset
   440
				// loop trough all window groups and see if a thread id matches
hgs
parents:
diff changeset
   441
				while( !brought && wgCountLocal-- )
hgs
parents:
diff changeset
   442
					{
hgs
parents:
diff changeset
   443
					wgId = wgArray[wgCountLocal].iId;
hgs
parents:
diff changeset
   444
					User::LeaveIfError( wsSession.GetWindowGroupClientThreadId( wgId, threadId ) );
hgs
parents:
diff changeset
   445
					if ( threadId == process.At( i ).Id() )
hgs
parents:
diff changeset
   446
						{
hgs
parents:
diff changeset
   447
						CApaWindowGroupName* wgName = CApaWindowGroupName::NewLC( wsSession, wgId );
hgs
parents:
diff changeset
   448
						task.SetWgId( wgId );
hgs
parents:
diff changeset
   449
						if ( !wgName->Hidden() && task.Exists() )
hgs
parents:
diff changeset
   450
							{
hgs
parents:
diff changeset
   451
							task.BringToForeground();
hgs
parents:
diff changeset
   452
							brought = ETrue;                        
hgs
parents:
diff changeset
   453
							}
hgs
parents:
diff changeset
   454
						CleanupStack::PopAndDestroy( wgName );
hgs
parents:
diff changeset
   455
						}
hgs
parents:
diff changeset
   456
					}
hgs
parents:
diff changeset
   457
				}
hgs
parents:
diff changeset
   458
			
hgs
parents:
diff changeset
   459
			TPckgBuf<TBool> ret( brought );
hgs
parents:
diff changeset
   460
			aMessage.WriteL( 1, ret );
hgs
parents:
diff changeset
   461
			
hgs
parents:
diff changeset
   462
			break;*/
hgs
parents:
diff changeset
   463
			}
hgs
parents:
diff changeset
   464
		case EMemSpyClientServerOpGetThreadCount:
hgs
parents:
diff changeset
   465
			{
hgs
parents:
diff changeset
   466
			TPckgBuf<TProcessId> pid;
hgs
parents:
diff changeset
   467
			aMessage.ReadL(1, pid);
hgs
parents:
diff changeset
   468
			CMemSpyProcess& process = iEngine.Container().ProcessByIdL(pid());
hgs
parents:
diff changeset
   469
			aMessage.WriteL(0, TPckgBuf<TInt>(process.Count()));
hgs
parents:
diff changeset
   470
			break;
hgs
parents:
diff changeset
   471
			}
hgs
parents:
diff changeset
   472
		case EMemSpyClientServerOpGetThreads:
hgs
parents:
diff changeset
   473
			{
hgs
parents:
diff changeset
   474
			TPckgBuf<TProcessId> pid;
hgs
parents:
diff changeset
   475
			aMessage.ReadL(2, pid);
hgs
parents:
diff changeset
   476
			
hgs
parents:
diff changeset
   477
			CMemSpyProcess& list = iEngine.Container().ProcessByIdL(pid());
hgs
parents:
diff changeset
   478
			
hgs
parents:
diff changeset
   479
			TPckgBuf<TInt> a0;
hgs
parents:
diff changeset
   480
			aMessage.ReadL(0, a0);
hgs
parents:
diff changeset
   481
			TInt realCount = Min(a0(), list.Count());
hgs
parents:
diff changeset
   482
						
hgs
parents:
diff changeset
   483
			for(TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyThreadData))
hgs
parents:
diff changeset
   484
				{
hgs
parents:
diff changeset
   485
				CMemSpyThread& thread = list.At(i);
hgs
parents:
diff changeset
   486
				
hgs
parents:
diff changeset
   487
				TMemSpyThreadData data;
hgs
parents:
diff changeset
   488
				data.iId = thread.Id();
hgs
parents:
diff changeset
   489
				data.iName.Copy(thread.Name().Left(KMaxFullName));
hgs
parents:
diff changeset
   490
				data.iThreadPriority = thread.Priority();
hgs
parents:
diff changeset
   491
				
hgs
parents:
diff changeset
   492
				TPckgBuf<TMemSpyThreadData> buffer(data);
hgs
parents:
diff changeset
   493
				aMessage.WriteL(1, buffer, offset);
hgs
parents:
diff changeset
   494
				}
hgs
parents:
diff changeset
   495
			
hgs
parents:
diff changeset
   496
			a0 = list.Count();
hgs
parents:
diff changeset
   497
			aMessage.WriteL(0, a0);
hgs
parents:
diff changeset
   498
hgs
parents:
diff changeset
   499
			break;
hgs
parents:
diff changeset
   500
			}
hgs
parents:
diff changeset
   501
		case EMemSpyClientServerOpSetThreadPriority:
hgs
parents:
diff changeset
   502
			{
hgs
parents:
diff changeset
   503
			TPckgBuf<TThreadId> tid;
hgs
parents:
diff changeset
   504
			TPckgBuf<TInt> priority;
hgs
parents:
diff changeset
   505
			aMessage.ReadL(0, tid);
hgs
parents:
diff changeset
   506
			aMessage.ReadL(1, priority);
hgs
parents:
diff changeset
   507
			
hgs
parents:
diff changeset
   508
			CMemSpyProcess* process = NULL;
hgs
parents:
diff changeset
   509
			CMemSpyThread* thread = NULL; 
hgs
parents:
diff changeset
   510
			User::LeaveIfError(iEngine.Container().ProcessAndThreadByThreadId(tid(), process, thread));
hgs
parents:
diff changeset
   511
			
hgs
parents:
diff changeset
   512
			if (thread)
hgs
parents:
diff changeset
   513
				{				
hgs
parents:
diff changeset
   514
				thread->SetPriorityL(static_cast<TThreadPriority>(priority()));
hgs
parents:
diff changeset
   515
				}					
hgs
parents:
diff changeset
   516
			break;
hgs
parents:
diff changeset
   517
			}
hgs
parents:
diff changeset
   518
		case EMemSpyClientServerOpThreadSystemPermanentOrCritical:
hgs
parents:
diff changeset
   519
			{
hgs
parents:
diff changeset
   520
			TPckgBuf<TThreadId> id;
hgs
parents:
diff changeset
   521
			aMessage.ReadL( 0, id );
hgs
parents:
diff changeset
   522
			
hgs
parents:
diff changeset
   523
			CMemSpyEngineObjectContainer& container = iEngine.Container();            
hgs
parents:
diff changeset
   524
			CMemSpyProcess* process = NULL;
hgs
parents:
diff changeset
   525
			CMemSpyThread* thread = NULL; 
hgs
parents:
diff changeset
   526
			User::LeaveIfError( container.ProcessAndThreadByThreadId( id(), process, thread ) );
hgs
parents:
diff changeset
   527
			
hgs
parents:
diff changeset
   528
			TBool ret = thread && ( thread->IsSystemPermanent() || thread->IsSystemCritical() );
hgs
parents:
diff changeset
   529
			
hgs
parents:
diff changeset
   530
			TPckgBuf<TBool> retBuf( ret );
hgs
parents:
diff changeset
   531
			aMessage.WriteL( 1, retBuf );
hgs
parents:
diff changeset
   532
							
hgs
parents:
diff changeset
   533
			break;
hgs
parents:
diff changeset
   534
			}
hgs
parents:
diff changeset
   535
		case EMemSpyClientServerOpEndThread:
hgs
parents:
diff changeset
   536
			{
hgs
parents:
diff changeset
   537
			TPckgBuf<TThreadId> id;
hgs
parents:
diff changeset
   538
			aMessage.ReadL( 0, id );
hgs
parents:
diff changeset
   539
			TPckgBuf<TMemSpyEndType> type;
hgs
parents:
diff changeset
   540
			aMessage.ReadL( 1, type );
hgs
parents:
diff changeset
   541
			
hgs
parents:
diff changeset
   542
			CMemSpyEngineObjectContainer& container = iEngine.Container();
hgs
parents:
diff changeset
   543
			CMemSpyProcess* process = NULL;
hgs
parents:
diff changeset
   544
			CMemSpyThread* thread = NULL; 
hgs
parents:
diff changeset
   545
			User::LeaveIfError( container.ProcessAndThreadByThreadId( id(), process, thread ) );
hgs
parents:
diff changeset
   546
			
hgs
parents:
diff changeset
   547
			if( thread )
hgs
parents:
diff changeset
   548
				{
hgs
parents:
diff changeset
   549
				switch ( type() )
hgs
parents:
diff changeset
   550
					{
hgs
parents:
diff changeset
   551
					case ETerminate:
hgs
parents:
diff changeset
   552
						{
hgs
parents:
diff changeset
   553
						thread->TerminateL();
hgs
parents:
diff changeset
   554
						break;
hgs
parents:
diff changeset
   555
						}
hgs
parents:
diff changeset
   556
					case EPanic:
hgs
parents:
diff changeset
   557
						{
hgs
parents:
diff changeset
   558
						thread->PanicL();
hgs
parents:
diff changeset
   559
						break;
hgs
parents:
diff changeset
   560
						}
hgs
parents:
diff changeset
   561
					case EKill:
hgs
parents:
diff changeset
   562
						{
hgs
parents:
diff changeset
   563
						thread->KillL();
hgs
parents:
diff changeset
   564
						break;
hgs
parents:
diff changeset
   565
						}
hgs
parents:
diff changeset
   566
					}				
hgs
parents:
diff changeset
   567
				}			
hgs
parents:
diff changeset
   568
			break;
hgs
parents:
diff changeset
   569
			}
hgs
parents:
diff changeset
   570
		case EMemSpyClientServerOpSwitchToThread:
hgs
parents:
diff changeset
   571
			{
hgs
parents:
diff changeset
   572
			TInt wgCount;
hgs
parents:
diff changeset
   573
			RWsSession wsSession;
hgs
parents:
diff changeset
   574
			User::LeaveIfError( wsSession.Connect() );
hgs
parents:
diff changeset
   575
			CleanupClosePushL( wsSession );
hgs
parents:
diff changeset
   576
			User::LeaveIfError( wgCount = wsSession.NumWindowGroups() );
hgs
parents:
diff changeset
   577
			RArray<RWsSession::TWindowGroupChainInfo> wgArray;
hgs
parents:
diff changeset
   578
			CleanupClosePushL( wgArray );
hgs
parents:
diff changeset
   579
			User::LeaveIfError( wsSession.WindowGroupList( &wgArray ) );
52
hgs
parents: 51
diff changeset
   580
						
hgs
parents: 51
diff changeset
   581
			//TApaTask task( wsSession );
hgs
parents: 51
diff changeset
   582
			TBool brought = EFalse;
51
hgs
parents:
diff changeset
   583
			TInt wgId( KErrNotFound );
hgs
parents:
diff changeset
   584
			TThreadId threadId;
hgs
parents:
diff changeset
   585
					
hgs
parents:
diff changeset
   586
			TPckgBuf<TThreadId> id;
hgs
parents:
diff changeset
   587
			aMessage.ReadL( 0, id );
hgs
parents:
diff changeset
   588
					
hgs
parents:
diff changeset
   589
			// loop trough all window groups and see if a thread id matches
hgs
parents:
diff changeset
   590
			while( !brought && wgCount-- )
hgs
parents:
diff changeset
   591
				{
hgs
parents:
diff changeset
   592
				wgId = wgArray[wgCount].iId;
hgs
parents:
diff changeset
   593
				User::LeaveIfError( wsSession.GetWindowGroupClientThreadId( wgId, threadId ) );
hgs
parents:
diff changeset
   594
				if ( threadId == id() )
hgs
parents:
diff changeset
   595
					{
52
hgs
parents: 51
diff changeset
   596
					TInt handle = wsSession.GetWindowGroupHandle( wgId );
hgs
parents: 51
diff changeset
   597
					if( handle == KErrNone )
51
hgs
parents:
diff changeset
   598
						{
52
hgs
parents: 51
diff changeset
   599
						RWindowGroup* group = new (ELeave) RWindowGroup();
hgs
parents: 51
diff changeset
   600
						group->Construct( handle );        
hgs
parents: 51
diff changeset
   601
						group->SetOrdinalPosition( 0 ); //foreground
hgs
parents: 51
diff changeset
   602
						
hgs
parents: 51
diff changeset
   603
						brought = ETrue;
hgs
parents: 51
diff changeset
   604
						
hgs
parents: 51
diff changeset
   605
						group->Close();
hgs
parents: 51
diff changeset
   606
						delete group;												
51
hgs
parents:
diff changeset
   607
						}
52
hgs
parents: 51
diff changeset
   608
					}					    					    					    										    										
hgs
parents: 51
diff changeset
   609
					//task.SetWgId( wgId );
hgs
parents: 51
diff changeset
   610
					//if ( !wgName->Hidden() && task.Exists() )
hgs
parents: 51
diff changeset
   611
					//	{
hgs
parents: 51
diff changeset
   612
					//	task.BringToForeground();
hgs
parents: 51
diff changeset
   613
					//	brought = ETrue;                        
hgs
parents: 51
diff changeset
   614
					//	}					
51
hgs
parents:
diff changeset
   615
					}
52
hgs
parents: 51
diff changeset
   616
													
51
hgs
parents:
diff changeset
   617
			TPckgBuf<TBool> ret( brought );
hgs
parents:
diff changeset
   618
			aMessage.WriteL( 1, ret );															
hgs
parents:
diff changeset
   619
					
hgs
parents:
diff changeset
   620
			break;
hgs
parents:
diff changeset
   621
			}		
hgs
parents:
diff changeset
   622
		case EMemSpyClientServerOpGetInfoItemType:
hgs
parents:
diff changeset
   623
			{
hgs
parents:
diff changeset
   624
			
hgs
parents:
diff changeset
   625
			TPckgBuf<TInt> index;
hgs
parents:
diff changeset
   626
			aMessage.ReadL( 0, index );			
hgs
parents:
diff changeset
   627
			TPckgBuf<TThreadId> id;
hgs
parents:
diff changeset
   628
			aMessage.ReadL( 1, id);
hgs
parents:
diff changeset
   629
								
hgs
parents:
diff changeset
   630
			CMemSpyEngineObjectContainer& container = iEngine.Container();            
hgs
parents:
diff changeset
   631
			CMemSpyProcess* process = NULL; //not needed
hgs
parents:
diff changeset
   632
			CMemSpyThread* thread = NULL; 
hgs
parents:
diff changeset
   633
			User::LeaveIfError( container.ProcessAndThreadByThreadId( id(), process, thread ) );
hgs
parents:
diff changeset
   634
		            
hgs
parents:
diff changeset
   635
			CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL();                        
hgs
parents:
diff changeset
   636
			TMemSpyThreadInfoItemType retType = threadInfoContainer.Item( index() ).Type();
hgs
parents:
diff changeset
   637
			
hgs
parents:
diff changeset
   638
			TPckgBuf<TMemSpyThreadInfoItemType> ret( retType );
hgs
parents:
diff changeset
   639
			aMessage.WriteL( 2, ret );			
hgs
parents:
diff changeset
   640
			
hgs
parents:
diff changeset
   641
			break;
hgs
parents:
diff changeset
   642
			}
hgs
parents:
diff changeset
   643
		case EMemSpyClientServerOpGetThreadInfoItemsCount:
hgs
parents:
diff changeset
   644
			{
hgs
parents:
diff changeset
   645
			TPckgBuf<TThreadId> id;
hgs
parents:
diff changeset
   646
			aMessage.ReadL( 0, id );
hgs
parents:
diff changeset
   647
			TPckgBuf<TMemSpyThreadInfoItemType> type;
hgs
parents:
diff changeset
   648
			aMessage.ReadL( 1, type );					 
hgs
parents:
diff changeset
   649
			
hgs
parents:
diff changeset
   650
			CMemSpyEngineObjectContainer& container = iEngine.Container();            
hgs
parents:
diff changeset
   651
			CMemSpyProcess* process = NULL;
hgs
parents:
diff changeset
   652
			CMemSpyThread* thread = NULL; 
hgs
parents:
diff changeset
   653
			
hgs
parents:
diff changeset
   654
			container.ProcessAndThreadByThreadId( id(), process, thread );
hgs
parents:
diff changeset
   655
			
hgs
parents:
diff changeset
   656
			CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL();                 
hgs
parents:
diff changeset
   657
								
hgs
parents:
diff changeset
   658
			CMemSpyThreadInfoItemBase& threadInfoItemBase = threadInfoContainer.Item( type() );
hgs
parents:
diff changeset
   659
				    
hgs
parents:
diff changeset
   660
			TInt count = threadInfoItemBase.MdcaCount();		    
hgs
parents:
diff changeset
   661
			TPckgBuf<TInt> tempret( count );
hgs
parents:
diff changeset
   662
			aMessage.WriteL( 2, tempret );
hgs
parents:
diff changeset
   663
		
hgs
parents:
diff changeset
   664
			break;
hgs
parents:
diff changeset
   665
			}		
hgs
parents:
diff changeset
   666
		case EMemSpyClientServerOpGetThreadInfoItems:
hgs
parents:
diff changeset
   667
			{
hgs
parents:
diff changeset
   668
			TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   669
			aMessage.ReadL( 0, count );						
hgs
parents:
diff changeset
   670
			TPckgBuf<TThreadId> id;
hgs
parents:
diff changeset
   671
			aMessage.ReadL( 1, id );
hgs
parents:
diff changeset
   672
			TPckgBuf<TMemSpyThreadInfoItemType> type;
hgs
parents:
diff changeset
   673
			aMessage.ReadL( 2, type );			
hgs
parents:
diff changeset
   674
			
hgs
parents:
diff changeset
   675
			CMemSpyEngineObjectContainer& container = iEngine.Container();            
hgs
parents:
diff changeset
   676
			CMemSpyProcess* process = NULL;
hgs
parents:
diff changeset
   677
			CMemSpyThread* thread = NULL; 
hgs
parents:
diff changeset
   678
			User::LeaveIfError( container.ProcessAndThreadByThreadId( id() , process, thread ) );
hgs
parents:
diff changeset
   679
							  
hgs
parents:
diff changeset
   680
			CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL();      
hgs
parents:
diff changeset
   681
hgs
parents:
diff changeset
   682
			CMemSpyThreadInfoItemBase& threadInfoItemBase = threadInfoContainer.Item( type() ); //get ThreadInfoItemBaseByType
hgs
parents:
diff changeset
   683
			
hgs
parents:
diff changeset
   684
			TInt itemCount = Min(count(), threadInfoItemBase.MdcaCount());
hgs
parents:
diff changeset
   685
								
hgs
parents:
diff changeset
   686
			for( TInt i=0, offset = 0; i<itemCount; i++, offset += sizeof( TMemSpyThreadInfoItemData ) )
hgs
parents:
diff changeset
   687
				{
hgs
parents:
diff changeset
   688
				TMemSpyThreadInfoItemData data;
hgs
parents:
diff changeset
   689
				
hgs
parents:
diff changeset
   690
				TPtrC caption(threadInfoItemBase.MdcaPoint(i).Mid(1));
hgs
parents:
diff changeset
   691
				TInt tabPos = caption.Locate('\t');
hgs
parents:
diff changeset
   692
				if (tabPos != KErrNotFound)
hgs
parents:
diff changeset
   693
					caption.Set(caption.Left(tabPos));
hgs
parents:
diff changeset
   694
				
hgs
parents:
diff changeset
   695
				TPtrC value(threadInfoItemBase.MdcaPoint(i));
hgs
parents:
diff changeset
   696
				tabPos = value.LocateReverse('\t');
hgs
parents:
diff changeset
   697
				if (tabPos != KErrNotFound)
hgs
parents:
diff changeset
   698
					value.Set(value.Mid(tabPos + 1));
hgs
parents:
diff changeset
   699
												
hgs
parents:
diff changeset
   700
				data.iCaption.Copy( caption.Left(64) );
hgs
parents:
diff changeset
   701
				data.iValue.Copy( value.Left(32) );
hgs
parents:
diff changeset
   702
							
hgs
parents:
diff changeset
   703
				TPckgBuf<TMemSpyThreadInfoItemData> buffer(data);
hgs
parents:
diff changeset
   704
				aMessage.WriteL(3, buffer, offset);				
hgs
parents:
diff changeset
   705
				}			
hgs
parents:
diff changeset
   706
			aMessage.WriteL(0, count);
hgs
parents:
diff changeset
   707
					
hgs
parents:
diff changeset
   708
			break;
hgs
parents:
diff changeset
   709
			}
hgs
parents:
diff changeset
   710
			
hgs
parents:
diff changeset
   711
		case EMemSpyClientServerOpGetProcessIdByThreadId:
hgs
parents:
diff changeset
   712
			{
hgs
parents:
diff changeset
   713
			TPckgBuf<TThreadId> tid;
hgs
parents:
diff changeset
   714
			aMessage.ReadL( 1, tid );					
hgs
parents:
diff changeset
   715
			
hgs
parents:
diff changeset
   716
			CMemSpyProcess* process = NULL;
hgs
parents:
diff changeset
   717
			CMemSpyThread* thread = NULL;
hgs
parents:
diff changeset
   718
			//
hgs
parents:
diff changeset
   719
			const TInt error = iEngine.Container().ProcessAndThreadByThreadId( tid(), process, thread );
hgs
parents:
diff changeset
   720
			
hgs
parents:
diff changeset
   721
			TProcessId pid = process->Id();
hgs
parents:
diff changeset
   722
			
hgs
parents:
diff changeset
   723
			TPckgBuf<TProcessId> ret(pid);
hgs
parents:
diff changeset
   724
			aMessage.WriteL( 0, ret );
hgs
parents:
diff changeset
   725
									
hgs
parents:
diff changeset
   726
			break;
hgs
parents:
diff changeset
   727
			}
hgs
parents:
diff changeset
   728
			
hgs
parents:
diff changeset
   729
		// --- KernelObjects related functions ---
hgs
parents:
diff changeset
   730
		case EMemSpyClientServerOpGetKernelObjectCount:
hgs
parents:
diff changeset
   731
			{
hgs
parents:
diff changeset
   732
			TInt iCount = EMemSpyDriverContainerTypeLast - EMemSpyDriverContainerTypeFirst + 1;
hgs
parents:
diff changeset
   733
			TPckgBuf<TInt> ret( iCount );
hgs
parents:
diff changeset
   734
			aMessage.WriteL(0, ret);			
hgs
parents:
diff changeset
   735
			break;
hgs
parents:
diff changeset
   736
			}
hgs
parents:
diff changeset
   737
		case EMemSpyClientServerOpGetKernelObjects:
hgs
parents:
diff changeset
   738
			{
hgs
parents:
diff changeset
   739
			TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   740
			aMessage.ReadL(0, count);
hgs
parents:
diff changeset
   741
			
hgs
parents:
diff changeset
   742
			CMemSpyEngineGenericKernelObjectContainer* model = iEngine.HelperKernelContainers().ObjectsAllL(); //contains all the objects
hgs
parents:
diff changeset
   743
			CleanupStack::PushL( model );
hgs
parents:
diff changeset
   744
			
hgs
parents:
diff changeset
   745
			for( TInt i=0, offset = 0; i<count(); i++, offset += sizeof( TMemSpyKernelObjectData ) )
hgs
parents:
diff changeset
   746
				{
hgs
parents:
diff changeset
   747
				TMemSpyKernelObjectData data;
hgs
parents:
diff changeset
   748
				
hgs
parents:
diff changeset
   749
				TPtrC name(model->At(i).Name().Mid(1));
hgs
parents:
diff changeset
   750
				TInt tabPos = name.Locate('\t');
hgs
parents:
diff changeset
   751
				if (tabPos != KErrNotFound)
hgs
parents:
diff changeset
   752
					name.Set(name.Left(tabPos));
hgs
parents:
diff changeset
   753
												
hgs
parents:
diff changeset
   754
				data.iName.Copy(name);
hgs
parents:
diff changeset
   755
				data.iType = model->At(i).Type();
hgs
parents:
diff changeset
   756
				data.iCount = model->At(i).Count();											
hgs
parents:
diff changeset
   757
				data.iSize = model->At(i).Count() * model->At(i).Count();
hgs
parents:
diff changeset
   758
hgs
parents:
diff changeset
   759
				TPckgBuf<TMemSpyKernelObjectData> buffer(data);
hgs
parents:
diff changeset
   760
				aMessage.WriteL(1, buffer, offset);
hgs
parents:
diff changeset
   761
				}			
hgs
parents:
diff changeset
   762
			aMessage.WriteL(0, count);
hgs
parents:
diff changeset
   763
			CleanupStack::PopAndDestroy( model );
hgs
parents:
diff changeset
   764
			break;
hgs
parents:
diff changeset
   765
			}
hgs
parents:
diff changeset
   766
		case EMemSpyClientServerOpGetKernelObjectItemCount:
hgs
parents:
diff changeset
   767
			{
hgs
parents:
diff changeset
   768
			TPckgBuf<TMemSpyDriverContainerType> tempType;
hgs
parents:
diff changeset
   769
			aMessage.ReadL(1, tempType); //get type of kernel object
hgs
parents:
diff changeset
   770
			TMemSpyDriverContainerType type = tempType();
hgs
parents:
diff changeset
   771
			
hgs
parents:
diff changeset
   772
			CMemSpyEngineHelperKernelContainers& kernelContainerManager = iEngine.HelperKernelContainers();
hgs
parents:
diff changeset
   773
			CMemSpyEngineGenericKernelObjectList* iObjectList = kernelContainerManager.ObjectsForSpecificContainerL( type );			
hgs
parents:
diff changeset
   774
			
hgs
parents:
diff changeset
   775
			TInt count = iObjectList->Count();
hgs
parents:
diff changeset
   776
			TPckgBuf<TInt> ret( count );
hgs
parents:
diff changeset
   777
			aMessage.WriteL( 0, ret );
hgs
parents:
diff changeset
   778
						
hgs
parents:
diff changeset
   779
			break;
hgs
parents:
diff changeset
   780
			}
hgs
parents:
diff changeset
   781
		case EMemSpyClientServerOpGetKernelObjectItems:
hgs
parents:
diff changeset
   782
			{
hgs
parents:
diff changeset
   783
			TPckgBuf<TInt> count;
hgs
parents:
diff changeset
   784
			TPckgBuf<TMemSpyDriverContainerType> tempType;
hgs
parents:
diff changeset
   785
			aMessage.ReadL( 0, count ); //get count of items
hgs
parents:
diff changeset
   786
			aMessage.ReadL(1, tempType); //get type of kernel object
hgs
parents:
diff changeset
   787
			TInt c = count();
hgs
parents:
diff changeset
   788
						
hgs
parents:
diff changeset
   789
			CMemSpyEngineHelperKernelContainers& kernelContainerManager = iEngine.HelperKernelContainers();
hgs
parents:
diff changeset
   790
			CMemSpyEngineGenericKernelObjectList* iObjectList = kernelContainerManager.ObjectsForSpecificContainerL( tempType() );			
hgs
parents:
diff changeset
   791
			
hgs
parents:
diff changeset
   792
			for( TInt i=0, offset = 0; i<c; i++, offset += sizeof( TMemSpyDriverHandleInfoGeneric ) )
hgs
parents:
diff changeset
   793
				{
hgs
parents:
diff changeset
   794
				TMemSpyDriverHandleInfoGeneric data;								
hgs
parents:
diff changeset
   795
															
hgs
parents:
diff changeset
   796
				data = iObjectList->At( i );
hgs
parents:
diff changeset
   797
				
hgs
parents:
diff changeset
   798
				TPckgBuf<TMemSpyDriverHandleInfoGeneric> buffer(data);
hgs
parents:
diff changeset
   799
				aMessage.WriteL(2, buffer, offset);
hgs
parents:
diff changeset
   800
				}			
hgs
parents:
diff changeset
   801
					
hgs
parents:
diff changeset
   802
			break;
hgs
parents:
diff changeset
   803
			}
hgs
parents:
diff changeset
   804
			
hgs
parents:
diff changeset
   805
		case EMemSpyClientServerOpOutputAllContainerContents:
hgs
parents:
diff changeset
   806
			{
hgs
parents:
diff changeset
   807
			CMemSpyEngineHelperKernelContainers& kernelContainerManager = iEngine.HelperKernelContainers();
hgs
parents:
diff changeset
   808
			CMemSpyEngineGenericKernelObjectContainer* model = kernelContainerManager.ObjectsAllL();
hgs
parents:
diff changeset
   809
			
hgs
parents:
diff changeset
   810
			model->OutputL( iEngine.Sink() );
hgs
parents:
diff changeset
   811
hgs
parents:
diff changeset
   812
			break;
hgs
parents:
diff changeset
   813
			}
hgs
parents:
diff changeset
   814
			
hgs
parents:
diff changeset
   815
		case EMemSpyClientServerOpDumpKernelHeap:
hgs
parents:
diff changeset
   816
			{
hgs
parents:
diff changeset
   817
		    iEngine.HelperHeap().OutputHeapDataKernelL();
hgs
parents:
diff changeset
   818
			
hgs
parents:
diff changeset
   819
			break;
hgs
parents:
diff changeset
   820
			}
hgs
parents:
diff changeset
   821
			
hgs
parents:
diff changeset
   822
		case EMemSpyClientServerOpOutputInfoHandles:
hgs
parents:
diff changeset
   823
			{
hgs
parents:
diff changeset
   824
			TPckgBuf<TThreadId> id;
hgs
parents:
diff changeset
   825
			aMessage.ReadL(0, id);
hgs
parents:
diff changeset
   826
			CMemSpyEngineObjectContainer& container = iEngine.Container();            
hgs
parents:
diff changeset
   827
			CMemSpyProcess* process = NULL;
hgs
parents:
diff changeset
   828
			CMemSpyThread* thread = NULL; 
hgs
parents:
diff changeset
   829
			User::LeaveIfError( container.ProcessAndThreadByThreadId( id() , process, thread ) );
hgs
parents:
diff changeset
   830
										  
hgs
parents:
diff changeset
   831
			CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL();
hgs
parents:
diff changeset
   832
			
hgs
parents:
diff changeset
   833
			threadInfoContainer.PrintL();
hgs
parents:
diff changeset
   834
			
hgs
parents:
diff changeset
   835
			break;
hgs
parents:
diff changeset
   836
			}
hgs
parents:
diff changeset
   837
			
hgs
parents:
diff changeset
   838
		case EMemSpyClientServerOpOutputAOList:
hgs
parents:
diff changeset
   839
			{
hgs
parents:
diff changeset
   840
			TPckgBuf<TThreadId> id;
hgs
parents:
diff changeset
   841
			TPckgBuf<TMemSpyThreadInfoItemType> type;
hgs
parents:
diff changeset
   842
			aMessage.ReadL(0, id);
hgs
parents:
diff changeset
   843
			aMessage.ReadL(1, type);
hgs
parents:
diff changeset
   844
			
hgs
parents:
diff changeset
   845
			CMemSpyEngineObjectContainer& container = iEngine.Container();            
hgs
parents:
diff changeset
   846
			CMemSpyProcess* process = NULL;
hgs
parents:
diff changeset
   847
			CMemSpyThread* thread = NULL; 
hgs
parents:
diff changeset
   848
			User::LeaveIfError( container.ProcessAndThreadByThreadId( id() , process, thread ) );
hgs
parents:
diff changeset
   849
										  
hgs
parents:
diff changeset
   850
			CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL();      
hgs
parents:
diff changeset
   851
hgs
parents:
diff changeset
   852
			CMemSpyThreadInfoItemBase* threadInfoItem = &threadInfoContainer.Item( type() );
hgs
parents:
diff changeset
   853
						
hgs
parents:
diff changeset
   854
			CMemSpyThreadInfoActiveObjects* activeObjectArray = static_cast< CMemSpyThreadInfoActiveObjects* >( threadInfoItem );			
hgs
parents:
diff changeset
   855
						
hgs
parents:
diff changeset
   856
		    // Begin a new data stream
hgs
parents:
diff changeset
   857
		    _LIT( KMemSpyContext, "Active Object List - " );
hgs
parents:
diff changeset
   858
		    _LIT( KMemSpyFolder, "Active Objects" );
hgs
parents:
diff changeset
   859
		    iEngine.Sink().DataStreamBeginL( KMemSpyContext, KMemSpyFolder );
hgs
parents:
diff changeset
   860
		    		    
hgs
parents:
diff changeset
   861
		    // Set prefix for overall listing
hgs
parents:
diff changeset
   862
		    iEngine.Sink().OutputPrefixSetLC( KMemSpyContext );
hgs
parents:
diff changeset
   863
hgs
parents:
diff changeset
   864
		    // Create header
hgs
parents:
diff changeset
   865
		    CMemSpyEngineActiveObjectArray::OutputDataColumnsL( iEngine );
hgs
parents:
diff changeset
   866
		    
hgs
parents:
diff changeset
   867
		    // List items
hgs
parents:
diff changeset
   868
		    const TInt count = activeObjectArray->Array().Count();
hgs
parents:
diff changeset
   869
		    for(TInt i=0; i<count; i++)
hgs
parents:
diff changeset
   870
		        {
hgs
parents:
diff changeset
   871
		        const CMemSpyEngineActiveObject& object = activeObjectArray->Array().At( i );
hgs
parents:
diff changeset
   872
		        //
hgs
parents:
diff changeset
   873
		        object.OutputDataL( iEngine );
hgs
parents:
diff changeset
   874
		        }
hgs
parents:
diff changeset
   875
hgs
parents:
diff changeset
   876
		    // Tidy up
hgs
parents:
diff changeset
   877
		    CleanupStack::PopAndDestroy(); // prefix
hgs
parents:
diff changeset
   878
hgs
parents:
diff changeset
   879
		    // End data stream		    		    
hgs
parents:
diff changeset
   880
		    iEngine.Sink().DataStreamEndL();		    
hgs
parents:
diff changeset
   881
			
hgs
parents:
diff changeset
   882
			break;
hgs
parents:
diff changeset
   883
			}
hgs
parents:
diff changeset
   884
			
hgs
parents:
diff changeset
   885
		// --- Kernel Heap related functions ---
hgs
parents:
diff changeset
   886
		case EMemSpyClientServerOpGetHeap:
hgs
parents:
diff changeset
   887
			{
hgs
parents:
diff changeset
   888
			TMemSpyHeapInfo heapInfo;			
hgs
parents:
diff changeset
   889
			iEngine.HelperHeap().GetHeapInfoKernelL( heapInfo );
hgs
parents:
diff changeset
   890
			TMemSpyHeapData data = iEngine.HelperHeap().NewHeapRawInfo( heapInfo );
hgs
parents:
diff changeset
   891
			
hgs
parents:
diff changeset
   892
			TPckgBuf<TMemSpyHeapData> buffer(data);
hgs
parents:
diff changeset
   893
			aMessage.WriteL(0, buffer);
hgs
parents:
diff changeset
   894
			
hgs
parents:
diff changeset
   895
			break;
hgs
parents:
diff changeset
   896
			}
hgs
parents:
diff changeset
   897
			
hgs
parents:
diff changeset
   898
		case EMemSpyClientServerOpGetServerCount:
hgs
parents:
diff changeset
   899
            {
hgs
parents:
diff changeset
   900
            CMemSpyEngineServerList* list = iEngine.HelperServer().ServerListL();
hgs
parents:
diff changeset
   901
            CleanupStack::PushL(list);
hgs
parents:
diff changeset
   902
            // TODO: cache it between calls
hgs
parents:
diff changeset
   903
            aMessage.WriteL(0, TPckgBuf<TInt>(list->MdcaCount()));
hgs
parents:
diff changeset
   904
            
hgs
parents:
diff changeset
   905
            CleanupStack::PopAndDestroy(list);
hgs
parents:
diff changeset
   906
            break;
hgs
parents:
diff changeset
   907
            }
hgs
parents:
diff changeset
   908
        // --- Servers related functions
hgs
parents:
diff changeset
   909
        case EMemSpyClientServerOpGetServers:
hgs
parents:
diff changeset
   910
            {
hgs
parents:
diff changeset
   911
            CMemSpyEngineServerList* list = iEngine.HelperServer().ServerListL();
hgs
parents:
diff changeset
   912
            CleanupStack::PushL(list);
hgs
parents:
diff changeset
   913
            
hgs
parents:
diff changeset
   914
            TPckgBuf<TInt> a0;
hgs
parents:
diff changeset
   915
            aMessage.ReadL(0, a0);
hgs
parents:
diff changeset
   916
            TInt realCount = Min(a0(), list->MdcaCount());
hgs
parents:
diff changeset
   917
            
hgs
parents:
diff changeset
   918
            for(TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyServerData))
hgs
parents:
diff changeset
   919
                {
hgs
parents:
diff changeset
   920
                const CMemSpyEngineServerEntry& server = list->At(i);
hgs
parents:
diff changeset
   921
                TMemSpyServerData data;
hgs
parents:
diff changeset
   922
                
hgs
parents:
diff changeset
   923
                CMemSpyProcess* process = NULL;
hgs
parents:
diff changeset
   924
                CMemSpyThread* thread = NULL;
hgs
parents:
diff changeset
   925
                TInt error = iEngine.Container().ProcessAndThreadByThreadId( server.Id(), process, thread );
hgs
parents:
diff changeset
   926
                if (error == KErrNone && thread)
hgs
parents:
diff changeset
   927
                    {
52
hgs
parents: 51
diff changeset
   928
                    data.iProcessId = thread->Process().Id();
hgs
parents: 51
diff changeset
   929
                    data.iThreadId = thread->Id();
51
hgs
parents:
diff changeset
   930
                    }
hgs
parents:
diff changeset
   931
                data.iName.Copy(server.Name().Left(KMaxFullName));
hgs
parents:
diff changeset
   932
                data.iSessionCount = server.SessionCount();
hgs
parents:
diff changeset
   933
                
hgs
parents:
diff changeset
   934
                TPckgBuf<TMemSpyServerData> buffer(data);
hgs
parents:
diff changeset
   935
                aMessage.WriteL(1, buffer, offset);
hgs
parents:
diff changeset
   936
                }
hgs
parents:
diff changeset
   937
            
hgs
parents:
diff changeset
   938
            a0 = list->Count();
hgs
parents:
diff changeset
   939
            aMessage.WriteL(0, a0);
hgs
parents:
diff changeset
   940
            
hgs
parents:
diff changeset
   941
            CleanupStack::PopAndDestroy(list);
hgs
parents:
diff changeset
   942
hgs
parents:
diff changeset
   943
            break;
hgs
parents:
diff changeset
   944
            }
hgs
parents:
diff changeset
   945
            
hgs
parents:
diff changeset
   946
        case EMemSpyClientServerOpGetSortedServers:
hgs
parents:
diff changeset
   947
        	{
hgs
parents:
diff changeset
   948
        	CMemSpyEngineServerList* list = iEngine.HelperServer().ServerListL();
hgs
parents:
diff changeset
   949
        	CleanupStack::PushL(list);
hgs
parents:
diff changeset
   950
        	
hgs
parents:
diff changeset
   951
        	TPckgBuf<TSortType> a2;
hgs
parents:
diff changeset
   952
        	aMessage.ReadL( 2, a2 );
hgs
parents:
diff changeset
   953
        	
hgs
parents:
diff changeset
   954
        	//sort the list of the servers
hgs
parents:
diff changeset
   955
        	if( a2() == ESortServByName )
hgs
parents:
diff changeset
   956
        		list->SortByNameL();
hgs
parents:
diff changeset
   957
        	else
hgs
parents:
diff changeset
   958
        		list->SortBySessionCountL();
hgs
parents:
diff changeset
   959
        	
hgs
parents:
diff changeset
   960
        	TPckgBuf<TInt> a0;        	
hgs
parents:
diff changeset
   961
        	aMessage.ReadL(0, a0);        	        	        
hgs
parents:
diff changeset
   962
        	
hgs
parents:
diff changeset
   963
        	TInt realCount = Min(a0(), list->MdcaCount());
hgs
parents:
diff changeset
   964
        	            
hgs
parents:
diff changeset
   965
        	for(TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyServerData))
hgs
parents:
diff changeset
   966
        		{
hgs
parents:
diff changeset
   967
				const CMemSpyEngineServerEntry& server = list->At(i);
hgs
parents:
diff changeset
   968
				TMemSpyServerData data;
hgs
parents:
diff changeset
   969
        	                
52
hgs
parents: 51
diff changeset
   970
				CMemSpyProcess* process = NULL;
hgs
parents: 51
diff changeset
   971
                CMemSpyThread* thread = NULL;
hgs
parents: 51
diff changeset
   972
                TInt error = iEngine.Container().ProcessAndThreadByThreadId( server.Id(), process, thread );
hgs
parents: 51
diff changeset
   973
                if (error == KErrNone && thread)
hgs
parents: 51
diff changeset
   974
                    {
hgs
parents: 51
diff changeset
   975
                    data.iProcessId = thread->Process().Id();
hgs
parents: 51
diff changeset
   976
                    data.iThreadId = thread->Id();
hgs
parents: 51
diff changeset
   977
                    }
51
hgs
parents:
diff changeset
   978
				data.iName.Copy(server.Name().Left(KMaxFullName));
hgs
parents:
diff changeset
   979
				data.iSessionCount = server.SessionCount();
hgs
parents:
diff changeset
   980
        	                
hgs
parents:
diff changeset
   981
				TPckgBuf<TMemSpyServerData> buffer(data);
hgs
parents:
diff changeset
   982
				aMessage.WriteL(1, buffer, offset);
hgs
parents:
diff changeset
   983
        		}        	           
hgs
parents:
diff changeset
   984
			a0 = list->Count();
hgs
parents:
diff changeset
   985
			aMessage.WriteL(0, a0);
hgs
parents:
diff changeset
   986
        	            
hgs
parents:
diff changeset
   987
			CleanupStack::PopAndDestroy(list);
hgs
parents:
diff changeset
   988
			break;
hgs
parents:
diff changeset
   989
        	}
hgs
parents:
diff changeset
   990
        case EMemSpyClientServerOpServerListOutputGeneric:
hgs
parents:
diff changeset
   991
        	{
hgs
parents:
diff changeset
   992
            TPckgBuf<TBool> a0;
hgs
parents:
diff changeset
   993
            aMessage.ReadL(0, a0);
hgs
parents:
diff changeset
   994
        	
hgs
parents:
diff changeset
   995
            CMemSpyEngineServerList* list;            
hgs
parents:
diff changeset
   996
            list = iEngine.HelperServer().ServerListL();
hgs
parents:
diff changeset
   997
            CleanupStack::PushL(list);
hgs
parents:
diff changeset
   998
            
hgs
parents:
diff changeset
   999
            _LIT( KMemSpyContext, "Server List - " );
hgs
parents:
diff changeset
  1000
            _LIT( KMemSpyFolder, "Servers" );
hgs
parents:
diff changeset
  1001
            iEngine.Sink().DataStreamBeginL( KMemSpyContext, KMemSpyFolder );
hgs
parents:
diff changeset
  1002
hgs
parents:
diff changeset
  1003
            // Set prefix for overall listing
hgs
parents:
diff changeset
  1004
            iEngine.Sink().OutputPrefixSetLC( KMemSpyContext );
hgs
parents:
diff changeset
  1005
hgs
parents:
diff changeset
  1006
            // Create header
hgs
parents:
diff changeset
  1007
            CMemSpyEngineServerList::OutputDataColumnsL( iEngine, a0() );
hgs
parents:
diff changeset
  1008
               
hgs
parents:
diff changeset
  1009
            // List items
hgs
parents:
diff changeset
  1010
            const TInt count = list->Count();
hgs
parents:
diff changeset
  1011
            for(TInt i=0; i<count; i++)
hgs
parents:
diff changeset
  1012
            	{
hgs
parents:
diff changeset
  1013
				const CMemSpyEngineServerEntry& server = list->At( i );
hgs
parents:
diff changeset
  1014
				//
hgs
parents:
diff changeset
  1015
				server.OutputDataL( iEngine.HelperServer(), a0() );
hgs
parents:
diff changeset
  1016
            	}
hgs
parents:
diff changeset
  1017
hgs
parents:
diff changeset
  1018
            // Tidy up
hgs
parents:
diff changeset
  1019
            CleanupStack::PopAndDestroy(); // prefix
hgs
parents:
diff changeset
  1020
            
hgs
parents:
diff changeset
  1021
            // End data stream
hgs
parents:
diff changeset
  1022
            iEngine.Sink().DataStreamEndL();
hgs
parents:
diff changeset
  1023
            
hgs
parents:
diff changeset
  1024
            CleanupStack::PopAndDestroy(list);        	
hgs
parents:
diff changeset
  1025
        	break;
hgs
parents:
diff changeset
  1026
        	}        	
62
hgs
parents: 52
diff changeset
  1027
        case EMemSpyClientServerOpGetChunksCount:
hgs
parents: 52
diff changeset
  1028
            {
hgs
parents: 52
diff changeset
  1029
            CMemSpyEngineChunkList* list = iEngine.HelperChunk().ListL();
hgs
parents: 52
diff changeset
  1030
            CleanupStack::PushL( list );
hgs
parents: 52
diff changeset
  1031
            aMessage.WriteL(0, TPckgBuf<TInt>(list->MdcaCount()));            
hgs
parents: 52
diff changeset
  1032
            CleanupStack::PopAndDestroy( list );
hgs
parents: 52
diff changeset
  1033
            
hgs
parents: 52
diff changeset
  1034
            break;
hgs
parents: 52
diff changeset
  1035
            }
hgs
parents: 52
diff changeset
  1036
        case EMemSpyClientServerOpGetSortedChunks:
hgs
parents: 52
diff changeset
  1037
            {
hgs
parents: 52
diff changeset
  1038
            CMemSpyEngineChunkList* list = iEngine.HelperChunk().ListL();
hgs
parents: 52
diff changeset
  1039
            CleanupStack::PushL( list );
hgs
parents: 52
diff changeset
  1040
                
hgs
parents: 52
diff changeset
  1041
            TPckgBuf<TSortType> a2;
hgs
parents: 52
diff changeset
  1042
            aMessage.ReadL( 2, a2 );
hgs
parents: 52
diff changeset
  1043
                
hgs
parents: 52
diff changeset
  1044
            //sort the list of chunks
hgs
parents: 52
diff changeset
  1045
            if( a2() == ESortChunkByName )
hgs
parents: 52
diff changeset
  1046
                list->SortByNameL();
hgs
parents: 52
diff changeset
  1047
            else
hgs
parents: 52
diff changeset
  1048
                list->SortBySizeL();
hgs
parents: 52
diff changeset
  1049
                
hgs
parents: 52
diff changeset
  1050
            TPckgBuf<TInt> a0;          
hgs
parents: 52
diff changeset
  1051
            aMessage.ReadL(0, a0);                              
hgs
parents: 52
diff changeset
  1052
                
hgs
parents: 52
diff changeset
  1053
            TInt realCount = Min(a0(), list->MdcaCount());
hgs
parents: 52
diff changeset
  1054
            
hgs
parents: 52
diff changeset
  1055
            for(TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyChunkData))
hgs
parents: 52
diff changeset
  1056
                {
hgs
parents: 52
diff changeset
  1057
                const CMemSpyEngineChunkEntry& chunk = list->At(i);
hgs
parents: 52
diff changeset
  1058
                TMemSpyChunkData data;
hgs
parents: 52
diff changeset
  1059
                            
hgs
parents: 52
diff changeset
  1060
                data.iName.Copy( chunk.Name() );
hgs
parents: 52
diff changeset
  1061
                data.iHandle = (TUint8*)chunk.Handle();
hgs
parents: 52
diff changeset
  1062
                data.iSize = chunk.Size();
hgs
parents: 52
diff changeset
  1063
                data.iMaxSize = chunk.MaxSize();
hgs
parents: 52
diff changeset
  1064
                data.iBaseAddress = (TUint8*)chunk.BaseAddress();
hgs
parents: 52
diff changeset
  1065
                data.iOwnerId = chunk.OwnerId();
hgs
parents: 52
diff changeset
  1066
                TFullName ownerName;
hgs
parents: 52
diff changeset
  1067
                chunk.OwnerName( ownerName );
hgs
parents: 52
diff changeset
  1068
                data.iOwnerName = ownerName;
hgs
parents: 52
diff changeset
  1069
                data.iType = chunk.Type();
hgs
parents: 52
diff changeset
  1070
                data.iAttributes = chunk.Attributes();
hgs
parents: 52
diff changeset
  1071
                            
hgs
parents: 52
diff changeset
  1072
                TPckgBuf<TMemSpyChunkData> buffer(data);
hgs
parents: 52
diff changeset
  1073
                aMessage.WriteL(1, buffer, offset);
hgs
parents: 52
diff changeset
  1074
                }                      
hgs
parents: 52
diff changeset
  1075
                                                            
hgs
parents: 52
diff changeset
  1076
            CleanupStack::PopAndDestroy( list );
hgs
parents: 52
diff changeset
  1077
            
hgs
parents: 52
diff changeset
  1078
            break;
hgs
parents: 52
diff changeset
  1079
            }
hgs
parents: 52
diff changeset
  1080
        case EMemSpyClientServerOpChunkListOutput:
hgs
parents: 52
diff changeset
  1081
        	{
hgs
parents: 52
diff changeset
  1082
        	//Get Chunk list
hgs
parents: 52
diff changeset
  1083
        	CMemSpyEngineChunkList* list = iEngine.HelperChunk().ListL();
hgs
parents: 52
diff changeset
  1084
        	CleanupStack::PushL( list );        	            
51
hgs
parents:
diff changeset
  1085
        	
62
hgs
parents: 52
diff changeset
  1086
            // Begin a new data stream
hgs
parents: 52
diff changeset
  1087
            _LIT( KMemSpyContext, "Chunk List" );
hgs
parents: 52
diff changeset
  1088
            _LIT( KMemSpyFolder, "Chunks" );
hgs
parents: 52
diff changeset
  1089
            iEngine.Sink().DataStreamBeginL( KMemSpyContext, KMemSpyFolder );
hgs
parents: 52
diff changeset
  1090
hgs
parents: 52
diff changeset
  1091
            // Set prefix for overall listing
hgs
parents: 52
diff changeset
  1092
            _LIT( KOverallPrefix, "Chunk List - " );
hgs
parents: 52
diff changeset
  1093
            iEngine.Sink().OutputPrefixSetLC( KOverallPrefix );
hgs
parents: 52
diff changeset
  1094
hgs
parents: 52
diff changeset
  1095
            // Create header
hgs
parents: 52
diff changeset
  1096
            CMemSpyEngineChunkList::OutputDataColumnsL( iEngine );
hgs
parents: 52
diff changeset
  1097
            
hgs
parents: 52
diff changeset
  1098
            // List items
hgs
parents: 52
diff changeset
  1099
            const TInt count = list->Count();
hgs
parents: 52
diff changeset
  1100
            for(TInt i=0; i<count; i++)
hgs
parents: 52
diff changeset
  1101
                {
hgs
parents: 52
diff changeset
  1102
                const CMemSpyEngineChunkEntry& entry = list->At( i );
hgs
parents: 52
diff changeset
  1103
                //
hgs
parents: 52
diff changeset
  1104
                entry.OutputDataL( iEngine.HelperChunk() );
hgs
parents: 52
diff changeset
  1105
                }
hgs
parents: 52
diff changeset
  1106
hgs
parents: 52
diff changeset
  1107
            // Tidy up
hgs
parents: 52
diff changeset
  1108
            CleanupStack::PopAndDestroy(); // prefix
hgs
parents: 52
diff changeset
  1109
hgs
parents: 52
diff changeset
  1110
            // End data stream
hgs
parents: 52
diff changeset
  1111
            iEngine.Sink().DataStreamEndL();
hgs
parents: 52
diff changeset
  1112
            CleanupStack::PopAndDestroy( list );
hgs
parents: 52
diff changeset
  1113
            
hgs
parents: 52
diff changeset
  1114
        	break;
hgs
parents: 52
diff changeset
  1115
        	}        	
51
hgs
parents:
diff changeset
  1116
		case EMemSpyClientServerOpGetMemoryTrackingCycleCount:
hgs
parents:
diff changeset
  1117
			{
hgs
parents:
diff changeset
  1118
			TInt count = iEngine.HelperSysMemTracker().CompletedCycles().Count();
hgs
parents:
diff changeset
  1119
			TPckgBuf<TInt> ret( count );
hgs
parents:
diff changeset
  1120
			aMessage.WriteL( 0, ret );			
hgs
parents:
diff changeset
  1121
			break;
hgs
parents:
diff changeset
  1122
			}		
hgs
parents:
diff changeset
  1123
			
hgs
parents:
diff changeset
  1124
		case EMemSpyClientServerOpGetMemoryTrackingCycles:
hgs
parents:
diff changeset
  1125
			{
hgs
parents:
diff changeset
  1126
			const RPointerArray<CMemSpyEngineHelperSysMemTrackerCycle>& list = iEngine.HelperSysMemTracker().CompletedCycles();
hgs
parents:
diff changeset
  1127
hgs
parents:
diff changeset
  1128
			TPckgBuf<TInt> a0;
hgs
parents:
diff changeset
  1129
			aMessage.ReadL(0, a0);
hgs
parents:
diff changeset
  1130
			TInt realCount = Min(a0(), list.Count());
hgs
parents:
diff changeset
  1131
			
hgs
parents:
diff changeset
  1132
			for (TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyMemoryTrackingCycleData))
hgs
parents:
diff changeset
  1133
				{
hgs
parents:
diff changeset
  1134
				CMemSpyProcess& process = iEngine.Container().At(i);
hgs
parents:
diff changeset
  1135
				TMemSpyMemoryTrackingCycleData data;
hgs
parents:
diff changeset
  1136
				data.iCycleNumber = list[i]->CycleNumber();
hgs
parents:
diff changeset
  1137
				data.iCaption.Copy(list[i]->Caption().Left(KMaxFullName));
hgs
parents:
diff changeset
  1138
				data.iTime = list[i]->Time();
hgs
parents:
diff changeset
  1139
				data.iFreeMemory = list[i]->MemoryFree();
hgs
parents:
diff changeset
  1140
				data.iMemoryDelta = list[i]->MemoryDelta();
hgs
parents:
diff changeset
  1141
				data.iPreviousCycleDiff = list[i]->MemoryFreePreviousCycle();
hgs
parents:
diff changeset
  1142
				data.iChangeCount = list[i]->ChangeCount();
hgs
parents:
diff changeset
  1143
				
hgs
parents:
diff changeset
  1144
				TPckgBuf<TMemSpyMemoryTrackingCycleData> buffer(data);
hgs
parents:
diff changeset
  1145
				aMessage.WriteL(1, buffer, offset);
hgs
parents:
diff changeset
  1146
				}
hgs
parents:
diff changeset
  1147
			
hgs
parents:
diff changeset
  1148
			a0 = list.Count();
hgs
parents:
diff changeset
  1149
			aMessage.WriteL(0, a0);
hgs
parents:
diff changeset
  1150
hgs
parents:
diff changeset
  1151
		break;
hgs
parents:
diff changeset
  1152
		}
hgs
parents:
diff changeset
  1153
hgs
parents:
diff changeset
  1154
	case EMemSpyClientServerOpIsSwmtRunning:
hgs
parents:
diff changeset
  1155
		{
hgs
parents:
diff changeset
  1156
		TPckgBuf<TBool> running(iEngine.HelperSysMemTracker().IsActive());
hgs
parents:
diff changeset
  1157
		aMessage.WriteL(0, running);
hgs
parents:
diff changeset
  1158
		break;
hgs
parents:
diff changeset
  1159
		}
hgs
parents:
diff changeset
  1160
		
hgs
parents:
diff changeset
  1161
	case EMemSpyClientServerOpSystemWideMemoryTrackingTimerPeriodGet:
hgs
parents:
diff changeset
  1162
	    {	    			   
hgs
parents:
diff changeset
  1163
	    // Get current config
hgs
parents:
diff changeset
  1164
	    TMemSpyEngineHelperSysMemTrackerConfig config;
hgs
parents:
diff changeset
  1165
	    iEngine.HelperSysMemTracker().GetConfig( config );
hgs
parents:
diff changeset
  1166
	    TInt time = config.iTimerPeriod.Int();
hgs
parents:
diff changeset
  1167
	    TPckgBuf<TInt> tim(time);			            
hgs
parents:
diff changeset
  1168
	    aMessage.WriteL( 0, tim );
hgs
parents:
diff changeset
  1169
	    break;
hgs
parents:
diff changeset
  1170
	    }
hgs
parents:
diff changeset
  1171
	    
hgs
parents:
diff changeset
  1172
	case EMemSpyClientServerOpSystemWideMemoryTrackingCategoriesGet:
hgs
parents:
diff changeset
  1173
		{
hgs
parents:
diff changeset
  1174
		// Get current config
hgs
parents:
diff changeset
  1175
		TMemSpyEngineHelperSysMemTrackerConfig config;
hgs
parents:
diff changeset
  1176
		iEngine.HelperSysMemTracker().GetConfig( config );		
hgs
parents:
diff changeset
  1177
		TInt categories = config.iEnabledCategories;		
hgs
parents:
diff changeset
  1178
		TPckgBuf<TInt> ret( categories );
hgs
parents:
diff changeset
  1179
		aMessage.WriteL( 0, ret );						
hgs
parents:
diff changeset
  1180
		break;
hgs
parents:
diff changeset
  1181
		}
hgs
parents:
diff changeset
  1182
		
hgs
parents:
diff changeset
  1183
	case EMemSpyClientServerOpSystemWideMemoryTrackingThreadNameFilterGet:
hgs
parents:
diff changeset
  1184
		{
hgs
parents:
diff changeset
  1185
		TMemSpyEngineHelperSysMemTrackerConfig config;
hgs
parents:
diff changeset
  1186
		iEngine.HelperSysMemTracker().GetConfig( config );                 
hgs
parents:
diff changeset
  1187
		TName threadNameFilter = config.iThreadNameFilter;
hgs
parents:
diff changeset
  1188
		TPckgBuf<TName> name(threadNameFilter);
hgs
parents:
diff changeset
  1189
		aMessage.WriteL( 0, name );
hgs
parents:
diff changeset
  1190
		
hgs
parents:
diff changeset
  1191
		break;
hgs
parents:
diff changeset
  1192
		}
hgs
parents:
diff changeset
  1193
		
hgs
parents:
diff changeset
  1194
	case EMemSpyClientServerOpSystemWideMemoryTrackingHeapDumpGet:
hgs
parents:
diff changeset
  1195
		{
hgs
parents:
diff changeset
  1196
		TMemSpyEngineHelperSysMemTrackerConfig config;
hgs
parents:
diff changeset
  1197
		iEngine.HelperSysMemTracker().GetConfig( config );		           
hgs
parents:
diff changeset
  1198
		TBool heapDump = config.iDumpData;
hgs
parents:
diff changeset
  1199
		TPckgBuf<TBool> heap(heapDump);			            
hgs
parents:
diff changeset
  1200
		aMessage.WriteL( 0, heap );
hgs
parents:
diff changeset
  1201
		break;
hgs
parents:
diff changeset
  1202
		}
hgs
parents:
diff changeset
  1203
						
hgs
parents:
diff changeset
  1204
	case EMemSpyClientServerOpSystemWideMemoryTrackingModeGet:
hgs
parents:
diff changeset
  1205
		{
hgs
parents:
diff changeset
  1206
		TMemSpyEngineHelperSysMemTrackerConfig config;
hgs
parents:
diff changeset
  1207
		iEngine.HelperSysMemTracker().GetConfig( config );	 		 
hgs
parents:
diff changeset
  1208
		TPckgBuf<TMemSpyEngineHelperSysMemTrackerConfig::TMemSpyEngineSysMemTrackerMode> mod(config.iMode);			             		            
hgs
parents:
diff changeset
  1209
		aMessage.WriteL(0, mod);	 			 		    
hgs
parents:
diff changeset
  1210
		break;
hgs
parents:
diff changeset
  1211
		}			
hgs
parents:
diff changeset
  1212
		
hgs
parents:
diff changeset
  1213
	case EMemSpyClientServerOpNotifyDeviceWideOperationProgress:
hgs
parents:
diff changeset
  1214
		{
hgs
parents:
diff changeset
  1215
		if (!Server().CurrentOperationTracker())
hgs
parents:
diff changeset
  1216
			{
hgs
parents:
diff changeset
  1217
			User::Leave(KErrNotReady);
hgs
parents:
diff changeset
  1218
			}
hgs
parents:
diff changeset
  1219
		
hgs
parents:
diff changeset
  1220
		Server().CurrentOperationTracker()->AddNotificationL(aMessage);
hgs
parents:
diff changeset
  1221
		break;
hgs
parents:
diff changeset
  1222
		}
hgs
parents:
diff changeset
  1223
		
hgs
parents:
diff changeset
  1224
	case EMemSpyClientServerOpCancelDeviceWideOperation:
hgs
parents:
diff changeset
  1225
		if (!Server().CurrentOperationTracker())
hgs
parents:
diff changeset
  1226
			{
hgs
parents:
diff changeset
  1227
			User::Leave(KErrNotReady);
hgs
parents:
diff changeset
  1228
			}
hgs
parents:
diff changeset
  1229
		
hgs
parents:
diff changeset
  1230
		Server().CurrentOperationTracker()->Cancel();
hgs
parents:
diff changeset
  1231
		break;
hgs
parents:
diff changeset
  1232
	
hgs
parents:
diff changeset
  1233
		
hgs
parents:
diff changeset
  1234
	case EMemSpyClientServerOpGetEComCategoryCount:
hgs
parents:
diff changeset
  1235
	    aMessage.WriteL(0, TPckgBuf<TInt>(iEngine.HelperECom().MdcaCount()));
hgs
parents:
diff changeset
  1236
	    break;
hgs
parents:
diff changeset
  1237
	    
hgs
parents:
diff changeset
  1238
hgs
parents:
diff changeset
  1239
	case EMemSpyClientServerOpGetEComCategories:
hgs
parents:
diff changeset
  1240
	    {
hgs
parents:
diff changeset
  1241
	    TPckgBuf<TInt> a0;
hgs
parents:
diff changeset
  1242
        aMessage.ReadL(0, a0);
hgs
parents:
diff changeset
  1243
        TInt realCount = Min(a0(), iEngine.HelperECom().MdcaCount());
hgs
parents:
diff changeset
  1244
        
hgs
parents:
diff changeset
  1245
        for (TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyEComCategoryData))
hgs
parents:
diff changeset
  1246
            {
hgs
parents:
diff changeset
  1247
            TMemSpyEComCategoryData data;
hgs
parents:
diff changeset
  1248
            data.iId.iUid = i;
hgs
parents:
diff changeset
  1249
            data.iName.Copy(iEngine.HelperECom().At(i).Name());
hgs
parents:
diff changeset
  1250
            data.iInterfaceCount = iEngine.HelperECom().At(i).MdcaCount();
hgs
parents:
diff changeset
  1251
            
hgs
parents:
diff changeset
  1252
            TPckgBuf<TMemSpyEComCategoryData> buffer(data);
hgs
parents:
diff changeset
  1253
            aMessage.WriteL(1, buffer, offset);
hgs
parents:
diff changeset
  1254
		}
hgs
parents:
diff changeset
  1255
        
hgs
parents:
diff changeset
  1256
        a0 = iEngine.HelperECom().MdcaCount();
hgs
parents:
diff changeset
  1257
        aMessage.WriteL(0, a0);
hgs
parents:
diff changeset
  1258
	    break;
hgs
parents:
diff changeset
  1259
    }
hgs
parents:
diff changeset
  1260
	    
hgs
parents:
diff changeset
  1261
	case EMemSpyClientServerOpGetEComInterfaceCount:
hgs
parents:
diff changeset
  1262
	    {
hgs
parents:
diff changeset
  1263
	    TPckgBuf<TUid> a1;
hgs
parents:
diff changeset
  1264
        aMessage.ReadL(1, a1);
hgs
parents:
diff changeset
  1265
        TInt index = a1().iUid;
hgs
parents:
diff changeset
  1266
        
hgs
parents:
diff changeset
  1267
        if (index < 0 || index >= iEngine.HelperECom().MdcaCount())
hgs
parents:
diff changeset
  1268
            {
hgs
parents:
diff changeset
  1269
            User::Leave(KErrArgument);
hgs
parents:
diff changeset
  1270
            }
hgs
parents:
diff changeset
  1271
        
hgs
parents:
diff changeset
  1272
        aMessage.WriteL(0, TPckgBuf<TInt>(iEngine.HelperECom().At(index).MdcaCount()));
hgs
parents:
diff changeset
  1273
	    break;
hgs
parents:
diff changeset
  1274
	    }
hgs
parents:
diff changeset
  1275
	            
hgs
parents:
diff changeset
  1276
	case EMemSpyClientServerOpGetEComInterfaces:
hgs
parents:
diff changeset
  1277
	    {
hgs
parents:
diff changeset
  1278
	    TPckgBuf<TInt> a0;
hgs
parents:
diff changeset
  1279
        aMessage.ReadL(0, a0);
hgs
parents:
diff changeset
  1280
        TInt realCount = Min(a0(), iEngine.HelperECom().MdcaCount());
hgs
parents:
diff changeset
  1281
        
hgs
parents:
diff changeset
  1282
        TPckgBuf<TUid> a1;
hgs
parents:
diff changeset
  1283
        aMessage.ReadL(1, a1);
hgs
parents:
diff changeset
  1284
        TInt categoryIndex = a1().iUid;
hgs
parents:
diff changeset
  1285
        
hgs
parents:
diff changeset
  1286
        if (categoryIndex < 0 || categoryIndex >= iEngine.HelperECom().MdcaCount())
hgs
parents:
diff changeset
  1287
            {
hgs
parents:
diff changeset
  1288
            User::Leave(KErrArgument);
hgs
parents:
diff changeset
  1289
            }
hgs
parents:
diff changeset
  1290
        
hgs
parents:
diff changeset
  1291
        CMemSpyEngineEComCategory &category = iEngine.HelperECom().At(categoryIndex);
hgs
parents:
diff changeset
  1292
        
hgs
parents:
diff changeset
  1293
        for (TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyEComInterfaceData))
hgs
parents:
diff changeset
  1294
            {
hgs
parents:
diff changeset
  1295
            TMemSpyEComInterfaceData data;
hgs
parents:
diff changeset
  1296
            data.iId.iUid = (TInt32) &category.At(i);
hgs
parents:
diff changeset
  1297
            data.iCategoryId.iUid = categoryIndex;
hgs
parents:
diff changeset
  1298
            data.iName.Copy(category.At(i).Name());
hgs
parents:
diff changeset
  1299
            data.iImplementationCount = category.At(i).MdcaCount();
hgs
parents:
diff changeset
  1300
            
hgs
parents:
diff changeset
  1301
            TPckgBuf<TMemSpyEComInterfaceData> buffer(data);
hgs
parents:
diff changeset
  1302
            aMessage.WriteL(2, buffer, offset);
hgs
parents:
diff changeset
  1303
            }
hgs
parents:
diff changeset
  1304
        
hgs
parents:
diff changeset
  1305
        a0 = realCount;
hgs
parents:
diff changeset
  1306
        aMessage.WriteL(0, a0);
hgs
parents:
diff changeset
  1307
        
hgs
parents:
diff changeset
  1308
        break;
hgs
parents:
diff changeset
  1309
	    }
hgs
parents:
diff changeset
  1310
	    
hgs
parents:
diff changeset
  1311
	case EMemSpyClientServerOpGetEComImplementationCount:
hgs
parents:
diff changeset
  1312
	    {
hgs
parents:
diff changeset
  1313
	    TPckgBuf<TUid> a1;
hgs
parents:
diff changeset
  1314
        aMessage.ReadL(1, a1);
hgs
parents:
diff changeset
  1315
        CMemSpyEngineEComInterface* interface = reinterpret_cast<CMemSpyEngineEComInterface*>(a1().iUid);
hgs
parents:
diff changeset
  1316
        
hgs
parents:
diff changeset
  1317
        // TODO: check if it really is valid interface 
hgs
parents:
diff changeset
  1318
        
hgs
parents:
diff changeset
  1319
        aMessage.WriteL(0, TPckgBuf<TInt>(interface->MdcaCount()));
hgs
parents:
diff changeset
  1320
	    break;
hgs
parents:
diff changeset
  1321
	    }
hgs
parents:
diff changeset
  1322
	                
hgs
parents:
diff changeset
  1323
	case EMemSpyClientServerOpGetEComImplementations:
hgs
parents:
diff changeset
  1324
	    {
hgs
parents:
diff changeset
  1325
        TPckgBuf<TUid> a1;
hgs
parents:
diff changeset
  1326
        aMessage.ReadL(1, a1);
hgs
parents:
diff changeset
  1327
        CMemSpyEngineEComInterface* interface = reinterpret_cast<CMemSpyEngineEComInterface*>(a1().iUid);
hgs
parents:
diff changeset
  1328
        
hgs
parents:
diff changeset
  1329
        TPckgBuf<TInt> a0;
hgs
parents:
diff changeset
  1330
        aMessage.ReadL(0, a0);
hgs
parents:
diff changeset
  1331
        TInt realCount = Min(a0(), interface->MdcaCount());
hgs
parents:
diff changeset
  1332
        
hgs
parents:
diff changeset
  1333
        
hgs
parents:
diff changeset
  1334
        for (TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyEComImplementationData))
hgs
parents:
diff changeset
  1335
            {
hgs
parents:
diff changeset
  1336
            TMemSpyEComImplementationData data;
hgs
parents:
diff changeset
  1337
            data.iName.Copy(interface->At(i).Info().DisplayName());
hgs
parents:
diff changeset
  1338
            data.iImplementationUid = interface->At(i).Info().ImplementationUid();
hgs
parents:
diff changeset
  1339
            data.iVersion = interface->At(i).Info().Version();
hgs
parents:
diff changeset
  1340
            data.iDataType.Copy(interface->At(i).Info().DataType());
hgs
parents:
diff changeset
  1341
            data.iOpaqueData.Copy(interface->At(i).Info().OpaqueData());
hgs
parents:
diff changeset
  1342
            data.iDrive = interface->At(i).Info().Drive();
hgs
parents:
diff changeset
  1343
            data.iRomOnly = interface->At(i).Info().RomOnly();
hgs
parents:
diff changeset
  1344
            data.iRomBased = interface->At(i).Info().RomBased();
hgs
parents:
diff changeset
  1345
            data.iVendorId = interface->At(i).Info().VendorId();
hgs
parents:
diff changeset
  1346
            data.iDisabled = interface->At(i).Info().Disabled();
hgs
parents:
diff changeset
  1347
            
hgs
parents:
diff changeset
  1348
            TPckgBuf<TMemSpyEComImplementationData> buffer(data);
hgs
parents:
diff changeset
  1349
            aMessage.WriteL(2, buffer, offset);
hgs
parents:
diff changeset
  1350
            }
hgs
parents:
diff changeset
  1351
        
hgs
parents:
diff changeset
  1352
        a0 = realCount;
hgs
parents:
diff changeset
  1353
        aMessage.WriteL(0, a0);
hgs
parents:
diff changeset
  1354
        
hgs
parents:
diff changeset
  1355
        break;
hgs
parents:
diff changeset
  1356
	    }
hgs
parents:
diff changeset
  1357
	    
52
hgs
parents: 51
diff changeset
  1358
	case EMemSpyClientServerOpGetWindowGroupCount:
hgs
parents: 51
diff changeset
  1359
	    {
hgs
parents: 51
diff changeset
  1360
	    if (!iEngine.IsHelperWindowServerSupported())
hgs
parents: 51
diff changeset
  1361
	        {
hgs
parents: 51
diff changeset
  1362
	        User::Leave(KErrNotSupported);
hgs
parents: 51
diff changeset
  1363
	        }
hgs
parents: 51
diff changeset
  1364
	    
hgs
parents: 51
diff changeset
  1365
	    RWsSession windowSession;
hgs
parents: 51
diff changeset
  1366
	    windowSession.Connect();
hgs
parents: 51
diff changeset
  1367
	    TInt result = windowSession.NumWindowGroups();
hgs
parents: 51
diff changeset
  1368
	    windowSession.Close();
hgs
parents: 51
diff changeset
  1369
	    User::LeaveIfError(result);
hgs
parents: 51
diff changeset
  1370
	    
hgs
parents: 51
diff changeset
  1371
	    aMessage.WriteL(0, TPckgBuf<TInt>(result));
hgs
parents: 51
diff changeset
  1372
	    break;
hgs
parents: 51
diff changeset
  1373
	    }
hgs
parents: 51
diff changeset
  1374
        
hgs
parents: 51
diff changeset
  1375
	case EMemSpyClientServerOpGetWindowGroups:
hgs
parents: 51
diff changeset
  1376
	    {
hgs
parents: 51
diff changeset
  1377
	    if (!iEngine.IsHelperWindowServerSupported())
hgs
parents: 51
diff changeset
  1378
            {
hgs
parents: 51
diff changeset
  1379
            User::Leave(KErrNotSupported);
hgs
parents: 51
diff changeset
  1380
            }
hgs
parents: 51
diff changeset
  1381
	    
hgs
parents: 51
diff changeset
  1382
	    RArray<TMemSpyEngineWindowGroupBasicInfo> groups;
hgs
parents: 51
diff changeset
  1383
	    CleanupClosePushL( groups );
hgs
parents: 51
diff changeset
  1384
	    
hgs
parents: 51
diff changeset
  1385
	    iEngine.HelperWindowServer().GetWindowGroupListL( groups );
hgs
parents: 51
diff changeset
  1386
        
hgs
parents: 51
diff changeset
  1387
        TPckgBuf<TInt> a0;
hgs
parents: 51
diff changeset
  1388
        aMessage.ReadL(0, a0);
hgs
parents: 51
diff changeset
  1389
        TInt realCount = Min(a0(), groups.Count());
hgs
parents: 51
diff changeset
  1390
                        
hgs
parents: 51
diff changeset
  1391
        for (TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyEngineWindowGroupDetails))
hgs
parents: 51
diff changeset
  1392
            {
hgs
parents: 51
diff changeset
  1393
            TMemSpyEngineWindowGroupDetails data;
hgs
parents: 51
diff changeset
  1394
            
hgs
parents: 51
diff changeset
  1395
            
hgs
parents: 51
diff changeset
  1396
            iEngine.HelperWindowServer().GetWindowGroupDetailsL(groups[i].iId, data);
hgs
parents: 51
diff changeset
  1397
            
hgs
parents: 51
diff changeset
  1398
            TPckgBuf<TMemSpyEngineWindowGroupDetails> buffer(data);
hgs
parents: 51
diff changeset
  1399
            aMessage.WriteL(1, buffer, offset);
hgs
parents: 51
diff changeset
  1400
            }
hgs
parents: 51
diff changeset
  1401
        
hgs
parents: 51
diff changeset
  1402
        a0 = realCount;
hgs
parents: 51
diff changeset
  1403
        aMessage.WriteL(0, a0);
hgs
parents: 51
diff changeset
  1404
        
hgs
parents: 51
diff changeset
  1405
        CleanupStack::PopAndDestroy( &groups ); 
hgs
parents: 51
diff changeset
  1406
        
hgs
parents: 51
diff changeset
  1407
	    break;
hgs
parents: 51
diff changeset
  1408
	    }
62
hgs
parents: 52
diff changeset
  1409
	case EMemSpyClientServerOpSwitchToWindowGroup:
hgs
parents: 52
diff changeset
  1410
		{
hgs
parents: 52
diff changeset
  1411
		TPckgBuf<TInt> id;		
hgs
parents: 52
diff changeset
  1412
		aMessage.ReadL(0, id);
hgs
parents: 52
diff changeset
  1413
		
hgs
parents: 52
diff changeset
  1414
		MMemSpyEngineHelperWindowServer& windowServerManager = iEngine.HelperWindowServer();		
hgs
parents: 52
diff changeset
  1415
		windowServerManager.SwitchToL( id() );
hgs
parents: 52
diff changeset
  1416
		
hgs
parents: 52
diff changeset
  1417
		break;
hgs
parents: 52
diff changeset
  1418
		}
hgs
parents: 52
diff changeset
  1419
	case EMemSpyClientServerOpIsAknIconCacheConfigurable:
hgs
parents: 52
diff changeset
  1420
		{			
hgs
parents: 52
diff changeset
  1421
		TBool ret = iEngine.HelperRAM().IsAknIconCacheConfigurable();
hgs
parents: 52
diff changeset
  1422
		
hgs
parents: 52
diff changeset
  1423
		TPckgBuf<TBool> retBuf( ret );
hgs
parents: 52
diff changeset
  1424
		aMessage.WriteL( 0, retBuf );		
hgs
parents: 52
diff changeset
  1425
		break;
hgs
parents: 52
diff changeset
  1426
		}
hgs
parents: 52
diff changeset
  1427
	case EMemSpyClientServerOpSetAknIconCacheStatus:
hgs
parents: 52
diff changeset
  1428
		{
hgs
parents: 52
diff changeset
  1429
		TPckgBuf<TBool> enabled;
hgs
parents: 52
diff changeset
  1430
		aMessage.ReadL(0, enabled);
hgs
parents: 52
diff changeset
  1431
				
hgs
parents: 52
diff changeset
  1432
		TInt64 savedAmount = iEngine.HelperRAM().SetAknIconCacheStatusL( enabled() );
hgs
parents: 52
diff changeset
  1433
		
hgs
parents: 52
diff changeset
  1434
		TPckgBuf<TInt64> ret(savedAmount);
hgs
parents: 52
diff changeset
  1435
		aMessage.WriteL(1, ret);
hgs
parents: 52
diff changeset
  1436
		break;		
hgs
parents: 52
diff changeset
  1437
		}
hgs
parents: 52
diff changeset
  1438
		
hgs
parents: 52
diff changeset
  1439
	// Code Segments
hgs
parents: 52
diff changeset
  1440
	case EMemSpyClientServerOpGetCodeSegmentsCount:
hgs
parents: 52
diff changeset
  1441
		{
hgs
parents: 52
diff changeset
  1442
	    TInt result = 0;
hgs
parents: 52
diff changeset
  1443
	    
hgs
parents: 52
diff changeset
  1444
	    CMemSpyEngineCodeSegList* list = iEngine.HelperCodeSegment().CodeSegmentListL();
hgs
parents: 52
diff changeset
  1445
	    CleanupStack::PushL( list );	    
hgs
parents: 52
diff changeset
  1446
	    result = list->MdcaCount();	    	    	    
hgs
parents: 52
diff changeset
  1447
	    aMessage.WriteL(0, TPckgBuf<TInt>(result));
hgs
parents: 52
diff changeset
  1448
	    CleanupStack::Pop( list );
hgs
parents: 52
diff changeset
  1449
		break;
hgs
parents: 52
diff changeset
  1450
		}		
hgs
parents: 52
diff changeset
  1451
	case EMemSpyClientServerOpGetSortedCodeSegments:
hgs
parents: 52
diff changeset
  1452
		{
hgs
parents: 52
diff changeset
  1453
        CMemSpyEngineCodeSegList* list = iEngine.HelperCodeSegment().CodeSegmentListL();
hgs
parents: 52
diff changeset
  1454
        CleanupStack::PushL( list );
hgs
parents: 52
diff changeset
  1455
             
hgs
parents: 52
diff changeset
  1456
        TPckgBuf<TSortType> a2;
hgs
parents: 52
diff changeset
  1457
        aMessage.ReadL( 2, a2 );
hgs
parents: 52
diff changeset
  1458
             
hgs
parents: 52
diff changeset
  1459
        //sort the list of Code Segments
hgs
parents: 52
diff changeset
  1460
        if( a2() == ESortCodeSegByName )
hgs
parents: 52
diff changeset
  1461
        	list->SortByFileNameL();
hgs
parents: 52
diff changeset
  1462
        else if ( a2() == ESortCodeSegBySize )
hgs
parents: 52
diff changeset
  1463
        	list->SortByCodeSizeL();
hgs
parents: 52
diff changeset
  1464
        else if ( a2() == ESortCodeSegByTotalDataSize )
hgs
parents: 52
diff changeset
  1465
        	list->SortByDataSizeL();
hgs
parents: 52
diff changeset
  1466
        else 
hgs
parents: 52
diff changeset
  1467
        	list->SortByUidsL();
hgs
parents: 52
diff changeset
  1468
             
hgs
parents: 52
diff changeset
  1469
         TPckgBuf<TInt> a0;          
hgs
parents: 52
diff changeset
  1470
         aMessage.ReadL(0, a0);                              
hgs
parents: 52
diff changeset
  1471
             
hgs
parents: 52
diff changeset
  1472
         TInt realCount = Min(a0(), list->MdcaCount());
hgs
parents: 52
diff changeset
  1473
         
hgs
parents: 52
diff changeset
  1474
         for(TInt i=0, offset = 0; i<realCount; i++, offset += sizeof(TMemSpyCodeSegmentData))
hgs
parents: 52
diff changeset
  1475
             {
hgs
parents: 52
diff changeset
  1476
             const CMemSpyEngineCodeSegEntry& codeSegment = list->At(i);
hgs
parents: 52
diff changeset
  1477
             TMemSpyCodeSegmentData data;
hgs
parents: 52
diff changeset
  1478
             TCodeSegCreateInfo createInfo = codeSegment.CreateInfo();
hgs
parents: 52
diff changeset
  1479
                         
hgs
parents: 52
diff changeset
  1480
             data.iName.Copy( codeSegment.FileName() );
hgs
parents: 52
diff changeset
  1481
             data.iCodeSize = createInfo.iCodeSize;
hgs
parents: 52
diff changeset
  1482
             data.iTotalDataSize = createInfo.iTotalDataSize;
hgs
parents: 52
diff changeset
  1483
             data.iTextSize = createInfo.iTextSize;
hgs
parents: 52
diff changeset
  1484
             data.iDataSize = createInfo.iDataSize;
hgs
parents: 52
diff changeset
  1485
             data.iBssSize = createInfo.iBssSize;
hgs
parents: 52
diff changeset
  1486
             data.iUids = createInfo.iUids;
hgs
parents: 52
diff changeset
  1487
             data.iModuleVersion = createInfo.iModuleVersion;
hgs
parents: 52
diff changeset
  1488
             data.iSecureId = createInfo.iS.iSecureId;
hgs
parents: 52
diff changeset
  1489
             data.iVendorId = createInfo.iS.iVendorId;
hgs
parents: 52
diff changeset
  1490
             data.iEntryPtVeneer = createInfo.iEntryPtVeneer;
hgs
parents: 52
diff changeset
  1491
             data.iFileEntryPoint = createInfo.iFileEntryPoint;
hgs
parents: 52
diff changeset
  1492
             data.iDepCount = createInfo.iDepCount;
hgs
parents: 52
diff changeset
  1493
             data.iCodeLoadAddress = createInfo.iCodeLoadAddress;
hgs
parents: 52
diff changeset
  1494
             data.iDataLoadAddress = createInfo.iDataLoadAddress;                 
hgs
parents: 52
diff changeset
  1495
             data.iCapabilities1 = static_cast<TUint32>(createInfo.iS.iCaps[0]);
hgs
parents: 52
diff changeset
  1496
             data.iCapabilities2 = static_cast<TUint32>(createInfo.iS.iCaps[1]);
hgs
parents: 52
diff changeset
  1497
                         
hgs
parents: 52
diff changeset
  1498
             TPckgBuf<TMemSpyCodeSegmentData> buffer(data);
hgs
parents: 52
diff changeset
  1499
             aMessage.WriteL(1, buffer, offset);
hgs
parents: 52
diff changeset
  1500
             }                                                                               
hgs
parents: 52
diff changeset
  1501
        CleanupStack::PopAndDestroy( list );				
hgs
parents: 52
diff changeset
  1502
		
hgs
parents: 52
diff changeset
  1503
		break;
hgs
parents: 52
diff changeset
  1504
		}
hgs
parents: 52
diff changeset
  1505
	case EMemSpyClientServerOpCodeSegmentsOutput:
hgs
parents: 52
diff changeset
  1506
		{
hgs
parents: 52
diff changeset
  1507
		CMemSpyEngineCodeSegList* list = iEngine.HelperCodeSegment().CodeSegmentListL();
hgs
parents: 52
diff changeset
  1508
		CleanupStack::PushL( list );
hgs
parents: 52
diff changeset
  1509
	    // Begin a new data stream
hgs
parents: 52
diff changeset
  1510
	    _LIT( KMemSpyContext, "CodeSeg List - " );
hgs
parents: 52
diff changeset
  1511
	    _LIT( KMemSpyFolder, "CodeSegs" );
hgs
parents: 52
diff changeset
  1512
	    iEngine.Sink().DataStreamBeginL( KMemSpyContext, KMemSpyFolder );
hgs
parents: 52
diff changeset
  1513
hgs
parents: 52
diff changeset
  1514
	    // Set prefix for overall listing
hgs
parents: 52
diff changeset
  1515
	    _LIT(KOverallPrefix, "CodeSeg List - ");
hgs
parents: 52
diff changeset
  1516
	    iEngine.Sink().OutputPrefixSetLC( KOverallPrefix );
hgs
parents: 52
diff changeset
  1517
hgs
parents: 52
diff changeset
  1518
	    // Create header
hgs
parents: 52
diff changeset
  1519
	    CMemSpyEngineCodeSegList::OutputDataColumnsL( iEngine );
hgs
parents: 52
diff changeset
  1520
	    
hgs
parents: 52
diff changeset
  1521
	    // List items
hgs
parents: 52
diff changeset
  1522
	    const TInt count = list->Count();
hgs
parents: 52
diff changeset
  1523
	    for(TInt i=0; i<count; i++)
hgs
parents: 52
diff changeset
  1524
	        {
hgs
parents: 52
diff changeset
  1525
	        const CMemSpyEngineCodeSegEntry& entry = list->At( i );
hgs
parents: 52
diff changeset
  1526
	        //
hgs
parents: 52
diff changeset
  1527
	        entry.OutputDataL( iEngine.HelperCodeSegment() );
hgs
parents: 52
diff changeset
  1528
	        }
hgs
parents: 52
diff changeset
  1529
	    
hgs
parents: 52
diff changeset
  1530
	    // Tidy up
hgs
parents: 52
diff changeset
  1531
	    CleanupStack::PopAndDestroy(); // prefix
hgs
parents: 52
diff changeset
  1532
hgs
parents: 52
diff changeset
  1533
	    // End data stream
hgs
parents: 52
diff changeset
  1534
	    iEngine.Sink().DataStreamEndL();
hgs
parents: 52
diff changeset
  1535
	    
hgs
parents: 52
diff changeset
  1536
	    // Tidy up Code segment list
hgs
parents: 52
diff changeset
  1537
	    CleanupStack::PopAndDestroy( list );
hgs
parents: 52
diff changeset
  1538
	    
hgs
parents: 52
diff changeset
  1539
	    break;
hgs
parents: 52
diff changeset
  1540
		}
hgs
parents: 52
diff changeset
  1541
		
hgs
parents: 52
diff changeset
  1542
	case EMemSpyClientServerOpNotifyEvent:
hgs
parents: 52
diff changeset
  1543
	    Server().NotificationTracker()->AddNotificationL( aMessage );
hgs
parents: 52
diff changeset
  1544
	    break;
hgs
parents: 52
diff changeset
  1545
	     
hgs
parents: 52
diff changeset
  1546
	case EMemSpyClientServerOpCancelEventNotification:
hgs
parents: 52
diff changeset
  1547
	    Server().NotificationTracker()->CancelNotification( aMessage );
hgs
parents: 52
diff changeset
  1548
	    break;
52
hgs
parents: 51
diff changeset
  1549
	    
hgs
parents: 51
diff changeset
  1550
	    
51
hgs
parents:
diff changeset
  1551
		}
hgs
parents:
diff changeset
  1552
    }
hgs
parents:
diff changeset
  1553
hgs
parents:
diff changeset
  1554
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1555
// DoCmdServiceL( const RMessage2& aMessage )
hgs
parents:
diff changeset
  1556
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1557
//
hgs
parents:
diff changeset
  1558
void CMemSpyEngineSession::DoCmdServiceL( const RMessage2& aMessage )
hgs
parents:
diff changeset
  1559
    {
hgs
parents:
diff changeset
  1560
    TInt error = KErrNone;
hgs
parents:
diff changeset
  1561
hgs
parents:
diff changeset
  1562
    // Check function attributes
hgs
parents:
diff changeset
  1563
    const TInt function = aMessage.Function() & KMemSpyOpFlagsTypeMask;
hgs
parents:
diff changeset
  1564
    const TInt argSpec = aMessage.Function() & KMemSpyOpFlagsInclusionMask;
hgs
parents:
diff changeset
  1565
    const TBool byThreadId = ( argSpec == KMemSpyOpFlagsIncludesThreadId );
hgs
parents:
diff changeset
  1566
    const TBool byThreadName = ( argSpec == KMemSpyOpFlagsIncludesThreadName );
hgs
parents:
diff changeset
  1567
hgs
parents:
diff changeset
  1568
    TRACE( RDebug::Printf( "[MemSpy] CMemSpyEngineSession::DoServiceL() - START - unmodified function: 0x%08x, opCode: %d [TID: %d, TN: %d]", aMessage.Function(), function, byThreadId, byThreadName ) );
hgs
parents:
diff changeset
  1569
hgs
parents:
diff changeset
  1570
    // Check function is supported and argument combination is valid
hgs
parents:
diff changeset
  1571
    error = ValidateFunction( function, byThreadId, byThreadName );
hgs
parents:
diff changeset
  1572
    TRACE( RDebug::Printf( "[MemSpy] CMemSpyEngineSession::DoServiceL() - validation result: %d", error ) );
hgs
parents:
diff changeset
  1573
    
hgs
parents:
diff changeset
  1574
    // Process function request
hgs
parents:
diff changeset
  1575
    if  ( error == KErrNone )
hgs
parents:
diff changeset
  1576
        {
hgs
parents:
diff changeset
  1577
        if  ( byThreadId )
hgs
parents:
diff changeset
  1578
            {
hgs
parents:
diff changeset
  1579
            TRACE( RDebug::Printf( "[MemSpy] CMemSpyEngineSession::DoServiceL() - [TID] thread-specific..." ) );
hgs
parents:
diff changeset
  1580
            
hgs
parents:
diff changeset
  1581
            const TThreadId threadId( aMessage.Int0() );
hgs
parents:
diff changeset
  1582
            HandleThreadSpecificOpL( function, threadId );
hgs
parents:
diff changeset
  1583
            }
hgs
parents:
diff changeset
  1584
        else if ( byThreadName )
hgs
parents:
diff changeset
  1585
            {
hgs
parents:
diff changeset
  1586
            TRACE( RDebug::Printf( "[MemSpy] CMemSpyEngineSession::DoServiceL() - [TN] thread-specific..." ) );
hgs
parents:
diff changeset
  1587
hgs
parents:
diff changeset
  1588
            error = aMessage.GetDesLength( 0 /*slot 0*/ );
hgs
parents:
diff changeset
  1589
        
hgs
parents:
diff changeset
  1590
            if  ( error > 0 && error <= KMaxFullName )
hgs
parents:
diff changeset
  1591
                {
hgs
parents:
diff changeset
  1592
                TFullName* threadName = new(ELeave) TFullName();
hgs
parents:
diff changeset
  1593
                CleanupStack::PushL( threadName );
hgs
parents:
diff changeset
  1594
                aMessage.ReadL( 0, *threadName );
hgs
parents:
diff changeset
  1595
                HandleThreadSpecificOpL( function, *threadName );
hgs
parents:
diff changeset
  1596
                CleanupStack::PopAndDestroy( threadName );
hgs
parents:
diff changeset
  1597
                }
hgs
parents:
diff changeset
  1598
            else
hgs
parents:
diff changeset
  1599
                {
hgs
parents:
diff changeset
  1600
                error = KErrArgument;
hgs
parents:
diff changeset
  1601
                }
hgs
parents:
diff changeset
  1602
            }
hgs
parents:
diff changeset
  1603
        else
hgs
parents:
diff changeset
  1604
            {
hgs
parents:
diff changeset
  1605
            TRACE( RDebug::Printf( "[MemSpy] CMemSpyEngineSession::DoServiceL() - thread-agnostic..." ) );
hgs
parents:
diff changeset
  1606
hgs
parents:
diff changeset
  1607
            HandleThreadAgnosticOpL( function, aMessage );
hgs
parents:
diff changeset
  1608
            }
hgs
parents:
diff changeset
  1609
        }
hgs
parents:
diff changeset
  1610
hgs
parents:
diff changeset
  1611
    User::LeaveIfError( error );
hgs
parents:
diff changeset
  1612
hgs
parents:
diff changeset
  1613
    TRACE( RDebug::Printf( "[MemSpy] CMemSpyEngineSession::DoServiceL() - END" ) );
hgs
parents:
diff changeset
  1614
    }
hgs
parents:
diff changeset
  1615
hgs
parents:
diff changeset
  1616
hgs
parents:
diff changeset
  1617
hgs
parents:
diff changeset
  1618
TInt CMemSpyEngineSession::ValidateFunction( TInt aFunction, TBool aIncludesThreadId, TBool aIncludesThreadName )
hgs
parents:
diff changeset
  1619
    {
hgs
parents:
diff changeset
  1620
    TInt err = KErrNotSupported;
hgs
parents:
diff changeset
  1621
    
hgs
parents:
diff changeset
  1622
    // Check the operation is within op-code range
hgs
parents:
diff changeset
  1623
    if  ( aFunction >= EMemSpyClientServerOpMarkerFirst && aFunction < EMemSpyClientServerOpMarkerLast )
hgs
parents:
diff changeset
  1624
        {
hgs
parents:
diff changeset
  1625
        // Check the operation doesn't include unnecessary or not supported information
hgs
parents:
diff changeset
  1626
        const TBool includesThreadIdentifier = ( aIncludesThreadId || aIncludesThreadName );
hgs
parents:
diff changeset
  1627
        if  ( includesThreadIdentifier && aFunction >= EMemSpyClientServerOpMarkerThreadAgnosticFirst )
hgs
parents:
diff changeset
  1628
            {
hgs
parents:
diff changeset
  1629
            // Passing a thread identifier to a thread agnostic operation
hgs
parents:
diff changeset
  1630
            err = KErrArgument;
hgs
parents:
diff changeset
  1631
            }
hgs
parents:
diff changeset
  1632
        else
hgs
parents:
diff changeset
  1633
            {
hgs
parents:
diff changeset
  1634
            err = KErrNone;
hgs
parents:
diff changeset
  1635
            }
hgs
parents:
diff changeset
  1636
        }
hgs
parents:
diff changeset
  1637
    //
hgs
parents:
diff changeset
  1638
    if  ( err != KErrNone )
hgs
parents:
diff changeset
  1639
        {
hgs
parents:
diff changeset
  1640
        RDebug::Printf( "[MemSpy] CMemSpyEngineSession::ValidateFunction() - function request did not validate - [withId: %d, withName: %d]", aIncludesThreadId, aIncludesThreadName );
hgs
parents:
diff changeset
  1641
        }
hgs
parents:
diff changeset
  1642
    //
hgs
parents:
diff changeset
  1643
    return err;
hgs
parents:
diff changeset
  1644
    }
hgs
parents:
diff changeset
  1645
hgs
parents:
diff changeset
  1646
hgs
parents:
diff changeset
  1647
void CMemSpyEngineSession::HandleThreadSpecificOpL( TInt aFunction, const TThreadId& aThreadId )
hgs
parents:
diff changeset
  1648
    {
hgs
parents:
diff changeset
  1649
    TRACE( RDebug::Printf( "[MemSpy] CMemSpyEngineSession::HandleThreadSpecificOpL() - START - aFunction: %d, aThreadId: %d", aFunction, (TUint) aThreadId ) );
hgs
parents:
diff changeset
  1650
hgs
parents:
diff changeset
  1651
    ASSERT( (TUint) aThreadId != 0 );
hgs
parents:
diff changeset
  1652
    TInt error = KErrNone;
hgs
parents:
diff changeset
  1653
hgs
parents:
diff changeset
  1654
    // Check if its a kernel thread identifier
hgs
parents:
diff changeset
  1655
    const TBool isKernel = ( static_cast<TUint32>( aThreadId ) == KMemSpyClientServerThreadIdKernel );
hgs
parents:
diff changeset
  1656
hgs
parents:
diff changeset
  1657
    // Treat as thread specific operation
hgs
parents:
diff changeset
  1658
    CMemSpyProcess* process = NULL;
hgs
parents:
diff changeset
  1659
    CMemSpyThread* thread = NULL;
hgs
parents:
diff changeset
  1660
    if  ( !isKernel )
hgs
parents:
diff changeset
  1661
        {
hgs
parents:
diff changeset
  1662
        error = iEngine.Container().ProcessAndThreadByThreadId( aThreadId, process, thread );
hgs
parents:
diff changeset
  1663
        TRACE( RDebug::Printf( "[MemSpy] CMemSpyEngineSession::HandleThreadSpecificOpL() - search result: %d, proc: 0x%08x, thread: 0x%08x", error, process, thread ) );
hgs
parents:
diff changeset
  1664
        }
hgs
parents:
diff changeset
  1665
    else
hgs
parents:
diff changeset
  1666
        {
hgs
parents:
diff changeset
  1667
        // Kernel is only supported for a couple of operations
hgs
parents:
diff changeset
  1668
        if  ( aFunction == EMemSpyClientServerOpHeapInfo || aFunction == EMemSpyClientServerOpHeapData )
hgs
parents:
diff changeset
  1669
            {
hgs
parents:
diff changeset
  1670
            }
hgs
parents:
diff changeset
  1671
        else
hgs
parents:
diff changeset
  1672
            {
hgs
parents:
diff changeset
  1673
            TRACE( RDebug::Printf( "[MemSpy] CMemSpyEngineSession::HandleThreadSpecificOpL() - trying to call unsupported function for kernel thread!" ) );
hgs
parents:
diff changeset
  1674
            error = KErrArgument;
hgs
parents:
diff changeset
  1675
            }
hgs
parents:
diff changeset
  1676
        }
hgs
parents:
diff changeset
  1677
hgs
parents:
diff changeset
  1678
    // Must be no error so far and we must have a valid thread & process when performing a non-kernel op
hgs
parents:
diff changeset
  1679
    // or then if we are performing a kernel op, we don't need the thread or process.
hgs
parents:
diff changeset
  1680
    if  ( error == KErrNone && ( ( thread && process && !isKernel ) || ( isKernel ) ) )
hgs
parents:
diff changeset
  1681
        {
hgs
parents:
diff changeset
  1682
#ifdef _DEBUG
hgs
parents:
diff changeset
  1683
        if  ( thread )
hgs
parents:
diff changeset
  1684
            {
hgs
parents:
diff changeset
  1685
            HBufC* threadName = thread->FullName().AllocLC();
hgs
parents:
diff changeset
  1686
            _LIT( KTrace2, "[MemSpy] CMemSpyEngineSession::HandleThreadSpecificOpL() - thread: %S" );
hgs
parents:
diff changeset
  1687
            RDebug::Print( KTrace2, threadName );
hgs
parents:
diff changeset
  1688
            CleanupStack::PopAndDestroy( threadName );
hgs
parents:
diff changeset
  1689
            }
hgs
parents:
diff changeset
  1690
        else if ( isKernel )
hgs
parents:
diff changeset
  1691
            {
hgs
parents:
diff changeset
  1692
            _LIT( KTrace2, "[MemSpy] CMemSpyEngineSession::HandleThreadSpecificOpL() - thread: Kernel" );
hgs
parents:
diff changeset
  1693
            RDebug::Print( KTrace2 );
hgs
parents:
diff changeset
  1694
            }
hgs
parents:
diff changeset
  1695
#endif
hgs
parents:
diff changeset
  1696
hgs
parents:
diff changeset
  1697
        // Got a valid thread object - now work out which operation to perform...
hgs
parents:
diff changeset
  1698
        switch( aFunction )
hgs
parents:
diff changeset
  1699
            {
hgs
parents:
diff changeset
  1700
        case EMemSpyClientServerOpSummaryInfo:
hgs
parents:
diff changeset
  1701
            iEngine.HelperProcess().OutputProcessInfoL( *process );
hgs
parents:
diff changeset
  1702
            break;
hgs
parents:
diff changeset
  1703
        case EMemSpyClientServerOpSummaryInfoDetailed:
hgs
parents:
diff changeset
  1704
            iEngine.HelperProcess().OutputProcessInfoDetailedL( *process );
hgs
parents:
diff changeset
  1705
            break;
hgs
parents:
diff changeset
  1706
        case EMemSpyClientServerOpHeapInfo:
hgs
parents:
diff changeset
  1707
            if  ( isKernel )
hgs
parents:
diff changeset
  1708
                {
hgs
parents:
diff changeset
  1709
                iEngine.HelperHeap().OutputHeapInfoKernelL();
hgs
parents:
diff changeset
  1710
                }
hgs
parents:
diff changeset
  1711
            else
hgs
parents:
diff changeset
  1712
                {
hgs
parents:
diff changeset
  1713
                iEngine.HelperHeap().OutputHeapInfoUserL( *thread );
hgs
parents:
diff changeset
  1714
                }
hgs
parents:
diff changeset
  1715
            break;
hgs
parents:
diff changeset
  1716
        case EMemSpyClientServerOpHeapCellListing:
hgs
parents:
diff changeset
  1717
            iEngine.HelperHeap().OutputCellListingUserL( *thread );
hgs
parents:
diff changeset
  1718
            break;
hgs
parents:
diff changeset
  1719
        case EMemSpyClientServerOpHeapData:
hgs
parents:
diff changeset
  1720
            if  ( isKernel )
hgs
parents:
diff changeset
  1721
                {
hgs
parents:
diff changeset
  1722
                iEngine.HelperHeap().OutputHeapDataKernelL();
hgs
parents:
diff changeset
  1723
                }
hgs
parents:
diff changeset
  1724
            else
hgs
parents:
diff changeset
  1725
                {
hgs
parents:
diff changeset
  1726
                iEngine.HelperHeap().OutputHeapDataUserL( *thread );
hgs
parents:
diff changeset
  1727
                }
hgs
parents:
diff changeset
  1728
            break;
hgs
parents:
diff changeset
  1729
        case EMemSpyClientServerOpStackInfo:
hgs
parents:
diff changeset
  1730
            iEngine.HelperStack().OutputStackInfoL( *thread );
hgs
parents:
diff changeset
  1731
            break;
hgs
parents:
diff changeset
  1732
        case EMemSpyClientServerOpStackDataUser:
hgs
parents:
diff changeset
  1733
            iEngine.HelperStack().OutputStackDataL( *thread, EMemSpyDriverDomainUser, EFalse );
hgs
parents:
diff changeset
  1734
            break;
hgs
parents:
diff changeset
  1735
        case EMemSpyClientServerOpStackDataKernel:
hgs
parents:
diff changeset
  1736
            iEngine.HelperStack().OutputStackDataL( *thread, EMemSpyDriverDomainKernel, EFalse );
hgs
parents:
diff changeset
  1737
            break;
hgs
parents:
diff changeset
  1738
        case EMemSpyClientServerOpOpenFiles:
hgs
parents:
diff changeset
  1739
            iEngine.HelperFileSystem().ListOpenFilesL( aThreadId );
hgs
parents:
diff changeset
  1740
            break;
hgs
parents:
diff changeset
  1741
hgs
parents:
diff changeset
  1742
        default:
hgs
parents:
diff changeset
  1743
            error = KErrNotSupported;
hgs
parents:
diff changeset
  1744
            break;
hgs
parents:
diff changeset
  1745
            }
hgs
parents:
diff changeset
  1746
        }
hgs
parents:
diff changeset
  1747
hgs
parents:
diff changeset
  1748
    TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadSpecificOpL() - END - aFunction: %d, aThreadId: %d, error: %d", aFunction, (TUint) aThreadId, error ) );
hgs
parents:
diff changeset
  1749
    User::LeaveIfError( error );
hgs
parents:
diff changeset
  1750
    }
hgs
parents:
diff changeset
  1751
hgs
parents:
diff changeset
  1752
hgs
parents:
diff changeset
  1753
void CMemSpyEngineSession::HandleThreadSpecificOpL( TInt aFunction, const TDesC& aThreadName )
hgs
parents:
diff changeset
  1754
    {
hgs
parents:
diff changeset
  1755
    TRACE( RDebug::Print( _L("[MemSpy] CMemSpyEngineSession::HandleThreadSpecificOpL() - START - aFunction: %d, aThreadName: %S"), aFunction, &aThreadName ) );
hgs
parents:
diff changeset
  1756
    //
hgs
parents:
diff changeset
  1757
    CMemSpyProcess* process = NULL;
hgs
parents:
diff changeset
  1758
    CMemSpyThread* thread = NULL;
hgs
parents:
diff changeset
  1759
    TInt error = iEngine.Container().ProcessAndThreadByPartialName( aThreadName, process, thread );
hgs
parents:
diff changeset
  1760
    User::LeaveIfError( error );
hgs
parents:
diff changeset
  1761
    //
hgs
parents:
diff changeset
  1762
    const TThreadId threadId( thread->Id() );
hgs
parents:
diff changeset
  1763
    HandleThreadSpecificOpL( aFunction, threadId );
hgs
parents:
diff changeset
  1764
    //
hgs
parents:
diff changeset
  1765
    TRACE( RDebug::Print( _L("[MemSpy] CMemSpyEngineSession::HandleThreadSpecificOpL() - END - aFunction: %d, aThreadName: %S"), aFunction, &aThreadName ) );
hgs
parents:
diff changeset
  1766
    }
hgs
parents:
diff changeset
  1767
hgs
parents:
diff changeset
  1768
hgs
parents:
diff changeset
  1769
void CMemSpyEngineSession::HandleThreadAgnosticOpL( TInt aFunction, const RMessage2& aMessage )
hgs
parents:
diff changeset
  1770
    {
hgs
parents:
diff changeset
  1771
    TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - START" ) );
hgs
parents:
diff changeset
  1772
    
hgs
parents:
diff changeset
  1773
    //
hgs
parents:
diff changeset
  1774
    if  ( aFunction ==  EMemSpyClientServerOpHeapInfoCompact )
hgs
parents:
diff changeset
  1775
        {
hgs
parents:
diff changeset
  1776
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpHeapInfoCompact") );
hgs
parents:
diff changeset
  1777
        if (aMessage.Function() & KMemSpyOpFlagsAsyncOperation)
hgs
parents:
diff changeset
  1778
        	{
hgs
parents:
diff changeset
  1779
			StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EEntireDeviceHeapInfoCompact, aMessage);
hgs
parents:
diff changeset
  1780
        	}
hgs
parents:
diff changeset
  1781
        else
hgs
parents:
diff changeset
  1782
        	{
hgs
parents:
diff changeset
  1783
			iEngine.HelperHeap().OutputHeapInfoForDeviceL();
hgs
parents:
diff changeset
  1784
        	}
hgs
parents:
diff changeset
  1785
        }
hgs
parents:
diff changeset
  1786
    else if ( aFunction ==  EMemSpyClientServerOpStackInfoCompact )
hgs
parents:
diff changeset
  1787
        {
hgs
parents:
diff changeset
  1788
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpStackInfoCompact") );
hgs
parents:
diff changeset
  1789
        if (aMessage.Function() & KMemSpyOpFlagsAsyncOperation)
hgs
parents:
diff changeset
  1790
			{
hgs
parents:
diff changeset
  1791
			StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EEntireDeviceStackInfoCompact, aMessage);
hgs
parents:
diff changeset
  1792
			}
hgs
parents:
diff changeset
  1793
		else
hgs
parents:
diff changeset
  1794
			{
hgs
parents:
diff changeset
  1795
			iEngine.HelperStack().OutputStackInfoForDeviceL();
hgs
parents:
diff changeset
  1796
			}
hgs
parents:
diff changeset
  1797
        }
hgs
parents:
diff changeset
  1798
    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingTimerStart )
hgs
parents:
diff changeset
  1799
        {
hgs
parents:
diff changeset
  1800
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingTimerStart") );
hgs
parents:
diff changeset
  1801
        iEngine.HelperSysMemTracker().StartL();
hgs
parents:
diff changeset
  1802
        }
hgs
parents:
diff changeset
  1803
    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingTimerStop )
hgs
parents:
diff changeset
  1804
        {
hgs
parents:
diff changeset
  1805
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingTimerStop") );
hgs
parents:
diff changeset
  1806
        iEngine.HelperSysMemTracker().StopL();
hgs
parents:
diff changeset
  1807
        }
hgs
parents:
diff changeset
  1808
    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingReset )
hgs
parents:
diff changeset
  1809
        {
hgs
parents:
diff changeset
  1810
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingReset") );
hgs
parents:
diff changeset
  1811
        iEngine.HelperSysMemTracker().Reset();
hgs
parents:
diff changeset
  1812
        }
hgs
parents:
diff changeset
  1813
    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingForceUpdate )
hgs
parents:
diff changeset
  1814
        {
hgs
parents:
diff changeset
  1815
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingForceUpdate") );
hgs
parents:
diff changeset
  1816
        iEngine.HelperSysMemTracker().CheckForChangesNowL();
hgs
parents:
diff changeset
  1817
        }
hgs
parents:
diff changeset
  1818
    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingTimerPeriodSet )
hgs
parents:
diff changeset
  1819
        {
hgs
parents:
diff changeset
  1820
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingTimerPeriodSet") );
hgs
parents:
diff changeset
  1821
        
hgs
parents:
diff changeset
  1822
        // Get current config
hgs
parents:
diff changeset
  1823
        TMemSpyEngineHelperSysMemTrackerConfig config;
hgs
parents:
diff changeset
  1824
        iEngine.HelperSysMemTracker().GetConfig( config );
hgs
parents:
diff changeset
  1825
hgs
parents:
diff changeset
  1826
        // Set new timer value
hgs
parents:
diff changeset
  1827
        config.iTimerPeriod = aMessage.Int0();
hgs
parents:
diff changeset
  1828
hgs
parents:
diff changeset
  1829
        // And update config... which will leave if the config is invalid
hgs
parents:
diff changeset
  1830
        iEngine.HelperSysMemTracker().SetConfigL( config );
hgs
parents:
diff changeset
  1831
        }
hgs
parents:
diff changeset
  1832
    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingCategoriesSet )
hgs
parents:
diff changeset
  1833
        {
hgs
parents:
diff changeset
  1834
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingCategoriesSet") );
hgs
parents:
diff changeset
  1835
        // Get current config
hgs
parents:
diff changeset
  1836
        TMemSpyEngineHelperSysMemTrackerConfig config;
hgs
parents:
diff changeset
  1837
        iEngine.HelperSysMemTracker().GetConfig( config );
hgs
parents:
diff changeset
  1838
hgs
parents:
diff changeset
  1839
        // Set new categories
hgs
parents:
diff changeset
  1840
        config.iEnabledCategories = aMessage.Int0();
hgs
parents:
diff changeset
  1841
hgs
parents:
diff changeset
  1842
        // And update config... which will leave if the config is invalid
hgs
parents:
diff changeset
  1843
        iEngine.HelperSysMemTracker().SetConfigL( config );
hgs
parents:
diff changeset
  1844
        }
hgs
parents:
diff changeset
  1845
    
hgs
parents:
diff changeset
  1846
    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingThreadNameFilterSet )
hgs
parents:
diff changeset
  1847
        {
hgs
parents:
diff changeset
  1848
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSystemWideMemoryTrackingThreadNameFilterSet") );
hgs
parents:
diff changeset
  1849
        // Get current config
hgs
parents:
diff changeset
  1850
        TMemSpyEngineHelperSysMemTrackerConfig config;
hgs
parents:
diff changeset
  1851
        iEngine.HelperSysMemTracker().GetConfig( config );
hgs
parents:
diff changeset
  1852
hgs
parents:
diff changeset
  1853
        // Set new filter
hgs
parents:
diff changeset
  1854
        RBuf buf;
hgs
parents:
diff changeset
  1855
        buf.CleanupClosePushL();
hgs
parents:
diff changeset
  1856
        TInt len = aMessage.GetDesLength( 0 );
hgs
parents:
diff changeset
  1857
        if ( len > 0 )
hgs
parents:
diff changeset
  1858
            {
hgs
parents:
diff changeset
  1859
            buf.CreateL( len );
hgs
parents:
diff changeset
  1860
            aMessage.ReadL( 0, buf, 0 );
hgs
parents:
diff changeset
  1861
            config.iThreadNameFilter.Copy( buf );            
hgs
parents:
diff changeset
  1862
            }
hgs
parents:
diff changeset
  1863
        else
hgs
parents:
diff changeset
  1864
            {
hgs
parents:
diff changeset
  1865
            config.iThreadNameFilter.Zero();
hgs
parents:
diff changeset
  1866
            }
hgs
parents:
diff changeset
  1867
        CleanupStack::PopAndDestroy( &buf );
hgs
parents:
diff changeset
  1868
hgs
parents:
diff changeset
  1869
        // And update config... which will leave if the config is invalid
hgs
parents:
diff changeset
  1870
        iEngine.HelperSysMemTracker().SetConfigL( config );
hgs
parents:
diff changeset
  1871
        }
hgs
parents:
diff changeset
  1872
    else if ( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingHeapDumpSet )
hgs
parents:
diff changeset
  1873
        {
hgs
parents:
diff changeset
  1874
        // Get current config
hgs
parents:
diff changeset
  1875
        TMemSpyEngineHelperSysMemTrackerConfig config;
hgs
parents:
diff changeset
  1876
        iEngine.HelperSysMemTracker().GetConfig( config );
hgs
parents:
diff changeset
  1877
        
hgs
parents:
diff changeset
  1878
        // Set new Heap Dump value
hgs
parents:
diff changeset
  1879
        config.iDumpData = aMessage.Int0();
hgs
parents:
diff changeset
  1880
        
hgs
parents:
diff changeset
  1881
        // And update config... which will leave if the config is invalid
hgs
parents:
diff changeset
  1882
        iEngine.HelperSysMemTracker().SetConfigL( config );
hgs
parents:
diff changeset
  1883
        }
hgs
parents:
diff changeset
  1884
    else if( aFunction == EMemSpyClientServerOpSystemWideMemoryTrackingModeSet)
hgs
parents:
diff changeset
  1885
    	{
hgs
parents:
diff changeset
  1886
		TMemSpyEngineHelperSysMemTrackerConfig config;
hgs
parents:
diff changeset
  1887
		iEngine.HelperSysMemTracker().GetConfig( config );
hgs
parents:
diff changeset
  1888
		
hgs
parents:
diff changeset
  1889
		TPckgBuf<TMemSpyEngineHelperSysMemTrackerConfig::TMemSpyEngineSysMemTrackerMode> mode;
hgs
parents:
diff changeset
  1890
		aMessage.ReadL( 0, mode );
hgs
parents:
diff changeset
  1891
		
hgs
parents:
diff changeset
  1892
		config.iMode = mode();
hgs
parents:
diff changeset
  1893
			
hgs
parents:
diff changeset
  1894
		// And update config... which will leave if the config is invalid
hgs
parents:
diff changeset
  1895
		iEngine.HelperSysMemTracker().SetConfigL( config );
hgs
parents:
diff changeset
  1896
    	}
hgs
parents:
diff changeset
  1897
    
hgs
parents:
diff changeset
  1898
    else if ( aFunction == EMemSpyClientServerOpSwitchOutputSinkTrace )
hgs
parents:
diff changeset
  1899
        {
hgs
parents:
diff changeset
  1900
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSwitchOutputSinkTrace") );
hgs
parents:
diff changeset
  1901
        iEngine.InstallDebugSinkL();
hgs
parents:
diff changeset
  1902
        }
hgs
parents:
diff changeset
  1903
    else if ( aFunction == EMemSpyClientServerOpSwitchOutputSinkFile )
hgs
parents:
diff changeset
  1904
        {
hgs
parents:
diff changeset
  1905
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSwitchOutputSinkFile") );
hgs
parents:
diff changeset
  1906
        // Read file name from message.
hgs
parents:
diff changeset
  1907
        TFileName fileName;
hgs
parents:
diff changeset
  1908
        RBuf buf;
hgs
parents:
diff changeset
  1909
		buf.CleanupClosePushL();
hgs
parents:
diff changeset
  1910
		
hgs
parents:
diff changeset
  1911
		TInt len = aMessage.GetDesLength( 0 );
hgs
parents:
diff changeset
  1912
		if ( len > 0 )
hgs
parents:
diff changeset
  1913
			{
hgs
parents:
diff changeset
  1914
			buf.CreateL( len );
hgs
parents:
diff changeset
  1915
			aMessage.ReadL( 0, buf, 0 );
hgs
parents:
diff changeset
  1916
			
hgs
parents:
diff changeset
  1917
			iEngine.InstallFileSinkL( buf );           
hgs
parents:
diff changeset
  1918
			}
hgs
parents:
diff changeset
  1919
		else
hgs
parents:
diff changeset
  1920
			{
hgs
parents:
diff changeset
  1921
			iEngine.InstallFileSinkL( KNullDesC );
hgs
parents:
diff changeset
  1922
			}
hgs
parents:
diff changeset
  1923
		
hgs
parents:
diff changeset
  1924
		CleanupStack::PopAndDestroy( &buf );
hgs
parents:
diff changeset
  1925
        
hgs
parents:
diff changeset
  1926
        }
hgs
parents:
diff changeset
  1927
    else if ( aFunction == EMemSpyClientServerOpEnumerateKernelContainer )
hgs
parents:
diff changeset
  1928
        {
hgs
parents:
diff changeset
  1929
        const TMemSpyDriverContainerType type = CMemSpyEngineHelperKernelContainers::MapToType( static_cast< TObjectType >( aMessage.Int0() ) );
hgs
parents:
diff changeset
  1930
hgs
parents:
diff changeset
  1931
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpEnumerateKernelContainer - type: %d", type ) );
hgs
parents:
diff changeset
  1932
hgs
parents:
diff changeset
  1933
        CMemSpyEngineGenericKernelObjectList* model = iEngine.HelperKernelContainers().ObjectsForSpecificContainerL( type );
hgs
parents:
diff changeset
  1934
        CleanupStack::PushL( model );
hgs
parents:
diff changeset
  1935
        model->OutputL( iEngine.Sink() );
hgs
parents:
diff changeset
  1936
        CleanupStack::PopAndDestroy( model );
hgs
parents:
diff changeset
  1937
        }
hgs
parents:
diff changeset
  1938
    else if ( aFunction == EMemSpyClientServerOpEnumerateKernelContainerAll )
hgs
parents:
diff changeset
  1939
        {
hgs
parents:
diff changeset
  1940
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpEnumerateKernelContainerAll") );
hgs
parents:
diff changeset
  1941
        CMemSpyEngineGenericKernelObjectContainer* model = iEngine.HelperKernelContainers().ObjectsAllL();
hgs
parents:
diff changeset
  1942
        CleanupStack::PushL( model );
hgs
parents:
diff changeset
  1943
        model->OutputL( iEngine.Sink() );
hgs
parents:
diff changeset
  1944
        CleanupStack::PopAndDestroy( model );
hgs
parents:
diff changeset
  1945
        }
hgs
parents:
diff changeset
  1946
    else if ( aFunction == EMemSpyClientServerOpOpenFiles )
hgs
parents:
diff changeset
  1947
        {
hgs
parents:
diff changeset
  1948
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpOpenFiles") );
hgs
parents:
diff changeset
  1949
        iEngine.ListOpenFilesL();
hgs
parents:
diff changeset
  1950
        }
hgs
parents:
diff changeset
  1951
    else if ( aFunction == EMemSpyClientServerOpDisableAknIconCache )
hgs
parents:
diff changeset
  1952
        {
hgs
parents:
diff changeset
  1953
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpDisableAknIconCache") );
hgs
parents:
diff changeset
  1954
        iEngine.HelperRAM().SetAknIconCacheStatusL( EFalse );
hgs
parents:
diff changeset
  1955
        }
hgs
parents:
diff changeset
  1956
    else if ( aFunction == EMemSpyClientServerOpSummaryInfo )
hgs
parents:
diff changeset
  1957
    	{
hgs
parents:
diff changeset
  1958
		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSummaryInfo") );
hgs
parents:
diff changeset
  1959
		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityGeneralSummary, aMessage);
hgs
parents:
diff changeset
  1960
    	}
hgs
parents:
diff changeset
  1961
    else if ( aFunction == EMemSpyClientServerOpSummaryInfoDetailed )
hgs
parents:
diff changeset
  1962
		{
hgs
parents:
diff changeset
  1963
		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpSummaryInfoDetailed") );
hgs
parents:
diff changeset
  1964
		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityGeneralDetailed, aMessage);
hgs
parents:
diff changeset
  1965
		}
hgs
parents:
diff changeset
  1966
    else if ( aFunction == EMemSpyClientServerOpHeapInfo )
hgs
parents:
diff changeset
  1967
		{
hgs
parents:
diff changeset
  1968
		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpHeapInfo") );
hgs
parents:
diff changeset
  1969
		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityHeapInfo, aMessage);
hgs
parents:
diff changeset
  1970
		}
hgs
parents:
diff changeset
  1971
    else if ( aFunction == EMemSpyClientServerOpHeapCellListing )
hgs
parents:
diff changeset
  1972
		{
hgs
parents:
diff changeset
  1973
		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpHeapCellListing") );
hgs
parents:
diff changeset
  1974
		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityHeapCellListing, aMessage);
hgs
parents:
diff changeset
  1975
		}
hgs
parents:
diff changeset
  1976
    else if ( aFunction == EMemSpyClientServerOpHeapData )
hgs
parents:
diff changeset
  1977
		{
hgs
parents:
diff changeset
  1978
		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpHeapData") );
hgs
parents:
diff changeset
  1979
		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityHeapData, aMessage);
hgs
parents:
diff changeset
  1980
		}
hgs
parents:
diff changeset
  1981
    else if ( aFunction == EMemSpyClientServerOpStackInfo )
hgs
parents:
diff changeset
  1982
		{
hgs
parents:
diff changeset
  1983
		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpStackInfo") );
hgs
parents:
diff changeset
  1984
		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityStackInfo, aMessage);
hgs
parents:
diff changeset
  1985
		}
hgs
parents:
diff changeset
  1986
    else if ( aFunction == EMemSpyClientServerOpStackDataUser )
hgs
parents:
diff changeset
  1987
		{
hgs
parents:
diff changeset
  1988
		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpStackDataUser") );
hgs
parents:
diff changeset
  1989
		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityStackDataUser, aMessage);
hgs
parents:
diff changeset
  1990
		}
hgs
parents:
diff changeset
  1991
    else if ( aFunction == EMemSpyClientServerOpStackDataKernel )
hgs
parents:
diff changeset
  1992
		{
hgs
parents:
diff changeset
  1993
		TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - EMemSpyClientServerOpStackDataKernel") );
hgs
parents:
diff changeset
  1994
		StartDeviceWideOperationL(CMemSpyDeviceWideOperations::EPerEntityStackDataKernel, aMessage);
hgs
parents:
diff changeset
  1995
		}
hgs
parents:
diff changeset
  1996
    else
hgs
parents:
diff changeset
  1997
        {
hgs
parents:
diff changeset
  1998
        TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - [device-wide operation] => invoking UI") );
hgs
parents:
diff changeset
  1999
        iEngine.NotifyClientServerOperationRequestL( aFunction );
hgs
parents:
diff changeset
  2000
        }
hgs
parents:
diff changeset
  2001
    //
hgs
parents:
diff changeset
  2002
    TRACE( RDebug::Printf("[MemSpy] CMemSpyEngineSession::HandleThreadAgnosticOpL() - END" ) );
hgs
parents:
diff changeset
  2003
    }
hgs
parents:
diff changeset
  2004
hgs
parents:
diff changeset
  2005
void CMemSpyEngineSession::StartDeviceWideOperationL(CMemSpyDeviceWideOperations::TOperation aOperation, const RMessage2& aMessage)
hgs
parents:
diff changeset
  2006
	{
hgs
parents:
diff changeset
  2007
	if (Server().CurrentOperationTracker())
hgs
parents:
diff changeset
  2008
		{
hgs
parents:
diff changeset
  2009
		User::Leave(KErrInUse);
hgs
parents:
diff changeset
  2010
		}
hgs
parents:
diff changeset
  2011
	
hgs
parents:
diff changeset
  2012
	Server().SetCurrentOperationTracker(CMemSpyDwOperationTracker::NewL(aOperation, aMessage, Server()));
hgs
parents:
diff changeset
  2013
	}
hgs
parents:
diff changeset
  2014
hgs
parents:
diff changeset
  2015
hgs
parents:
diff changeset
  2016
hgs
parents:
diff changeset
  2017
hgs
parents:
diff changeset
  2018
hgs
parents:
diff changeset
  2019
hgs
parents:
diff changeset
  2020
hgs
parents:
diff changeset
  2021
hgs
parents:
diff changeset
  2022
hgs
parents:
diff changeset
  2023
CMemSpyDwOperationTracker* CMemSpyDwOperationTracker::NewL(CMemSpyDeviceWideOperations::TOperation aOperation, 
hgs
parents:
diff changeset
  2024
		const RMessage2& aOperationMessage, CMemSpyEngineServer& aServer)
hgs
parents:
diff changeset
  2025
	{
hgs
parents:
diff changeset
  2026
	CMemSpyDwOperationTracker* self = new (ELeave) CMemSpyDwOperationTracker(aOperationMessage, aServer);
hgs
parents:
diff changeset
  2027
	CleanupStack::PushL( self );
hgs
parents:
diff changeset
  2028
	self->ConstructL(aOperation);
hgs
parents:
diff changeset
  2029
	CleanupStack::Pop( self );
hgs
parents:
diff changeset
  2030
	return self;
hgs
parents:
diff changeset
  2031
	}
hgs
parents:
diff changeset
  2032
	
hgs
parents:
diff changeset
  2033
CMemSpyDwOperationTracker::~CMemSpyDwOperationTracker()
hgs
parents:
diff changeset
  2034
	{
hgs
parents:
diff changeset
  2035
	delete iOperation;
hgs
parents:
diff changeset
  2036
	delete iPendingNotifications;
hgs
parents:
diff changeset
  2037
	}
hgs
parents:
diff changeset
  2038
hgs
parents:
diff changeset
  2039
CMemSpyDwOperationTracker::CMemSpyDwOperationTracker(const RMessage2& aOperationMessage, CMemSpyEngineServer& aServer) : 
hgs
parents:
diff changeset
  2040
		iOperationMessage(aOperationMessage),
hgs
parents:
diff changeset
  2041
		iServer(aServer),
hgs
parents:
diff changeset
  2042
		iPendingNotifications(0),
hgs
parents:
diff changeset
  2043
		iOperation(0),
hgs
parents:
diff changeset
  2044
		iProgress(0)
hgs
parents:
diff changeset
  2045
	{
hgs
parents:
diff changeset
  2046
	}
hgs
parents:
diff changeset
  2047
hgs
parents:
diff changeset
  2048
hgs
parents:
diff changeset
  2049
void CMemSpyDwOperationTracker::ConstructL(CMemSpyDeviceWideOperations::TOperation aOperation)
hgs
parents:
diff changeset
  2050
	{
hgs
parents:
diff changeset
  2051
	iPendingNotifications = new (ELeave) CArrayFixFlat<RMessage2>(3);
hgs
parents:
diff changeset
  2052
	iOperation = CMemSpyDeviceWideOperations::NewL(iServer.Engine(), *this, aOperation);
hgs
parents:
diff changeset
  2053
	}
hgs
parents:
diff changeset
  2054
hgs
parents:
diff changeset
  2055
void CMemSpyDwOperationTracker::AddNotificationL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  2056
	{
hgs
parents:
diff changeset
  2057
	iPendingNotifications->AppendL(aMessage);
hgs
parents:
diff changeset
  2058
	}
hgs
parents:
diff changeset
  2059
hgs
parents:
diff changeset
  2060
void CMemSpyDwOperationTracker::Cancel()
hgs
parents:
diff changeset
  2061
	{
hgs
parents:
diff changeset
  2062
	iOperation->Cancel();
hgs
parents:
diff changeset
  2063
	}
hgs
parents:
diff changeset
  2064
hgs
parents:
diff changeset
  2065
void CMemSpyDwOperationTracker::HandleDeviceWideOperationEvent(TEvent aEvent, TInt aParam1, const TDesC& aParam2)
hgs
parents:
diff changeset
  2066
	{
hgs
parents:
diff changeset
  2067
	switch( aEvent )
hgs
parents:
diff changeset
  2068
		{
hgs
parents:
diff changeset
  2069
	case MMemSpyDeviceWideOperationsObserver::EOperationCompleted:
hgs
parents:
diff changeset
  2070
	case MMemSpyDeviceWideOperationsObserver::EOperationCancelled:
hgs
parents:
diff changeset
  2071
		iServer.SetCurrentOperationTracker(0);
hgs
parents:
diff changeset
  2072
		
hgs
parents:
diff changeset
  2073
		for (TInt i=0; i<iPendingNotifications->Count(); i++)
hgs
parents:
diff changeset
  2074
			{
hgs
parents:
diff changeset
  2075
			iPendingNotifications->At(i).Complete(KErrCancel);
hgs
parents:
diff changeset
  2076
			}
hgs
parents:
diff changeset
  2077
		
hgs
parents:
diff changeset
  2078
		if (iOperationMessage.Function() & KMemSpyOpFlagsAsyncOperation)
hgs
parents:
diff changeset
  2079
			{
hgs
parents:
diff changeset
  2080
			iOperationMessage.Complete(
hgs
parents:
diff changeset
  2081
				aEvent == MMemSpyDeviceWideOperationsObserver::EOperationCompleted ? KErrNone : KErrCancel);
hgs
parents:
diff changeset
  2082
			}
hgs
parents:
diff changeset
  2083
		
hgs
parents:
diff changeset
  2084
		iPendingNotifications->Reset();
hgs
parents:
diff changeset
  2085
		
hgs
parents:
diff changeset
  2086
		delete this;
hgs
parents:
diff changeset
  2087
		break;
hgs
parents:
diff changeset
  2088
		
hgs
parents:
diff changeset
  2089
	case MMemSpyDeviceWideOperationsObserver::EOperationProgressEnd:
hgs
parents:
diff changeset
  2090
		{
hgs
parents:
diff changeset
  2091
		iProgress += aParam1;
hgs
parents:
diff changeset
  2092
		for (TInt i=0; i<iPendingNotifications->Count(); i++)
hgs
parents:
diff changeset
  2093
			{
hgs
parents:
diff changeset
  2094
			TInt err;
hgs
parents:
diff changeset
  2095
			TRAP(err, iPendingNotifications->At(i).WriteL(0, TPckgBuf<TInt>( iProgress * 100 / iOperation->TotalOperationSize() )));
hgs
parents:
diff changeset
  2096
			TRAP(err, iPendingNotifications->At(i).WriteL(1, aParam2));
hgs
parents:
diff changeset
  2097
			if (err != KErrNone)
hgs
parents:
diff changeset
  2098
				{
hgs
parents:
diff changeset
  2099
				// TODO: iPendingProgressNotifications->At(i).Panic()
hgs
parents:
diff changeset
  2100
				}
hgs
parents:
diff changeset
  2101
			iPendingNotifications->At(i).Complete(KErrNone);
hgs
parents:
diff changeset
  2102
			}
hgs
parents:
diff changeset
  2103
		iPendingNotifications->Reset();
hgs
parents:
diff changeset
  2104
		break;
hgs
parents:
diff changeset
  2105
		}
hgs
parents:
diff changeset
  2106
		
hgs
parents:
diff changeset
  2107
		}
hgs
parents:
diff changeset
  2108
	
hgs
parents:
diff changeset
  2109
	}
62
hgs
parents: 52
diff changeset
  2110
hgs
parents: 52
diff changeset
  2111
hgs
parents: 52
diff changeset
  2112
hgs
parents: 52
diff changeset
  2113
hgs
parents: 52
diff changeset
  2114
hgs
parents: 52
diff changeset
  2115
hgs
parents: 52
diff changeset
  2116
hgs
parents: 52
diff changeset
  2117
hgs
parents: 52
diff changeset
  2118
hgs
parents: 52
diff changeset
  2119
CMemSpyNotificationTracker* CMemSpyNotificationTracker::NewL()
hgs
parents: 52
diff changeset
  2120
    {
hgs
parents: 52
diff changeset
  2121
    CMemSpyNotificationTracker* self = new (ELeave) CMemSpyNotificationTracker();
hgs
parents: 52
diff changeset
  2122
    CleanupStack::PushL( self );
hgs
parents: 52
diff changeset
  2123
    self->ConstructL();
hgs
parents: 52
diff changeset
  2124
    CleanupStack::Pop( self );
hgs
parents: 52
diff changeset
  2125
    return self;
hgs
parents: 52
diff changeset
  2126
    }
hgs
parents: 52
diff changeset
  2127
    
hgs
parents: 52
diff changeset
  2128
CMemSpyNotificationTracker::~CMemSpyNotificationTracker()
hgs
parents: 52
diff changeset
  2129
    {
hgs
parents: 52
diff changeset
  2130
    delete iPendingNotifications;
hgs
parents: 52
diff changeset
  2131
    }
hgs
parents: 52
diff changeset
  2132
hgs
parents: 52
diff changeset
  2133
void CMemSpyNotificationTracker::ConstructL()
hgs
parents: 52
diff changeset
  2134
    {
hgs
parents: 52
diff changeset
  2135
    iPendingNotifications = new (ELeave) CArrayFixFlat<RMessage2>(3);
hgs
parents: 52
diff changeset
  2136
    }
hgs
parents: 52
diff changeset
  2137
hgs
parents: 52
diff changeset
  2138
void CMemSpyNotificationTracker::AddNotificationL( const RMessage2& aMessage )
hgs
parents: 52
diff changeset
  2139
    {
hgs
parents: 52
diff changeset
  2140
    iPendingNotifications->AppendL(aMessage);
hgs
parents: 52
diff changeset
  2141
    }
hgs
parents: 52
diff changeset
  2142
hgs
parents: 52
diff changeset
  2143
void CMemSpyNotificationTracker::CancelNotification( const RMessage2& aMessage )
hgs
parents: 52
diff changeset
  2144
    {
hgs
parents: 52
diff changeset
  2145
    for (TInt i = iPendingNotifications->Count()-1; i >= 0; --i)
hgs
parents: 52
diff changeset
  2146
        {
hgs
parents: 52
diff changeset
  2147
        if (iPendingNotifications->At( i ).Session() == aMessage.Session())
hgs
parents: 52
diff changeset
  2148
            {
hgs
parents: 52
diff changeset
  2149
                iPendingNotifications->At( i ).Complete( KErrCancel );
hgs
parents: 52
diff changeset
  2150
                iPendingNotifications->Delete( i );
hgs
parents: 52
diff changeset
  2151
            }
hgs
parents: 52
diff changeset
  2152
        }
hgs
parents: 52
diff changeset
  2153
    }
hgs
parents: 52
diff changeset
  2154
hgs
parents: 52
diff changeset
  2155
void CMemSpyNotificationTracker::HandleMemSpyEngineEventL( TEvent aEvent, TAny* aContext )
hgs
parents: 52
diff changeset
  2156
    {
hgs
parents: 52
diff changeset
  2157
    switch( aEvent )
hgs
parents: 52
diff changeset
  2158
        {
hgs
parents: 52
diff changeset
  2159
    
hgs
parents: 52
diff changeset
  2160
    case MMemSpyEngineObserver::EHandleThreadsOrProcessesChanged:
hgs
parents: 52
diff changeset
  2161
        {
hgs
parents: 52
diff changeset
  2162
        for (TInt i=0; i<iPendingNotifications->Count(); i++)
hgs
parents: 52
diff changeset
  2163
            {
hgs
parents: 52
diff changeset
  2164
            TRAPD(err, iPendingNotifications->At(i).WriteL(0, TPckgBuf<TInt>( aEvent )));
hgs
parents: 52
diff changeset
  2165
            if (err != KErrNone)
hgs
parents: 52
diff changeset
  2166
                {
hgs
parents: 52
diff changeset
  2167
                // TODO: iPendingProgressNotifications->At(i).Panic()
hgs
parents: 52
diff changeset
  2168
                }
hgs
parents: 52
diff changeset
  2169
            iPendingNotifications->At(i).Complete( KErrNone );
hgs
parents: 52
diff changeset
  2170
            }
hgs
parents: 52
diff changeset
  2171
        iPendingNotifications->Reset();
hgs
parents: 52
diff changeset
  2172
        break;
hgs
parents: 52
diff changeset
  2173
        }
hgs
parents: 52
diff changeset
  2174
        
hgs
parents: 52
diff changeset
  2175
        }
hgs
parents: 52
diff changeset
  2176
    
hgs
parents: 52
diff changeset
  2177
    }