--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/memspyui/ui/hb/src/memspykernelobjectview.cpp Tue Aug 31 15:15:20 2010 +0300
@@ -0,0 +1,310 @@
+/*
+ * 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 <QStringListModel>
+
+#include "memspykernelobjectview.h"
+#include "viewmanager.h"
+
+MemSpyKernelObjectModel::MemSpyKernelObjectModel(EngineWrapper &engine, int objectType, QObject *parent) :
+ QAbstractListModel(parent),
+ mObjects(engine.getKernelObjects(objectType))
+{
+}
+
+MemSpyKernelObjectModel::~MemSpyKernelObjectModel()
+{
+ qDeleteAll(mObjects);
+}
+
+int MemSpyKernelObjectModel::rowCount(const QModelIndex &parent) const
+{
+ Q_UNUSED(parent);
+ return mObjects.count();
+}
+
+QVariant MemSpyKernelObjectModel::data(const QModelIndex &index, int role) const
+{
+ if (role == Qt::DisplayRole) {
+ QStringList lines;
+ lines << mObjects.at(index.row())->name();
+
+ return lines;
+ }
+
+ if (role == Qt::UserRole) {
+ return qVariantFromValue<void*>(mObjects.at(index.row()));
+ }
+
+ return QVariant();
+}
+
+void MemSpyKernelObjectView::initialize(const QVariantMap& params)
+{
+ QStringList list = QStringList() << "Threads" << "Processes" << "Chunks" << "Libraries" <<
+ "Semaphores" << "Mutexes" << "Timers" << "Servers" << "Sessions" << "Logical Devices" <<
+ "Physical Devices" << "Logical Channels" << "Change Notifiers" << "Undertakers" <<
+ "Message Queues" << "Property Refs." << "Conditional Vars.";
+
+ int type = params.value("type").toInt();
+
+ setTitle(list.at(type));
+
+ MemSpyView::initialize(params);
+
+ //mListView.setModel(new MemSpyKernelObjectTypeModel(mEngine, this));
+ mListView.setModel(new MemSpyKernelObjectModel(mEngine, type, this));
+
+ connect(&mListView, SIGNAL(activated(QModelIndex)), this, SLOT(itemClicked(QModelIndex)));
+}
+
+bool MemSpyKernelObjectView::isBreadCrumbVisible() const
+{
+ return true;
+}
+
+QString MemSpyKernelObjectView::getBreadCrumbText() const
+{
+ return tr("Kernel Objects");
+}
+
+
+void MemSpyKernelObjectView::itemClicked(const QModelIndex& index)
+{
+ QVariantMap map;
+ map.insert("details", getDetails(static_cast<MemSpyKernelObject*>(qVariantValue<void*>(index.data(Qt::UserRole)))));
+ map.insert("typeName", title());
+ map.insert("objectName", static_cast<MemSpyKernelObject*>(qVariantValue<void*>(index.data(Qt::UserRole)))->nameDetail());
+ mViewManager.showView(KernelObjectDetailView, map);
+}
+
+QStringList MemSpyKernelObjectView::getDetails(MemSpyKernelObject *object)
+{
+ QStringList result;
+
+ result << QString("%1: %2").arg(tr("Name")).arg(object->nameDetail());
+ result << QString("%1: %2").arg(tr("Full Name")).arg(object->name());
+ result << QString("%1: %2").arg(tr("AccessCount")).arg(object->accessCount());
+ result << QString("%1: %2").arg(tr("UniqueID")).arg(object->uniqueId());
+ result << QString("%1: %2").arg(tr("Protection")).arg(object->protection());
+ result << QString("%1: %2").arg(tr("OwnrAddr")).arg(object->addressOfKernelOwner());
+ result << QString("%1: %2").arg(tr("KernelAddr")).arg(object->kernelAddress());
+
+ // Object type specific attributes:
+ switch (object->type())
+ {
+ case KernelObjectTypeUnknown:
+ {
+ break;
+ }
+ case KernelObjectTypeThread:
+ {
+ result << QString("%1: %2").arg(tr("OwnrPrAddr")).arg(object->addressOfOwningProcess());
+ result << QString("%1: %2").arg(tr("ThreadID")).arg(object->id());
+ result << QString("%1: %2").arg(tr("Priority")).arg(object->priority());
+ result << QString("%1: %2").arg(tr("Proc")).arg(object->nameOfOwner());
+ break;
+ }
+ case KernelObjectTypeProcess:
+ {
+ result << QString("%1: %2").arg(tr("OwnrPrAddr")).arg(object->addressOfOwningProcess());
+ result << QString("%1: %2").arg(tr("CreatorId")).arg(object->creatorId());
+ result << QString("%1: %2").arg(tr("Attributes")).arg(object->attributes());
+ result << QString("%1: %2").arg(tr("StckChnk")).arg(object->addressOfDataBssStackChunk());
+ result << QString("%1: %2").arg(tr("ProcessID")).arg(object->id());
+ result << QString("%1: %2").arg(tr("Priority")).arg(object->priority());
+ result << QString("%1: %2").arg(tr("SecurityZone")).arg(object->securityZone());
+
+ /* TODO: to solve process details
+ CMemSpyEngineObjectContainer& container = iEngine.Container();
+ TProcessId id( iKernelObjectItems[iListBox->CurrentItemIndex().iId );
+ TRAP_IGNORE(
+ CMemSpyProcess& process = container.ProcessByIdL( id );
+ AppendFormatString( messagePtr, _L("\nSID: 0x%08X\n"), process.SID() );
+ AppendFormatString( messagePtr, _L("VID: 0x%08X\n"), process.VID() );
+ AppendFormatString( messagePtr, _L("UID1: 0x%08X\n"), process.UIDs()[0].iUid );
+ AppendFormatString( messagePtr, _L("UID2: 0x%08X\n"), process.UIDs()[1].iUid );
+ AppendFormatString( messagePtr, _L("UID3: 0x%08X\n"), process.UIDs()[2].iUid );
+ AppendFormatString( messagePtr, _L("Caps: 0x%08X%08X"), process.Capabilities().iCaps[0], process.Capabilities().iCaps[1]);
+ );
+ */
+ break;
+ }
+ case KernelObjectTypeChunk:
+ {
+ result << QString("%1: %2").arg(tr("OwnrPrAddr")).arg(object->addressOfOwningProcess());
+ result << QString("%1: %2").arg(tr("Size")).arg(object->size());
+ result << QString("%1: %2").arg(tr("MaxSize")).arg(object->maxSize());
+ result << QString("%1: %2").arg(tr("Bottom")).arg(object->bottom());
+ result << QString("%1: %2").arg(tr("Top")).arg(object->top());
+ result << QString("%1: %2").arg(tr("Attr")).arg(object->attributes());
+ result << QString("%1: %2").arg(tr("Start")).arg(object->startPos());
+ result << QString("%1: %2").arg(tr("CntrlID")).arg(object->controllingOwner());
+ result << QString("%1: %2").arg(tr("Restrictions")).arg(object->restrictions());
+ result << QString("%1: %2").arg(tr("MapAttr")).arg(object->mapAttr());
+ result << QString("%1: %2").arg(tr("Type")).arg(object->chunkType());
+ result << QString("%1: %2").arg(tr("Proc")).arg(object->nameOfOwner());
+ break;
+ }
+ case KernelObjectTypeLibrary:
+ {
+ result << QString("%1: %2").arg(tr("MapCount")).arg(object->mapCount());
+ result << QString("%1: %2").arg(tr("State")).arg(object->state());
+ result << QString("%1: %2").arg(tr("CodeSeg")).arg(object->addressOfCodeSeg());
+ break;
+ }
+ case KernelObjectTypeSemaphore:
+ {
+ result << QString("%1: %2").arg(tr("Count")).arg(object->count());
+ result << QString("%1: %2").arg(tr("Resetting")).arg(object->resetting());
+ break;
+ }
+ case KernelObjectTypeMutex:
+ {
+ result << QString("%1: %2").arg(tr("HoldCount")).arg(object->count());
+ result << QString("%1: %2").arg(tr("WaitCount")).arg(object->waitCount());
+ result << QString("%1: %2").arg(tr("Resetting")).arg(object->resetting());
+ result << QString("%1: %2").arg(tr("Order")).arg(object->order());
+ break;
+ }
+ case KernelObjectTypeTimer:
+ {
+ result << QString("%1: %2").arg(tr("State")).arg(object->timerState());
+ result << QString("%1: %2").arg(tr("Type")).arg(object->timerType());
+ break;
+ }
+ case KernelObjectTypeServer:
+ {
+ result << QString("%1: %2").arg(tr("ThrdAddr")).arg(object->addressOfOwningThread());
+ result << QString("%1: %2").arg(tr("Thr")).arg(object->nameOfOwner());
+ result << QString("%1: %2").arg(tr("Type")).arg(object->sessionType());
+// RArray<TMemSpyDriverServerSessionInfo> sessions;
+// CleanupClosePushL( sessions );
+ /* TODO: to solve server sessions
+ iEngine.HelperServer().GetServerSessionsL( iKernelObjectItems[iListBox->CurrentItemIndex(), sessions );
+ const TInt count = sessions.Count();
+ for ( TInt i = 0; i < count; i++ )
+ {
+ const TMemSpyDriverServerSessionInfo& session = sessions[ i ];
+ AppendFormatString( messagePtr, _L("SessAddr: 0x%08X\n"), session.iAddress );
+ TFullName sessName;
+ sessName.Copy( session.iName );
+ AppendFormatString( messagePtr, _L("Sess: %S\n"), &sessName );
+ }
+ CleanupStack::PopAndDestroy( &sessions );
+ */
+ break;
+ }
+ case KernelObjectTypeSession:
+ {
+ result << QString("%1: %2").arg(tr("Server")).arg(object->addressOfServer());
+ result << QString("%1: %2").arg(tr("Srv")).arg(object->name());
+ result << QString("%1: %2").arg(tr("AccCount")).arg(object->totalAccessCount());
+ result << QString("%1: %2").arg(tr("SesType")).arg(object->sessionType());
+ result << QString("%1: %2").arg(tr("SvrType")).arg(object->svrSessionType());
+ result << QString("%1: %2").arg(tr("MsgCount")).arg(object->msgCount());
+ result << QString("%1: %2").arg(tr("MsgLimit")).arg(object->msgLimit());
+
+ break;
+ }
+ case KernelObjectTypeLogicalDevice:
+ {
+ result << QString("%1: %2").arg(tr("Version")).arg(object->version());
+ result << QString("%1: %2").arg(tr("ParseMask")).arg(object->parseMask());
+ result << QString("%1: %2").arg(tr("UnitsMask")).arg(object->unitsMask());
+ result << QString("%1: %2").arg(tr("Open channels")).arg(object->openChannels());
+ break;
+ }
+ case KernelObjectTypePhysicalDevice:
+ {
+ result << QString("%1: %2").arg(tr("Version")).arg(object->version());
+ result << QString("%1: %2").arg(tr("UnitsMask")).arg(object->unitsMask());
+ result << QString("%1: %2").arg(tr("CodeSeg")).arg(object->addressOfCodeSeg());
+ break;
+ }
+ case KernelObjectTypeLogicalChannel:
+ {
+ // No other details
+ break;
+ }
+ case KernelObjectTypeChangeNotifier:
+ {
+ result << QString("%1: %2").arg(tr("Changes")).arg(object->changes());
+ result << QString("%1: %2").arg(tr("ThrdAddr")).arg(object->addressOfOwningThread());
+ result << QString("%1: %2").arg(tr("Thr")).arg(object->nameOfOwner());
+ break;
+ }
+ case KernelObjectTypeUndertaker:
+ {
+ result << QString("%1: %2").arg(tr("ThrdAddr")).arg(object->addressOfOwningThread());
+ result << QString("%1: %2").arg(tr("Thr")).arg(object->nameOfOwner());
+ break;
+ }
+ case KernelObjectTypeMsgQueue:
+ {
+ // No other details
+ break;
+ }
+ case KernelObjectTypePropertyRef:
+ {
+ /*
+ Not listing details here, as propertyRef is not listed in TaskMgr.
+ Following propertyRef attributes are available at engine side.
+
+ IsReady
+ Type
+ Category
+ Key
+ RefCount
+ ThreadId
+ CreatorSID
+ */
+ break;
+ }
+ case KernelObjectTypeCondVar:
+ {
+ result << QString("%1: %2").arg(tr("Resetting")).arg(object->resetting());
+ result << QString("%1: %2").arg(tr("Mutex")).arg(object->addressOfOwningThread());
+ result << QString("%1: %2").arg(tr("Mtx")).arg(object->nameOfOwner());
+ result << QString("%1: %2").arg(tr("WaitCount")).arg(object->waitCount());
+
+// RArray<TMemSpyDriverCondVarSuspendedThreadInfo> threads;
+// CleanupClosePushL( threads );
+ /* TODO: to solve thread cond. vars.
+ iEngine.HelperCondVar().GetCondVarSuspendedThreadsL( iKernelObjectItems[iListBox->CurrentItemIndex(), threads );
+ const TInt count = threads.Count();
+ for ( TInt i = 0; i < count; i++ )
+ {
+ const TMemSpyDriverCondVarSuspendedThreadInfo& thr = threads[ i ];
+ AppendFormatString( messagePtr, _L("SuspThrdAddr: 0x%08X\n"), thr.iAddress );
+ TFullName thrName;
+ thrName.Copy( thr.iName );
+ AppendFormatString( messagePtr, _L("Thr: %S\n"), &thrName );
+ }
+ CleanupStack::PopAndDestroy( &threads );
+ */
+ break;
+ }
+// default:
+// {
+// // Programming error
+// __ASSERT_ALWAYS( EFalse, User::Panic( _L("MemSpy-View"), 0 ) );
+// }
+ }
+
+ return result;
+}