perfsrv/memspy/MemSpyClient/src/memspysession.cpp
changeset 62 1c2bb2fc7c87
parent 54 a151135b0cf9
equal deleted inserted replaced
56:aa2539c91954 62:1c2bb2fc7c87
    31 #include <memspy/engine/memspyserverdata.h>
    31 #include <memspy/engine/memspyserverdata.h>
    32 // ECom
    32 // ECom
    33 #include <memspy/engine/memspyecomdata.h>
    33 #include <memspy/engine/memspyecomdata.h>
    34 // Window groups
    34 // Window groups
    35 #include <memspy/engine/memspyenginehelperwindowserver.h>
    35 #include <memspy/engine/memspyenginehelperwindowserver.h>
       
    36 // Chunks
       
    37 #include <memspy/engine/memspychunkdata.h>
       
    38 // Code Segments
       
    39 #include <memspy/engine/memspycodesegmentdata.h>
    36 
    40 
    37 // IMPLEMENTATION
    41 // IMPLEMENTATION
    38 
    42 
    39 EXPORT_C RMemSpySession::RMemSpySession()
    43 EXPORT_C RMemSpySession::RMemSpySession()
    40     {
    44     {
   108 	{
   112 	{
   109 	TPckgBuf<TInt> count;
   113 	TPckgBuf<TInt> count;
   110 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetProcessCount, TIpcArgs(&count)));
   114 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetProcessCount, TIpcArgs(&count)));
   111 	
   115 	
   112 	TInt requestedCount = count();
   116 	TInt requestedCount = count();
       
   117 
   113 	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyProcessData));
   118 	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyProcessData));
   114 	TPtr8 bufferPtr(buffer->Des());
   119 	TPtr8 bufferPtr(buffer->Des());
   115 	
   120 	
   116 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetProcesses, TIpcArgs(&count, &bufferPtr)));
   121 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetProcesses, TIpcArgs(&count, &bufferPtr)));
   117 	aProcesses.Reset();
   122 	aProcesses.Reset();
   118 	
   123 	
   119 	TInt receivedCount = Min(count(), requestedCount);
   124 	TInt receivedCount = Min(count(), requestedCount);
   120 	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyProcessData))
   125 	for(TInt i=0, offset = 0; i<receivedCount; i++, offset+=sizeof(TMemSpyProcessData))
   121 		{
   126 		{
   122 		TPckgBuf<TMemSpyProcessData> data;
   127 		TPckgBuf<TMemSpyProcessData> data;
   123 		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyProcessData));
   128 		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyProcessData));
   124 		aProcesses.AppendL(CMemSpyApiProcess::NewLC(data()));
   129 		aProcesses.AppendL(CMemSpyApiProcess::NewLC(data()));
   125 		}
   130 		}
   134 			TIpcArgs(&aProcessName, &procId)));
   139 			TIpcArgs(&aProcessName, &procId)));
   135 	
   140 	
   136 	return procId();
   141 	return procId();
   137 	}
   142 	}
   138 
   143 
   139 EXPORT_C TInt RMemSpySession::ProcessSystemPermanentOrCritical( TProcessId aId, TBool aValue )
   144 EXPORT_C TInt RMemSpySession::ProcessSystemPermanentOrCritical( TProcessId aId, TBool& aValue )
   140 	{
   145 	{
   141 	TPckgBuf<TProcessId> arg1( aId );
   146 	TPckgBuf<TProcessId> arg1( aId );
   142 	TPckgBuf<TBool> arg2( aValue );
   147 	TPckgBuf<TBool> arg2( aValue );
   143 	TIpcArgs args( &arg1, &arg2 );
   148 	TIpcArgs args( &arg1, &arg2 );
   144 		
   149 		
   147 	aValue = arg2();
   152 	aValue = arg2();
   148 	
   153 	
   149 	return error;
   154 	return error;
   150 	}
   155 	}
   151 
   156 
       
   157 EXPORT_C void RMemSpySession::NotifyEvent(TRequestStatus &aStatus)
       
   158     {
       
   159     SendReceive(EMemSpyClientServerOpNotifyEvent | KMemSpyOpFlagsAsyncOperation,
       
   160             TIpcArgs(), aStatus);
       
   161     }
       
   162 
       
   163 EXPORT_C void RMemSpySession::CancelEventNotificationL()
       
   164     {
       
   165     User::LeaveIfError(SendReceive(EMemSpyClientServerOpCancelEventNotification));
       
   166     }
       
   167 
   152 EXPORT_C TInt RMemSpySession::EndProcessL( TProcessId aId, TMemSpyEndType aType )
   168 EXPORT_C TInt RMemSpySession::EndProcessL( TProcessId aId, TMemSpyEndType aType )
   153 	{
   169 	{
   154 	TPckgBuf<TProcessId> arg1( aId );
   170 	TPckgBuf<TProcessId> arg1( aId );
   155 	TPckgBuf<TMemSpyEndType> arg2( aType );
   171 	TPckgBuf<TMemSpyEndType> arg2( aType );
   156 	TIpcArgs args( &arg1, &arg2 );
   172 	TIpcArgs args( &arg1, &arg2 );
   177 	TPckgBuf<TInt> count;
   193 	TPckgBuf<TInt> count;
   178 	TPckgBuf<TProcessId> pid(aProcessId);
   194 	TPckgBuf<TProcessId> pid(aProcessId);
   179 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetThreadCount, TIpcArgs(&count, &pid)));
   195 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetThreadCount, TIpcArgs(&count, &pid)));
   180 	
   196 	
   181 	TInt requestedCount = count();
   197 	TInt requestedCount = count();
       
   198 
   182 	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyThreadData));
   199 	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyThreadData));
   183 	TPtr8 bufferPtr(buffer->Des());
   200 	TPtr8 bufferPtr(buffer->Des());
   184 	
   201 	
   185 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetThreads, TIpcArgs(&count, &bufferPtr, &pid)));
   202 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetThreads, TIpcArgs(&count, &bufferPtr, &pid)));
   186 	aThreads.Reset();
   203 	aThreads.Reset();
   187 	
   204 	
   188 	TInt receivedCount = Min(count(), requestedCount);
   205 	TInt receivedCount = Min(count(), requestedCount);
   189 	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyThreadData))
   206 	for(TInt i=0, offset = 0; i<receivedCount; i++, offset+=sizeof(TMemSpyThreadData))
   190 		{
   207 		{
   191 		TPckgBuf<TMemSpyThreadData> data;
   208 		TPckgBuf<TMemSpyThreadData> data;
   192 		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyThreadData));
   209 		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyThreadData));
   193 		aThreads.AppendL(CMemSpyApiThread::NewLC(data()));
   210 		aThreads.AppendL(CMemSpyApiThread::NewLC(data()));
   194 		}
   211 		}
   316 	{		
   333 	{		
   317 	TPckgBuf<TInt> count;
   334 	TPckgBuf<TInt> count;
   318 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectCount, TIpcArgs(&count) ));
   335 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectCount, TIpcArgs(&count) ));
   319 	
   336 	
   320 	TInt requestedCount = count();
   337 	TInt requestedCount = count();
       
   338 
   321 	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyKernelObjectData));
   339 	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyKernelObjectData));
   322 	TPtr8 bufferPtr(buffer->Des());
   340 	TPtr8 bufferPtr(buffer->Des());
   323 		
   341 		
   324 	TIpcArgs args( &count, &bufferPtr );
   342 	TIpcArgs args( &count, &bufferPtr );
   325 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjects, args ));
   343 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjects, args ));
   326 	
   344 	
   327 	aKernelObjects.Reset();
   345 	aKernelObjects.Reset();
   328 	
   346 	
   329 	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyKernelObjectData))
   347 	TInt receivedCount = Min(count(), requestedCount);
       
   348 
       
   349 	for(TInt i=0, offset = 0; i<receivedCount; i++, offset+=sizeof(TMemSpyKernelObjectData))
   330 		{
   350 		{
   331 		TPckgBuf<TMemSpyKernelObjectData> data;
   351 		TPckgBuf<TMemSpyKernelObjectData> data;
   332 		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyKernelObjectData));
   352 		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyKernelObjectData));
   333 		aKernelObjects.AppendL(CMemSpyApiKernelObject::NewLC(data()));
   353 		aKernelObjects.AppendL(CMemSpyApiKernelObject::NewLC(data()));
   334 		}
   354 		}
   348 	TPckgBuf<TInt> count;
   368 	TPckgBuf<TInt> count;
   349 	TPckgBuf<TMemSpyDriverContainerType> type(aForContainer);
   369 	TPckgBuf<TMemSpyDriverContainerType> type(aForContainer);
   350 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectItemCount, TIpcArgs(&count, &type) ));
   370 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectItemCount, TIpcArgs(&count, &type) ));
   351 
   371 
   352 	TInt requestedCount = count();
   372 	TInt requestedCount = count();
       
   373 	
   353 	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyDriverHandleInfoGeneric));
   374 	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyDriverHandleInfoGeneric));
   354 	TPtr8 bufferPtr(buffer->Des());
   375 	TPtr8 bufferPtr(buffer->Des());
   355 	
   376 	
   356 	TIpcArgs args( &count, &type, &bufferPtr );
   377 	TIpcArgs args( &count, &type, &bufferPtr );
   357 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectItems, args ));
   378 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetKernelObjectItems, args ));
   358 	
   379 	
   359 	aKernelObjectItems.Reset();
   380 	aKernelObjectItems.Reset();
   360 	
   381 
   361 	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyDriverHandleInfoGeneric))
   382 	TInt receivedCount = Min(count(), requestedCount);	
       
   383 	
       
   384 	for(TInt i=0, offset = 0; i<receivedCount; i++, offset+=sizeof(TMemSpyDriverHandleInfoGeneric))
   362 		{
   385 		{
   363 		TPckgBuf<TMemSpyDriverHandleInfoGeneric> data;
   386 		TPckgBuf<TMemSpyDriverHandleInfoGeneric> data;
   364 		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyDriverHandleInfoGeneric));
   387 		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyDriverHandleInfoGeneric));
   365 		aKernelObjectItems.AppendL( CMemSpyApiKernelObjectItem::NewLC( data() ) );
   388 		aKernelObjectItems.AppendL( CMemSpyApiKernelObjectItem::NewLC( data() ) );
   366 		}
   389 		}
   378 	{
   401 	{
   379 	TPckgBuf<TInt> count;
   402 	TPckgBuf<TInt> count;
   380 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetMemoryTrackingCycleCount, TIpcArgs(&count) ));
   403 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetMemoryTrackingCycleCount, TIpcArgs(&count) ));
   381 	
   404 	
   382 	TInt requestedCount = count();
   405 	TInt requestedCount = count();
       
   406 
   383 	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyMemoryTrackingCycleData));
   407 	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyMemoryTrackingCycleData));
   384 	TPtr8 bufferPtr(buffer->Des());
   408 	TPtr8 bufferPtr(buffer->Des());
   385 		
   409 		
   386 	TIpcArgs args( &count, &bufferPtr );
   410 	TIpcArgs args( &count, &bufferPtr );
   387 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetMemoryTrackingCycles, args ));
   411 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetMemoryTrackingCycles, args ));
   388 	
   412 	
   389 	aCycles.Reset();
   413 	aCycles.Reset();
   390 	
   414 	
   391 	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyMemoryTrackingCycleData))
   415 	TInt receivedCount = Min(count(), requestedCount);
       
   416 
       
   417 	for(TInt i=0, offset = 0; i<receivedCount; i++, offset+=sizeof(TMemSpyMemoryTrackingCycleData))
   392 		{
   418 		{
   393 		TPckgBuf<TMemSpyMemoryTrackingCycleData> data;
   419 		TPckgBuf<TMemSpyMemoryTrackingCycleData> data;
   394 		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyMemoryTrackingCycleData));
   420 		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyMemoryTrackingCycleData));
   395 		aCycles.AppendL(CMemSpyApiMemoryTrackingCycle::NewLC(data()));
   421 		aCycles.AppendL(CMemSpyApiMemoryTrackingCycle::NewLC(data()));
   396 		}
   422 		}
   406 
   432 
   407 
   433 
   408 //Heap specific operations
   434 //Heap specific operations
   409 
   435 
   410 EXPORT_C CMemSpyApiHeap* RMemSpySession::GetHeapL()
   436 EXPORT_C CMemSpyApiHeap* RMemSpySession::GetHeapL()
   411 	{
   437 	{	
   412 	CMemSpyApiHeap* aHeap;
       
   413 	
       
   414 	HBufC8* buffer = HBufC8::NewLC( sizeof(TMemSpyHeapData) );
   438 	HBufC8* buffer = HBufC8::NewLC( sizeof(TMemSpyHeapData) );
   415 	TPtr8 bufferPtr(buffer->Des());
   439 	TPtr8 bufferPtr(buffer->Des());
   416 	TIpcArgs args( &bufferPtr );
   440 	TIpcArgs args( &bufferPtr );
   417 	
   441 	
   418 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetHeap, args ));
   442 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpGetHeap, args ));
   419 	
   443 	
   420 	TPckgBuf<TMemSpyHeapData> data;
   444 	TPckgBuf<TMemSpyHeapData> data;
   421 	data.Copy(bufferPtr.Ptr(), sizeof(TMemSpyHeapData));		
   445 	data.Copy(bufferPtr.Ptr(), sizeof(TMemSpyHeapData));		
   422 	aHeap = CMemSpyApiHeap::NewL( data() );
   446 	CMemSpyApiHeap* heap = CMemSpyApiHeap::NewL( data() );
   423 	
   447 	
   424 	CleanupStack::PopAndDestroy(buffer);
   448 	CleanupStack::PopAndDestroy(buffer);
   425 		
   449 		
   426 	return aHeap;
   450 	return heap;
   427 	}
   451 	}
   428 
   452 
   429 EXPORT_C CMemSpyApiHeap* RMemSpySession::GetHeap()
   453 EXPORT_C CMemSpyApiHeap* RMemSpySession::GetHeap()
   430 	{
   454 	{
   431 	CMemSpyApiHeap *result = NULL;
   455 	CMemSpyApiHeap *result = NULL;
   439     {
   463     {
   440     TPckgBuf<TInt> count;
   464     TPckgBuf<TInt> count;
   441     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComCategoryCount, TIpcArgs(&count)));
   465     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComCategoryCount, TIpcArgs(&count)));
   442     
   466     
   443     TInt requestedCount = count();
   467     TInt requestedCount = count();
       
   468  
   444     HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyEComCategoryData));
   469     HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyEComCategoryData));
   445     TPtr8 bufferPtr(buffer->Des());
   470     TPtr8 bufferPtr(buffer->Des());
   446     
   471     
   447     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComCategories, TIpcArgs(&count, &bufferPtr)));
   472     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComCategories, TIpcArgs(&count, &bufferPtr)));
   448     aCategories.Reset();
   473     aCategories.Reset();
   449     
   474     
   450     TInt receivedCount = Min(count(), requestedCount);
   475     TInt receivedCount = Min(count(), requestedCount);
   451     for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyEComCategoryData))
   476     for(TInt i=0, offset = 0; i<receivedCount; i++, offset+=sizeof(TMemSpyEComCategoryData))
   452         {
   477         {
   453         TPckgBuf<TMemSpyEComCategoryData> data;
   478         TPckgBuf<TMemSpyEComCategoryData> data;
   454         data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyEComCategoryData));
   479         data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyEComCategoryData));
   455         aCategories.AppendL(CMemSpyApiEComCategory::NewLC(data()));
   480         aCategories.AppendL(CMemSpyApiEComCategory::NewLC(data()));
   456         }
   481         }
   463     TPckgBuf<TInt> count;
   488     TPckgBuf<TInt> count;
   464     TPckgBuf<TUid> category(aCategory);
   489     TPckgBuf<TUid> category(aCategory);
   465     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComInterfaceCount, TIpcArgs(&count, &category)));
   490     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComInterfaceCount, TIpcArgs(&count, &category)));
   466     
   491     
   467     TInt requestedCount = count();
   492     TInt requestedCount = count();
       
   493 
   468     HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyEComInterfaceData));
   494     HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyEComInterfaceData));
   469     TPtr8 bufferPtr(buffer->Des());
   495     TPtr8 bufferPtr(buffer->Des());
   470     
   496     
   471     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComInterfaces, TIpcArgs(&count, &category, &bufferPtr)));
   497     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComInterfaces, TIpcArgs(&count, &category, &bufferPtr)));
   472     aInterfaces.Reset();
   498     aInterfaces.Reset();
   473     
   499     
   474     TInt receivedCount = Min(count(), requestedCount);
   500     TInt receivedCount = Min(count(), requestedCount);
   475     for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyEComInterfaceData))
   501     for(TInt i=0, offset = 0; i<receivedCount; i++, offset+=sizeof(TMemSpyEComInterfaceData))
   476         {
   502         {
   477         TPckgBuf<TMemSpyEComInterfaceData> data;
   503         TPckgBuf<TMemSpyEComInterfaceData> data;
   478         data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyEComInterfaceData));
   504         data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyEComInterfaceData));
   479         aInterfaces.AppendL(CMemSpyApiEComInterface::NewLC(data()));
   505         aInterfaces.AppendL(CMemSpyApiEComInterface::NewLC(data()));
   480         }
   506         }
   487     TPckgBuf<TInt> count;
   513     TPckgBuf<TInt> count;
   488     TPckgBuf<TUid> interface(aInterface);
   514     TPckgBuf<TUid> interface(aInterface);
   489     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComImplementationCount, TIpcArgs(&count, &interface)));
   515     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComImplementationCount, TIpcArgs(&count, &interface)));
   490     
   516     
   491     TInt requestedCount = count();
   517     TInt requestedCount = count();
       
   518 
   492     HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyEComImplementationData));
   519     HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyEComImplementationData));
   493     TPtr8 bufferPtr(buffer->Des());
   520     TPtr8 bufferPtr(buffer->Des());
   494     
   521     
   495     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComImplementations, TIpcArgs(&count, &interface, &bufferPtr)));
   522     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetEComImplementations, TIpcArgs(&count, &interface, &bufferPtr)));
   496     aImplementations.Reset();
   523     aImplementations.Reset();
   497     
   524     
   498     TInt receivedCount = Min(count(), requestedCount);
   525     TInt receivedCount = Min(count(), requestedCount);
   499     for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyEComImplementationData))
   526     for(TInt i=0, offset = 0; i<receivedCount; i++, offset+=sizeof(TMemSpyEComImplementationData))
   500         {
   527         {
   501         TPckgBuf<TMemSpyEComImplementationData> data;
   528         TPckgBuf<TMemSpyEComImplementationData> data;
   502         data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyEComImplementationData));
   529         data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyEComImplementationData));
   503         aImplementations.AppendL(CMemSpyApiEComImplementation::NewLC(data()));
   530         aImplementations.AppendL(CMemSpyApiEComImplementation::NewLC(data()));
   504         }
   531         }
   510     {
   537     {
   511     TPckgBuf<TInt> count;
   538     TPckgBuf<TInt> count;
   512     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetWindowGroupCount, TIpcArgs(&count)));
   539     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetWindowGroupCount, TIpcArgs(&count)));
   513     
   540     
   514     TInt requestedCount = count();
   541     TInt requestedCount = count();
       
   542 
   515     HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyEngineWindowGroupDetails));
   543     HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyEngineWindowGroupDetails));
   516     TPtr8 bufferPtr(buffer->Des());
   544     TPtr8 bufferPtr(buffer->Des());
   517     
   545     
   518     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetWindowGroups, TIpcArgs(&count, &bufferPtr)));
   546     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetWindowGroups, TIpcArgs(&count, &bufferPtr)));
   519     aGroups.Reset();
   547     aGroups.Reset();
   520     
   548     
   521     TInt receivedCount = Min(count(), requestedCount);
   549     TInt receivedCount = Min(count(), requestedCount);
   522     for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyEngineWindowGroupDetails))
   550     for(TInt i=0, offset = 0; i<receivedCount; i++, offset+=sizeof(TMemSpyEngineWindowGroupDetails))
   523         {
   551         {
   524         TPckgBuf<TMemSpyEngineWindowGroupDetails> data;
   552         TPckgBuf<TMemSpyEngineWindowGroupDetails> data;
   525         data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyEngineWindowGroupDetails));
   553         data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyEngineWindowGroupDetails));
   526         aGroups.AppendL(CMemSpyApiWindowGroup::NewLC(data()));
   554         aGroups.AppendL(CMemSpyApiWindowGroup::NewLC(data()));
   527         }
   555         }
   528     CleanupStack::Pop(aGroups.Count());
   556     CleanupStack::Pop(aGroups.Count());
   529     CleanupStack::PopAndDestroy(buffer);
   557     CleanupStack::PopAndDestroy(buffer);
   530     }
   558     }
   531 
   559 
       
   560 EXPORT_C void RMemSpySession::SwitchToWindowGroupL( TInt aId )
       
   561 	{
       
   562     TPckgBuf<TInt> id( aId );
       
   563     TIpcArgs args(&id);
       
   564 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpSwitchToWindowGroup, args));
       
   565 	}
       
   566 
   532 EXPORT_C void RMemSpySession::DumpKernelHeap()
   567 EXPORT_C void RMemSpySession::DumpKernelHeap()
   533 	{
   568 	{
   534 	SendReceive( EMemSpyClientServerOpDumpKernelHeap );
   569 	SendReceive( EMemSpyClientServerOpDumpKernelHeap );
   535 	}
   570 	}
   536 
   571 
   887     {
   922     {
   888     TPckgBuf<TInt> count;
   923     TPckgBuf<TInt> count;
   889     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetServerCount, TIpcArgs(&count)));
   924     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetServerCount, TIpcArgs(&count)));
   890     
   925     
   891     TInt requestedCount = count();
   926     TInt requestedCount = count();
       
   927     
       
   928     if( requestedCount < 0 )
       
   929     	requestedCount = 0;
       
   930     	
   892     HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyServerData));
   931     HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyServerData));
   893     TPtr8 bufferPtr(buffer->Des());
   932     TPtr8 bufferPtr(buffer->Des());
   894     
   933     
   895     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetServers, TIpcArgs(&count, &bufferPtr)));
   934     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetServers, TIpcArgs(&count, &bufferPtr)));
   896     aServers.Reset();
   935     aServers.Reset();
   911 	TPckgBuf<TInt> count;
   950 	TPckgBuf<TInt> count;
   912 	TPckgBuf<TSortType> sort( aSortType );
   951 	TPckgBuf<TSortType> sort( aSortType );
   913 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetServerCount, TIpcArgs(&count)));
   952 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetServerCount, TIpcArgs(&count)));
   914 	    	
   953 	    	
   915 	TInt requestedCount = count();
   954 	TInt requestedCount = count();
       
   955 
   916 	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyServerData));
   956 	HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyServerData));
   917 	TPtr8 bufferPtr(buffer->Des());
   957 	TPtr8 bufferPtr(buffer->Des());
   918 	    
   958 	    
   919 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetSortedServers, TIpcArgs(&count, &bufferPtr, &sort)));
   959 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetSortedServers, TIpcArgs(&count, &bufferPtr, &sort)));
   920 	aServers.Reset();
   960 	aServers.Reset();
   921 	    
   961 	    
   922 	TInt receivedCount = Min(count(), requestedCount);
   962 	TInt receivedCount = Min(count(), requestedCount);
   923 	for(TInt i=0, offset = 0; i<requestedCount; i++, offset+=sizeof(TMemSpyServerData))
   963 	for(TInt i=0, offset = 0; i<receivedCount; i++, offset+=sizeof(TMemSpyServerData))
   924 		{
   964 		{
   925 		TPckgBuf<TMemSpyServerData> data;
   965 		TPckgBuf<TMemSpyServerData> data;
   926 		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyServerData));
   966 		data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyServerData));
   927 		aServers.AppendL(CMemSpyApiServer::NewLC(data()));
   967 		aServers.AppendL(CMemSpyApiServer::NewLC(data()));
   928 		}
   968 		}
   935 	TPckgBuf<TBool> detailed( aDetailed );
   975 	TPckgBuf<TBool> detailed( aDetailed );
   936 	TIpcArgs args( &detailed );
   976 	TIpcArgs args( &detailed );
   937 	User::LeaveIfError( SendReceive( EMemSpyClientServerOpServerListOutputGeneric, args ) );
   977 	User::LeaveIfError( SendReceive( EMemSpyClientServerOpServerListOutputGeneric, args ) );
   938 	}
   978 	}
   939 
   979 
       
   980 // Chunks
       
   981 
       
   982 EXPORT_C void RMemSpySession::GetChunksL(RArray<CMemSpyApiChunk*> &aChunks, TSortType aSortType)
       
   983     {
       
   984     TPckgBuf<TInt> count;
       
   985     TPckgBuf<TSortType> sort( aSortType );
       
   986     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetChunksCount, TIpcArgs(&count)));
       
   987             
       
   988     TInt requestedCount = count();
       
   989 
       
   990     HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyChunkData));
       
   991     TPtr8 bufferPtr(buffer->Des());
       
   992         
       
   993     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetSortedChunks, TIpcArgs(&count, &bufferPtr, &sort)));
       
   994     aChunks.Reset();
       
   995         
       
   996     TInt receivedCount = Min(count(), requestedCount);
       
   997     for(TInt i=0, offset = 0; i<receivedCount; i++, offset+=sizeof(TMemSpyChunkData))
       
   998         {
       
   999         TPckgBuf<TMemSpyChunkData> data;
       
  1000         data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyChunkData));
       
  1001         aChunks.AppendL(CMemSpyApiChunk::NewLC(data()));
       
  1002         }
       
  1003     CleanupStack::Pop(aChunks.Count());
       
  1004     CleanupStack::PopAndDestroy(buffer);    
       
  1005     }
       
  1006 
       
  1007 EXPORT_C void RMemSpySession::ChunkListOutputL()
       
  1008 	{
       
  1009 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpChunkListOutput));
       
  1010 	}
       
  1011 
       
  1012 // RAM info
       
  1013 EXPORT_C void RMemSpySession::IsAknIconCacheConfigurable( TBool& aValue )
       
  1014 	{
       
  1015 	TPckgBuf<TBool> arg( aValue );
       
  1016 	TIpcArgs args( &arg );
       
  1017 			
       
  1018 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpIsAknIconCacheConfigurable, args ));
       
  1019 		
       
  1020 	aValue = arg();
       
  1021 	}
       
  1022 
       
  1023 EXPORT_C void RMemSpySession::SetAknIconCacheStatusL( TBool aEnabled, TInt64& aValue )
       
  1024 	{
       
  1025 	TPckgBuf<TBool> arg1( aEnabled );
       
  1026 	TPckgBuf<TInt64> arg2( aValue );
       
  1027 	TIpcArgs args( &arg1, &arg2 );
       
  1028 	
       
  1029 	User::LeaveIfError(SendReceive( EMemSpyClientServerOpSetAknIconCacheStatus, args ));
       
  1030 	
       
  1031 	aValue=arg2();
       
  1032 	}
       
  1033 
       
  1034 // Code Segments
       
  1035 EXPORT_C void RMemSpySession::GetCodeSegmentsL(RArray<CMemSpyApiCodeSegment*> &aCodeSegments, TSortType aSortType)
       
  1036 	{
       
  1037     TPckgBuf<TInt> count;
       
  1038     TPckgBuf<TSortType> sort( aSortType );
       
  1039     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetCodeSegmentsCount, TIpcArgs(&count)));
       
  1040             
       
  1041     TInt requestedCount = count();
       
  1042 
       
  1043     HBufC8* buffer = HBufC8::NewLC(requestedCount * sizeof(TMemSpyCodeSegmentData));
       
  1044     TPtr8 bufferPtr(buffer->Des());
       
  1045         
       
  1046     User::LeaveIfError(SendReceive(EMemSpyClientServerOpGetSortedCodeSegments, TIpcArgs(&count, &bufferPtr, &sort)));
       
  1047     aCodeSegments.Reset();
       
  1048         
       
  1049     TInt receivedCount = Min(count(), requestedCount);
       
  1050     for(TInt i=0, offset = 0; i<receivedCount; i++, offset+=sizeof(TMemSpyCodeSegmentData))
       
  1051         {
       
  1052         TPckgBuf<TMemSpyCodeSegmentData> data;
       
  1053         data.Copy(bufferPtr.Ptr()+offset, sizeof(TMemSpyCodeSegmentData));
       
  1054         aCodeSegments.AppendL(CMemSpyApiCodeSegment::NewLC(data()));
       
  1055         }
       
  1056     CleanupStack::Pop(aCodeSegments.Count());
       
  1057     CleanupStack::PopAndDestroy(buffer);	
       
  1058 	}
       
  1059 
       
  1060 EXPORT_C void RMemSpySession::CodeSegmentsListOutputL()
       
  1061 	{
       
  1062 	User::LeaveIfError(SendReceive(EMemSpyClientServerOpCodeSegmentsOutput));
       
  1063 	}
       
  1064