diff -r 67c6ff54ec25 -r a009639409f5 memspy/Engine/Source/ClientServer/MemSpyEngineServer.cpp --- a/memspy/Engine/Source/ClientServer/MemSpyEngineServer.cpp Fri May 14 17:25:03 2010 +0300 +++ b/memspy/Engine/Source/ClientServer/MemSpyEngineServer.cpp Thu May 27 14:26:55 2010 +0300 @@ -19,6 +19,9 @@ // System includes #include +#include +#include +#include // User includes #include @@ -38,6 +41,12 @@ #include #include #include +#include + +#include +#include +#include +#include CMemSpyEngineServer::CMemSpyEngineServer( CMemSpyEngine& aEngine ) @@ -167,8 +176,551 @@ TRACE( RDebug::Print( _L("[MemSpy] CMemSpyEngineSession::ServiceL() - END - this: 0x%08x, fn: 0x%08x, id: %4d, client: %S"), this, aMessage.Function(), iClientThreadId, iClientThreadName ) ); } +// --------------------------------------------------------- +// DoServiceL( const RMessage2& aMessage ) +// --------------------------------------------------------- +// +void CMemSpyEngineSession::DoServiceL( const RMessage2& aMessage ) + { + TInt function = aMessage.Function() & KMemSpyOpFlagsTypeMask; + if (function >= EMemSpyClientServerOpMarkerUiFirst && + function < EMemSpyClientServerOpMarkerUiLast) + + DoUiServiceL(aMessage); + else + DoCmdServiceL(aMessage); + } -void CMemSpyEngineSession::DoServiceL( const RMessage2& aMessage ) +// --------------------------------------------------------- +// DoUiServiceL( const RMessage2& aMessage ) +// --------------------------------------------------------- +// +void CMemSpyEngineSession::DoUiServiceL( const RMessage2& aMessage ) + { + switch (aMessage.Function() & KMemSpyOpFlagsTypeMask) + { + case EMemSpyClientServerOpGetProcessCount: + { + aMessage.WriteL(0, TPckgBuf(iEngine.Container().Count())); + break; + } + case EMemSpyClientServerOpGetProcesses: + { + CMemSpyEngineObjectContainer& list = iEngine.Container(); + + TPckgBuf a0; + aMessage.ReadL(0, a0); + TInt realCount = Min(a0(), list.Count()); + + for(TInt i=0, offset = 0; i buffer(data); + aMessage.WriteL(1, buffer, offset); + } + + a0 = list.Count(); + aMessage.WriteL(0, a0); + + break; + } + case EMemSpyClienServerOpGetProcessIdByName: + { + TFullName processName; + aMessage.ReadL(0, processName); + + TBool found(EFalse); + + for (TInt i=0; i= 0) + { + found = ETrue; + TPckgBuf procId(process.Id()); + aMessage.WriteL(1, procId); + } + } + + if (!found) + { + User::Leave(KErrNotFound); + } + + break; + } + case EMemSpyClientServerOpProcessSystemPermanentOrCritical: + { + TBool ret = EFalse; + TPckgBuf id; + aMessage.ReadL( 0, id ); + + CMemSpyEngineObjectContainer& container = iEngine.Container(); + CMemSpyProcess& process = container.ProcessByIdL( id() ); + + process.Open(); + + if ( process.IsSystemPermanent() || process.IsSystemCritical() ) + { + ret = ETrue; + } + TPckgBuf retBuf( ret ); + aMessage.WriteL( 1, retBuf ); + + break; + } + case EMemSpyClientServerOpEndProcess: + { + TPckgBuf id; + aMessage.ReadL( 0, id ); + TPckgBuf type; + aMessage.ReadL( 1, type ); + + CMemSpyEngineObjectContainer& container = iEngine.Container(); + CMemSpyProcess& process = container.ProcessByIdL( id() ); + + switch ( type() ) + { + case ETerminate: + { + process.TerminateL(); + break; + } + case EPanic: + { + process.PanicL(); + break; + } + case EKill: + { + process.KillL(); + break; + } + } + break; + } + case EMemSpyClientServerOpSwitchToProcess: + {/* + TInt wgCount; + RWsSession wsSession; + User::LeaveIfError( wsSession.Connect() ); + CleanupClosePushL( wsSession ); + User::LeaveIfError( wgCount = wsSession.NumWindowGroups() ); + RArray wgArray; + CleanupClosePushL( wgArray ); + User::LeaveIfError( wsSession.WindowGroupList( &wgArray ) ); + TApaTask task( wsSession ); + TBool brought( EFalse ); + TInt wgId( KErrNotFound ); + TThreadId threadId; + + TPckgBuf id; + aMessage.ReadL( 0, id ); + CMemSpyEngineObjectContainer& container = iEngine.Container(); + CMemSpyProcess& process = container.ProcessByIdL( id() ); + + // loop trough threads in a process + for ( TInt i = 0; i < process.MdcaCount(); i++ ) + { + TInt wgCountLocal = wgCount; + + // loop trough all window groups and see if a thread id matches + while( !brought && wgCountLocal-- ) + { + wgId = wgArray[wgCountLocal].iId; + User::LeaveIfError( wsSession.GetWindowGroupClientThreadId( wgId, threadId ) ); + if ( threadId == process.At( i ).Id() ) + { + CApaWindowGroupName* wgName = CApaWindowGroupName::NewLC( wsSession, wgId ); + task.SetWgId( wgId ); + if ( !wgName->Hidden() && task.Exists() ) + { + task.BringToForeground(); + brought = ETrue; + } + CleanupStack::PopAndDestroy( wgName ); + } + } + } + + TPckgBuf ret( brought ); + aMessage.WriteL( 1, ret ); + + break;*/ + } + case EMemSpyClientServerOpGetThreadCount: + { + TPckgBuf pid; + aMessage.ReadL(1, pid); + CMemSpyProcess& process = iEngine.Container().ProcessByIdL(pid()); + process.Open(); + aMessage.WriteL(0, TPckgBuf(process.Count())); + process.Close(); + break; + } + case EMemSpyClientServerOpGetThreads: + { + TPckgBuf pid; + aMessage.ReadL(2, pid); + + CMemSpyProcess& list = iEngine.Container().ProcessByIdL(pid()); + list.Open(); + + TPckgBuf a0; + aMessage.ReadL(0, a0); + TInt realCount = Min(a0(), list.Count()); + + for(TInt i=0, offset = 0; i buffer(data); + aMessage.WriteL(1, buffer, offset); + + thread.Close(); + } + + a0 = list.Count(); + aMessage.WriteL(0, a0); + + list.Close(); + + break; + } + case EMemSpyClientServerOpSetThreadPriority: + { + TPckgBuf tid; + TPckgBuf priority; + aMessage.ReadL(0, tid); + aMessage.ReadL(1, priority); + + CMemSpyProcess* process = NULL; + CMemSpyThread* thread = NULL; + User::LeaveIfError(iEngine.Container().ProcessAndThreadByThreadId(tid(), process, thread)); + + if (thread) + { + thread->Open(); + thread->SetPriorityL(static_cast(priority())); + thread->Close(); + } + break; + } + case EMemSpyClientServerOpThreadSystemPermanentOrCritical: + { + TBool ret = EFalse; + TPckgBuf id; + aMessage.ReadL( 0, id ); + + CMemSpyEngineObjectContainer& container = iEngine.Container(); + CMemSpyProcess* process = NULL; + CMemSpyThread* thread = NULL; + User::LeaveIfError( container.ProcessAndThreadByThreadId( id(), process, thread ) ); + + if ( thread ) + { + thread->Open(); + + if ( thread->IsSystemPermanent() || thread->IsSystemCritical() ) + { + ret = ETrue; + } + thread->Close(); + } + TPckgBuf retBuf( ret ); + aMessage.WriteL( 1, retBuf ); + + break; + } + case EMemSpyClientServerOpEndThread: + { + TPckgBuf id; + aMessage.ReadL( 0, id ); + TPckgBuf type; + aMessage.ReadL( 1, type ); + + CMemSpyEngineObjectContainer& container = iEngine.Container(); + CMemSpyProcess* process = NULL; + CMemSpyThread* thread = NULL; + User::LeaveIfError( container.ProcessAndThreadByThreadId( id(), process, thread ) ); + + if( thread ) + { + switch ( type() ) + { + case ETerminate: + { + thread->TerminateL(); + break; + } + case EPanic: + { + thread->PanicL(); + break; + } + case EKill: + { + thread->KillL(); + break; + } + } + } + break; + } + case EMemSpyClientServerOpSwitchToThread: + { + TInt wgCount; + RWsSession wsSession; + User::LeaveIfError( wsSession.Connect() ); + CleanupClosePushL( wsSession ); + User::LeaveIfError( wgCount = wsSession.NumWindowGroups() ); + RArray wgArray; + CleanupClosePushL( wgArray ); + User::LeaveIfError( wsSession.WindowGroupList( &wgArray ) ); + TApaTask task( wsSession ); + TBool brought( EFalse ); + TInt wgId( KErrNotFound ); + TThreadId threadId; + + TPckgBuf id; + aMessage.ReadL( 0, id ); + + // loop trough all window groups and see if a thread id matches + while( !brought && wgCount-- ) + { + wgId = wgArray[wgCount].iId; + User::LeaveIfError( wsSession.GetWindowGroupClientThreadId( wgId, threadId ) ); + if ( threadId == id() ) + { + CApaWindowGroupName* wgName = CApaWindowGroupName::NewLC( wsSession, wgId ); + task.SetWgId( wgId ); + if ( !wgName->Hidden() && task.Exists() ) + { + task.BringToForeground(); + brought = ETrue; + } + CleanupStack::PopAndDestroy( wgName ); + } + } + TPckgBuf ret( brought ); + aMessage.WriteL( 1, ret ); + + break; + } + case EMemSpyClientServerOpGetInfoItemType: + { + TPckgBuf index; + aMessage.ReadL( 0, index ); + TPckgBuf id; + aMessage.ReadL( 1, id); + + CMemSpyEngineObjectContainer& container = iEngine.Container(); + CMemSpyProcess* process = NULL; //not needed + CMemSpyThread* thread = NULL; + User::LeaveIfError( container.ProcessAndThreadByThreadId( id(), process, thread ) ); + + thread->Open(); + process->Open(); + + CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL(); + TMemSpyThreadInfoItemType retType = threadInfoContainer.Item( index() ).Type(); + + TPckgBuf ret( retType ); + aMessage.WriteL( 2, ret ); + + thread->Close(); + process->Close(); + + break; + } + case EMemSpyClientServerOpGetThreadInfoItemsCount: + { + TPckgBuf id; + aMessage.ReadL( 0, id ); + TPckgBuf type; + aMessage.ReadL( 1, type ); + + CMemSpyEngineObjectContainer& container = iEngine.Container(); + CMemSpyProcess* process = NULL; + CMemSpyThread* thread = NULL; + + container.ProcessAndThreadByThreadId( id(), process, thread ); + + thread->Open(); + process->Open(); + + CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL(); + + CMemSpyThreadInfoItemBase& threadInfoItemBase = threadInfoContainer.Item( type() ); + + TInt count = threadInfoItemBase.MdcaCount(); + TPckgBuf tempret( count ); + aMessage.WriteL( 2, tempret ); + + thread->Close(); + process->Close(); + + break; + } + case EMemSpyClientServerOpGetThreadInfoItems: + { + TPckgBuf count; + aMessage.ReadL( 0, count ); + TPckgBuf id; + aMessage.ReadL( 1, id ); + TPckgBuf type; + aMessage.ReadL( 2, type ); + + CMemSpyEngineObjectContainer& container = iEngine.Container(); + CMemSpyProcess* process = NULL; + CMemSpyThread* thread = NULL; + User::LeaveIfError( container.ProcessAndThreadByThreadId( id() , process, thread ) ); + + process->Open(); + thread->Open(); + + CMemSpyThreadInfoContainer& threadInfoContainer = thread->InfoContainerForceSyncronousConstructionL(); + + CMemSpyThreadInfoItemBase& threadInfoItemBase = threadInfoContainer.Item( type() ); //get ThreadInfoItemBaseByType + + TInt itemCount = Min(count(), threadInfoItemBase.MdcaCount()); + + for( TInt i=0, offset = 0; i buffer(data); + aMessage.WriteL(3, buffer, offset); + } + aMessage.WriteL(0, count); + + thread->Close(); + process->Close(); + + break; + } + // --- KernelObjects related functions --- + case EMemSpyClientServerOpGetKernelObjectCount: + { + TInt iCount = EMemSpyDriverContainerTypeLast - EMemSpyDriverContainerTypeFirst; + TPckgBuf ret( iCount ); + aMessage.WriteL(0, ret); + break; + } + case EMemSpyClientServerOpGetKernelObjects: + { + TPckgBuf count; + aMessage.ReadL(0, count); + + CMemSpyEngineGenericKernelObjectContainer* model = iEngine.HelperKernelContainers().ObjectsAllL(); //contains all the objects + CleanupStack::PushL( model ); + + for( TInt i=0, offset = 0; iAt(i).Name().Mid(1)); + TInt tabPos = name.Locate('\t'); + if (tabPos != KErrNotFound) + name.Set(name.Left(tabPos)); + + data.iName.Copy(name); + data.iType = model->At(i).Type(); + data.iCount = model->At(i).Count(); + data.iSize = model->At(i).Count() * model->At(i).Count(); + + TPckgBuf buffer(data); + aMessage.WriteL(1, buffer, offset); + } + aMessage.WriteL(0, count); + CleanupStack::PopAndDestroy( model ); + break; + } + case EMemSpyClientServerOpGetKernelObjectItemCount: + { + TPckgBuf tempType; + aMessage.ReadL(1, tempType); //get type of kernel object + TMemSpyDriverContainerType type = tempType(); + + CMemSpyEngineHelperKernelContainers& kernelContainerManager = iEngine.HelperKernelContainers(); + CMemSpyEngineGenericKernelObjectList* iObjectList = kernelContainerManager.ObjectsForSpecificContainerL( type ); + CleanupStack::PushL( iObjectList ); + + TInt count = iObjectList->Count(); + TPckgBuf ret( count ); + aMessage.WriteL( 0, ret ); + + CleanupStack::PopAndDestroy( iObjectList ); + break; + } + case EMemSpyClientServerOpGetKernelObjectItems: + { + TPckgBuf count; + TPckgBuf tempType; + aMessage.ReadL( 0, count ); //get count of items + aMessage.ReadL(1, tempType); //get type of kernel object + TInt c = count(); + + CMemSpyEngineHelperKernelContainers& kernelContainerManager = iEngine.HelperKernelContainers(); + CMemSpyEngineGenericKernelObjectList* iObjectList = kernelContainerManager.ObjectsForSpecificContainerL( tempType() ); + CleanupStack::PushL( iObjectList ); + + for( TInt i=0, offset = 0; iAt( i ); + + TPckgBuf buffer(data); + aMessage.WriteL(2, buffer, offset); + } + + CleanupStack::PopAndDestroy( iObjectList ); + break; + } + // --- Kernel Heap related functions --- + case EMemSpyClientServerOpGetHeap: + { + TMemSpyHeapInfo heapInfo; + iEngine.HelperHeap().GetHeapInfoKernelL( heapInfo ); + TMemSpyHeapData data = iEngine.HelperHeap().NewHeapRawInfo( heapInfo ); + + TPckgBuf buffer(data); + aMessage.WriteL(0, buffer); + + break; + } + } + } + +// --------------------------------------------------------- +// DoCmdServiceL( const RMessage2& aMessage ) +// --------------------------------------------------------- +// +void CMemSpyEngineSession::DoCmdServiceL( const RMessage2& aMessage ) { TInt error = KErrNone;