diff -r 5db69f4c3d06 -r b048e15729d6 perfapps/memspyui/ui/hb/src/enginewrapper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/perfapps/memspyui/ui/hb/src/enginewrapper.cpp Fri Sep 03 17:11:21 2010 +0300 @@ -0,0 +1,578 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include + +#include + +#include "enginewrapper.h" + +// CONSTANTS + +const QString OUTPUT_MODE = "output/mode"; +const QString OUTPUT_PATH = "output/path"; +const QString SWMT_PERIOD = "swmt/period"; +const QString SWMT_MODE = "swmt/mode"; +const QString SWMT_CATEGORIES = "swmt/categories"; +const QString HEAP_DUMPS_MODE = "heapdumps/mode"; + +QString MemSpyProcess::exitInfo() const +{ + QChar exitType[] = {'K', 'T', 'P', 'R'}; + QString result = QString("[%1]").arg(exitType[mProcess->ExitType()]); + + if (mProcess->ExitType() != EExitKill && mProcess->ExitType() != EExitPending) { + + QString exitCategory = QString((QChar*) mProcess->ExitCategory().Ptr(), mProcess->ExitCategory().Length()); + result.append(QString(" %1-%2").arg(exitCategory).arg(mProcess->ExitReason())); + } + + return result; +} + + +MemSpyDwoProgressTracker::MemSpyDwoProgressTracker(RMemSpySession &session) : + CActive(EPriorityStandard), mSession(session) +{ + CActiveScheduler::Add(this); +} + +MemSpyDwoProgressTracker::~MemSpyDwoProgressTracker() +{ + Cancel(); +} + +void MemSpyDwoProgressTracker::start() +{ + mSession.NotifyDeviceWideOperationProgress(mProgress, iStatus); + + SetActive(); +} + +void MemSpyDwoProgressTracker::cancel() +{ + Cancel(); +} + +// Event handler method. + +void MemSpyDwoProgressTracker::RunL() + { + + // If an error occurred handle it in RunError(). + User::LeaveIfError(iStatus.Int()); + + // Resubmit the request immediately + + mSession.NotifyDeviceWideOperationProgress(mProgress, iStatus); + + SetActive(); + + emit progress(mProgress.Progress(), QString((QChar*) mProgress.Description().Ptr(), mProgress.Description().Length())); + } + +void MemSpyDwoProgressTracker::DoCancel() +{ + // this is not yet implemented, as it is not required in current use cases +} + +TInt MemSpyDwoProgressTracker::RunError(TInt aError) +{ + // KErrNotReady and KErrCancel errors are OK, they just notify + // us about the outstanding notification request that won't be + // processed. + Q_UNUSED(aError); + + return KErrNone; +} + +MemSpyDwoTracker::MemSpyDwoTracker(RMemSpySession &session, DeviceWideOperation operation) : + CActive(EPriorityStandard), + mSession(session), + mProgressTracker(new MemSpyDwoProgressTracker(session)), + mOperation(operation) +{ + CActiveScheduler::Add(this); + connect(mProgressTracker, SIGNAL(progress(int,QString)), this, SIGNAL(progress(int,QString))); +} + +MemSpyDwoTracker::~MemSpyDwoTracker() +{ + Cancel(); + + delete mProgressTracker; +} + +void MemSpyDwoTracker::start() +{ + void (RMemSpySession::*functions[])(TRequestStatus&) = { + &RMemSpySession::OutputPhoneInfo, + &RMemSpySession::OutputDetailedPhoneInfo, + &RMemSpySession::OutputHeapInfo, + &RMemSpySession::OutputCompactHeapInfo, + &RMemSpySession::OutputHeapCellListing, + &RMemSpySession::OutputHeapData, + &RMemSpySession::OutputStackInfo, + &RMemSpySession::OutputCompactStackInfo, + &RMemSpySession::OutputUserStackData, + &RMemSpySession::OutputKernelStackData }; + + (mSession.*functions[mOperation])(iStatus); + + mProgressTracker->start(); + + SetActive(); +} + +void MemSpyDwoTracker::cancel() +{ + Cancel(); +} + +// Event handler method. + +void MemSpyDwoTracker::RunL() + { + + // If an error occurred handle it in RunError(). + User::LeaveIfError(iStatus.Int()); + + // Operation has finished successfully + emit finished(0); + } + +void MemSpyDwoTracker::DoCancel() +{ + // Cancel progress tracker + mProgressTracker->cancel(); + + mSession.CancelDeviceWideOperationL(); +} + +TInt MemSpyDwoTracker::RunError(TInt aError) +{ + // Emit the finished signal to notify user + // operation was canceled + emit finished(aError); + + return KErrNone; +} + +MemSpyAsyncTracker::MemSpyAsyncTracker(RMemSpySession& session, void (RMemSpySession::*function)(TRequestStatus&)) : + CActive(EPriorityStandard), + mFunction(function), + mSession(session) +{ + CActiveScheduler::Add(this); +} + +void MemSpyAsyncTracker::RunL() +{ + // If an error occurred handle it in RunError(). + User::LeaveIfError(iStatus.Int()); + + // Operation has finished successfully + emit finished(0); +} + +void MemSpyAsyncTracker::DoCancel() +{ + // nothing to do here +} + +TInt MemSpyAsyncTracker::RunError(TInt aError) +{ + // Emit the finished signal to notify user + // that operation was canceled + emit finished(aError); + + return KErrNone; +} + +void MemSpyAsyncTracker::start() +{ + (mSession.*mFunction)(iStatus); + + SetActive(); +} + +MemSpySettings::MemSpySettings() : + QSettings("Nokia", "MemSpy") +{ +} + +OutputMode MemSpySettings::outputMode() const +{ + return static_cast(value(OUTPUT_MODE, 0).toInt()); +} + +void MemSpySettings::setOutputMode(OutputMode mode) +{ + setValue(OUTPUT_MODE, mode); +} + +QString MemSpySettings::outputPath() const +{ + return value(OUTPUT_PATH).toString(); +} + +void MemSpySettings::setOutputPath(const QString& path) +{ + setValue(OUTPUT_PATH, path); +} + +int MemSpySettings::swmtTimerPeriod() const +{ + return value(SWMT_PERIOD, 30).toInt(); +} + +void MemSpySettings::setSwmtMode(SwmtMode mode) +{ + setValue(SWMT_MODE, mode); +} + +SwmtMode MemSpySettings::swmtMode() const +{ + return static_cast(value(SWMT_MODE, 0).toInt()); +} + +void MemSpySettings::setSwmtTimerPeriod(int period) +{ + setValue(SWMT_PERIOD, period); +} + + +QVariantList MemSpySettings::swmtCategories() const +{ + return value(SWMT_CATEGORIES).toList(); +} + +void MemSpySettings::setSwmtCategories(const QVariantList& categories) +{ + setValue(SWMT_CATEGORIES, categories); +} + +HeapDumpsMode MemSpySettings::heapDumpsMode() const +{ + return static_cast(value(HEAP_DUMPS_MODE).toInt()); +} + +void MemSpySettings::setHeapDumpsMode(HeapDumpsMode mode) +{ + setValue(HEAP_DUMPS_MODE, mode); +} + + +EngineWrapper::EngineWrapper() : + mSwmtRunning(false) +{ +} + +EngineWrapper::~EngineWrapper() +{ + mSession.Close(); +} + +bool EngineWrapper::initialize() +{ + return mSession.Connect() == KErrNone; +} + +MemSpySettings& EngineWrapper::settings() +{ + return mSettings; +} + +const MemSpySettings& EngineWrapper::settings() const +{ + return mSettings; +} + + + +QList EngineWrapper::getProcesses() +{ + QList result; + + RArray proc; + + QT_TRAP_THROWING(mSession.GetProcessesL(proc)); + + for (TInt i=0; i EngineWrapper::getThreads(ProcessId processId) +{ + QList result; + + RArray proc; + + QT_TRAP_THROWING(mSession.GetThreadsL(processId, proc)); + + for (TInt i=0; i EngineWrapper::getThreadInfo(ThreadId threadId, ThreadInfoType type) +{ + QList result; + RArray threadInfo; + qt_symbian_throwIfError(mSession.GetThreadInfoItems(threadInfo, threadId, + static_cast(type))); + + for (TInt i=0; i EngineWrapper::getKernelObjectTypes() +{ + QList result; + + RArray types; + qt_symbian_throwIfError(mSession.GetKernelObjects(types)); + + for(TInt i=0; i EngineWrapper::getKernelObjects(int type) +{ + QList result; + + RArray objects; + qt_symbian_throwIfError(mSession.GetKernelObjectItems(objects, + static_cast(type))); + + for (TInt i=0; i EngineWrapper::getServers() +{ + QList result; + + RArray proc; + + QT_TRAP_THROWING(mSession.GetServersL(proc)); + + for (TInt i=0; i EngineWrapper::getEComCategories() +{ + QList result; + + RArray cat; + + QT_TRAP_THROWING(mSession.GetEComCategoriesL(cat)); + + for (TInt i=0; i EngineWrapper::getEComInterfaces(int categoryId) +{ + QList result; + + RArray interfaces; + + QT_TRAP_THROWING(mSession.GetEComInterfacesL(TUid::Uid(categoryId), interfaces)); + + for (TInt i=0; i EngineWrapper::getEComImplementations(int interfaceId) +{ + QList result; + + RArray implementations; + + QT_TRAP_THROWING(mSession.GetEComImplementationsL(TUid::Uid(interfaceId), implementations)); + + for (TInt i=0; i(filter.utf16()), filter.length()); + + TRAPD(err, mSession.OutputThreadHeapDataL(customFilterDesc)); + + return err; +} + +void EngineWrapper::updateOutputSettings() +{ + switch (mSettings.outputMode()) { + case OutputModeTrace: + TRAP_IGNORE(mSession.SwitchOutputToTraceL()); + break; + + case OutputModeFile: + + if (mSettings.outputPath().isEmpty()) { + TRAP_IGNORE(mSession.SwitchOutputToFileL(KNullDesC)); + + } else { + + QString root = mSettings.outputPath(); + TPtrC rootDesc (static_cast(root.utf16()), root.length()); + + TRAP_IGNORE(mSession.SwitchOutputToFileL(rootDesc)); + } + + } +} + +void EngineWrapper::killProcess(ProcessId process) +{ + TRAP_IGNORE(mSession.EndProcessL(process, EKill)); +} + +void EngineWrapper::panicProcess(ProcessId process) +{ + TRAP_IGNORE(mSession.EndProcessL(process, EPanic)); +} + +void EngineWrapper::terminateProcess(ProcessId process) +{ + TRAP_IGNORE(mSession.EndProcessL(process, ETerminate)); +}