memspyui/ui/hb/src/memspykernelobjectview.cpp
changeset 17 4f2773374eff
child 31 e7a04a6385be
equal deleted inserted replaced
15:e11368ed4880 17:4f2773374eff
       
     1 /*
       
     2  * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3  * All rights reserved.
       
     4  * This component and the accompanying materials are made available
       
     5  * under the terms of "Eclipse Public License v1.0"
       
     6  * which accompanies this distribution, and is available
       
     7  * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8  *
       
     9  * Initial Contributors:
       
    10  * Nokia Corporation - initial contribution.
       
    11  *
       
    12  * Contributors:
       
    13  *
       
    14  * Description:
       
    15  *  
       
    16  */
       
    17 
       
    18 #include <QStringListModel>
       
    19 
       
    20 #include "memspykernelobjectview.h"
       
    21 #include "viewmanager.h"
       
    22 
       
    23 MemSpyKernelObjectModel::MemSpyKernelObjectModel(EngineWrapper &engine, int objectType, QObject *parent) :
       
    24 	QAbstractListModel(parent),
       
    25 	mObjects(engine.getKernelObjects(objectType))
       
    26 {
       
    27 }
       
    28 
       
    29 MemSpyKernelObjectModel::~MemSpyKernelObjectModel()
       
    30 {
       
    31 	qDeleteAll(mObjects);
       
    32 }
       
    33 	
       
    34 int MemSpyKernelObjectModel::rowCount(const QModelIndex &parent) const
       
    35 {
       
    36 	Q_UNUSED(parent);
       
    37 	return mObjects.count();
       
    38 }
       
    39 	
       
    40 QVariant MemSpyKernelObjectModel::data(const QModelIndex &index, int role) const
       
    41 {
       
    42 	if (role == Qt::DisplayRole) {
       
    43 		QStringList lines;
       
    44 		lines << mObjects.at(index.row())->name();
       
    45 		
       
    46 		return lines;
       
    47 	}
       
    48 	
       
    49 	if (role == Qt::UserRole) {
       
    50 		return qVariantFromValue<void*>(mObjects.at(index.row()));
       
    51 	}
       
    52 	
       
    53 	return QVariant();
       
    54 }
       
    55 
       
    56 void MemSpyKernelObjectView::initialize(const QVariantMap& params)
       
    57 {
       
    58 	MemSpyView::initialize(params);
       
    59 	
       
    60 	QStringList list = QStringList() << "Threads" << "Processes" << "Chunks" << "Libraries" <<
       
    61 			"Semaphores" << "Mutexes" << "Timers" << "Servers" << "Sessions" << "Logical Devices" <<
       
    62 			"Physical Devices" << "Logical Channels" << "Change Notifiers" << "Undertakers" <<
       
    63 			"Message Queues" << "Property Refs." << "Conditional Vars.";
       
    64 	
       
    65 	int type = params.value("type").toInt();
       
    66 	
       
    67 	setTitle(list.at(type));
       
    68 	
       
    69 	//mListView.setModel(new MemSpyKernelObjectTypeModel(mEngine, this));
       
    70 	mListView.setModel(new MemSpyKernelObjectModel(mEngine, type, this));
       
    71 	
       
    72 	connect(&mListView, SIGNAL(activated(QModelIndex)), this, SLOT(itemClicked(QModelIndex)));
       
    73 }
       
    74 
       
    75 void MemSpyKernelObjectView::itemClicked(const QModelIndex& index)
       
    76 {
       
    77 	QVariantMap map;
       
    78 	map.insert("details", getDetails(static_cast<MemSpyKernelObject*>(qVariantValue<void*>(index.data(Qt::UserRole)))));
       
    79     mViewManager.showView(KernelObjectDetailView, map);
       
    80 }
       
    81 
       
    82 QStringList MemSpyKernelObjectView::getDetails(MemSpyKernelObject *object)
       
    83 {
       
    84 	QStringList result;
       
    85 	
       
    86 	result << QString("%1: %2").arg(tr("Name")).arg(object->nameDetail());
       
    87 	result << QString("%1: %2").arg(tr("Full Name")).arg(object->name());
       
    88 	result << QString("%1: %2").arg(tr("AccessCount")).arg(object->accessCount());
       
    89 	result << QString("%1: %2").arg(tr("UniqueID")).arg(object->uniqueId());
       
    90 	result << QString("%1: %2").arg(tr("Protection")).arg(object->protection());
       
    91 	result << QString("%1: %2").arg(tr("OwnrAddr")).arg(object->addressOfKernelOwner());
       
    92 	result << QString("%1: %2").arg(tr("KernelAddr")).arg(object->kernelAddress());
       
    93 		    
       
    94 	    // Object type specific attributes:
       
    95 	    switch (object->type())
       
    96 	        {
       
    97 	        case KernelObjectTypeUnknown:
       
    98 	            {
       
    99 	            break;
       
   100 	            }
       
   101 	        case KernelObjectTypeThread:
       
   102 	            {
       
   103 	            result << QString("%1: %2").arg(tr("OwnrPrAddr")).arg(object->addressOfOwningProcess());
       
   104 	            result << QString("%1: %2").arg(tr("ThreadID")).arg(object->id());
       
   105 	            result << QString("%1: %2").arg(tr("Priority")).arg(object->priority());
       
   106 	            result << QString("%1: %2").arg(tr("Proc")).arg(object->nameOfOwner());
       
   107 	            break;
       
   108 	            }
       
   109 	        case KernelObjectTypeProcess:
       
   110 	            {
       
   111 	            result << QString("%1: %2").arg(tr("OwnrPrAddr")).arg(object->addressOfOwningProcess());
       
   112 	            result << QString("%1: %2").arg(tr("CreatorId")).arg(object->creatorId());
       
   113 	            result << QString("%1: %2").arg(tr("Attributes")).arg(object->attributes());
       
   114 	            result << QString("%1: %2").arg(tr("StckChnk")).arg(object->addressOfDataBssStackChunk());
       
   115 	            result << QString("%1: %2").arg(tr("ProcessID")).arg(object->id());
       
   116 	            result << QString("%1: %2").arg(tr("Priority")).arg(object->priority());
       
   117 	            result << QString("%1: %2").arg(tr("SecurityZone")).arg(object->securityZone());
       
   118 	            
       
   119 	            /* TODO: to solve process details
       
   120 	            CMemSpyEngineObjectContainer& container = iEngine.Container();
       
   121 	            TProcessId id( iKernelObjectItems[iListBox->CurrentItemIndex().iId );
       
   122 	            TRAP_IGNORE(
       
   123 	                CMemSpyProcess& process = container.ProcessByIdL( id );
       
   124 	                AppendFormatString( messagePtr, _L("\nSID: 0x%08X\n"), process.SID() );
       
   125 	                AppendFormatString( messagePtr, _L("VID: 0x%08X\n"), process.VID() );
       
   126 	                AppendFormatString( messagePtr, _L("UID1: 0x%08X\n"), process.UIDs()[0].iUid  );
       
   127 	                AppendFormatString( messagePtr, _L("UID2: 0x%08X\n"), process.UIDs()[1].iUid  );
       
   128 	                AppendFormatString( messagePtr, _L("UID3: 0x%08X\n"), process.UIDs()[2].iUid );
       
   129 	                AppendFormatString( messagePtr, _L("Caps: 0x%08X%08X"), process.Capabilities().iCaps[0], process.Capabilities().iCaps[1]);
       
   130 	                );
       
   131 	            */
       
   132 	            break;
       
   133 	            }
       
   134 	        case KernelObjectTypeChunk:
       
   135 	            {
       
   136 	            result << QString("%1: %2").arg(tr("OwnrPrAddr")).arg(object->addressOfOwningProcess());
       
   137 	            result << QString("%1: %2").arg(tr("Size")).arg(object->size());
       
   138 	            result << QString("%1: %2").arg(tr("MaxSize")).arg(object->maxSize());
       
   139 	            result << QString("%1: %2").arg(tr("Bottom")).arg(object->bottom());
       
   140 	            result << QString("%1: %2").arg(tr("Top")).arg(object->top());
       
   141 	            result << QString("%1: %2").arg(tr("Attr")).arg(object->attributes());
       
   142 	            result << QString("%1: %2").arg(tr("Start")).arg(object->startPos());
       
   143 	            result << QString("%1: %2").arg(tr("CntrlID")).arg(object->controllingOwner());
       
   144 	            result << QString("%1: %2").arg(tr("Restrictions")).arg(object->restrictions());
       
   145 	            result << QString("%1: %2").arg(tr("MapAttr")).arg(object->mapAttr());
       
   146 	            result << QString("%1: %2").arg(tr("Type")).arg(object->chunkType());
       
   147 	            result << QString("%1: %2").arg(tr("Proc")).arg(object->nameOfOwner());
       
   148 	            break;
       
   149 	            }
       
   150 	        case KernelObjectTypeLibrary:
       
   151 	            {
       
   152 	            result << QString("%1: %2").arg(tr("MapCount")).arg(object->mapCount());
       
   153 	            result << QString("%1: %2").arg(tr("State")).arg(object->state());
       
   154 	            result << QString("%1: %2").arg(tr("CodeSeg")).arg(object->addressOfCodeSeg());
       
   155 	            break;
       
   156 	            }
       
   157 	        case KernelObjectTypeSemaphore:
       
   158 	            {
       
   159 	            result << QString("%1: %2").arg(tr("Count")).arg(object->count());
       
   160 	            result << QString("%1: %2").arg(tr("Resetting")).arg(object->resetting());
       
   161 	            break;
       
   162 	            }
       
   163 	        case KernelObjectTypeMutex:
       
   164 	            {
       
   165 	            result << QString("%1: %2").arg(tr("HoldCount")).arg(object->count());
       
   166 	            result << QString("%1: %2").arg(tr("WaitCount")).arg(object->waitCount());
       
   167 	            result << QString("%1: %2").arg(tr("Resetting")).arg(object->resetting());
       
   168 	            result << QString("%1: %2").arg(tr("Order")).arg(object->order());
       
   169 	            break;
       
   170 	            }
       
   171 	        case KernelObjectTypeTimer:
       
   172 	            {
       
   173 	            result << QString("%1: %2").arg(tr("State")).arg(object->timerState());
       
   174 	            result << QString("%1: %2").arg(tr("Type")).arg(object->timerType());
       
   175 	            break;
       
   176 	            }
       
   177 	        case KernelObjectTypeServer:
       
   178 	            {
       
   179 	            result << QString("%1: %2").arg(tr("ThrdAddr")).arg(object->addressOfOwningThread());
       
   180 	            result << QString("%1: %2").arg(tr("Thr")).arg(object->nameOfOwner());
       
   181 	            result << QString("%1: %2").arg(tr("Type")).arg(object->sessionType());
       
   182 //	            RArray<TMemSpyDriverServerSessionInfo> sessions;
       
   183 //	            CleanupClosePushL( sessions );
       
   184 	            /* TODO: to solve server sessions
       
   185 	            iEngine.HelperServer().GetServerSessionsL( iKernelObjectItems[iListBox->CurrentItemIndex(), sessions );
       
   186 	            const TInt count = sessions.Count();
       
   187 	            for ( TInt i = 0; i < count; i++ )
       
   188 	                {
       
   189 	                const TMemSpyDriverServerSessionInfo& session = sessions[ i ];
       
   190 	                AppendFormatString( messagePtr, _L("SessAddr: 0x%08X\n"), session.iAddress );
       
   191 	                TFullName sessName;
       
   192 	                sessName.Copy( session.iName );
       
   193 	                AppendFormatString( messagePtr, _L("Sess: %S\n"), &sessName );
       
   194 	                }
       
   195 	            CleanupStack::PopAndDestroy( &sessions );
       
   196 	            */
       
   197 	            break;
       
   198 	            }
       
   199 	        case KernelObjectTypeSession:
       
   200 	            {
       
   201 	            result << QString("%1: %2").arg(tr("Server")).arg(object->addressOfServer());
       
   202 				result << QString("%1: %2").arg(tr("Srv")).arg(object->name());
       
   203 				result << QString("%1: %2").arg(tr("AccCount")).arg(object->totalAccessCount());
       
   204 				result << QString("%1: %2").arg(tr("SesType")).arg(object->sessionType());
       
   205 				result << QString("%1: %2").arg(tr("SvrType")).arg(object->svrSessionType());
       
   206 				result << QString("%1: %2").arg(tr("MsgCount")).arg(object->msgCount());
       
   207 				result << QString("%1: %2").arg(tr("MsgLimit")).arg(object->msgLimit());
       
   208 
       
   209 	            break;
       
   210 	            }
       
   211 	        case KernelObjectTypeLogicalDevice:
       
   212 	            {
       
   213 	            result << QString("%1: %2").arg(tr("Version")).arg(object->version());
       
   214 				result << QString("%1: %2").arg(tr("ParseMask")).arg(object->parseMask());
       
   215 				result << QString("%1: %2").arg(tr("UnitsMask")).arg(object->unitsMask());
       
   216 				result << QString("%1: %2").arg(tr("Open channels")).arg(object->openChannels());
       
   217 	            break;
       
   218 	            }
       
   219 	        case KernelObjectTypePhysicalDevice:
       
   220 	            {
       
   221 	            result << QString("%1: %2").arg(tr("Version")).arg(object->version());
       
   222 				result << QString("%1: %2").arg(tr("UnitsMask")).arg(object->unitsMask());
       
   223 				result << QString("%1: %2").arg(tr("CodeSeg")).arg(object->addressOfCodeSeg());
       
   224 	            break;
       
   225 	            }
       
   226 	        case KernelObjectTypeLogicalChannel:
       
   227 	            {
       
   228 	            // No other details
       
   229 	            break;
       
   230 	            }
       
   231 	        case KernelObjectTypeChangeNotifier:
       
   232 	            {
       
   233 	            result << QString("%1: %2").arg(tr("Changes")).arg(object->changes());
       
   234 				result << QString("%1: %2").arg(tr("ThrdAddr")).arg(object->addressOfOwningThread());
       
   235 				result << QString("%1: %2").arg(tr("Thr")).arg(object->nameOfOwner());
       
   236 	            break;
       
   237 	            }
       
   238 	        case KernelObjectTypeUndertaker:
       
   239 	            {
       
   240 	            result << QString("%1: %2").arg(tr("ThrdAddr")).arg(object->addressOfOwningThread());
       
   241 	            result << QString("%1: %2").arg(tr("Thr")).arg(object->nameOfOwner());
       
   242 				break;
       
   243 	            }
       
   244 	        case KernelObjectTypeMsgQueue:
       
   245 	            {
       
   246 	            // No other details
       
   247 	            break;
       
   248 	            }
       
   249 	        case KernelObjectTypePropertyRef:
       
   250 	            {
       
   251 	            /*
       
   252 	            Not listing details here, as propertyRef is not listed in TaskMgr.
       
   253 	            Following propertyRef attributes are available at engine side. 
       
   254 	            
       
   255 	            IsReady
       
   256 	            Type
       
   257 	            Category
       
   258 	            Key
       
   259 	            RefCount
       
   260 	            ThreadId
       
   261 	            CreatorSID
       
   262 	            */
       
   263 	            break;
       
   264 	            }
       
   265 	        case KernelObjectTypeCondVar:
       
   266 	            {
       
   267 	            result << QString("%1: %2").arg(tr("Resetting")).arg(object->resetting());
       
   268 				result << QString("%1: %2").arg(tr("Mutex")).arg(object->addressOfOwningThread());
       
   269 				result << QString("%1: %2").arg(tr("Mtx")).arg(object->nameOfOwner());
       
   270 				result << QString("%1: %2").arg(tr("WaitCount")).arg(object->waitCount());
       
   271 	            
       
   272 //	            RArray<TMemSpyDriverCondVarSuspendedThreadInfo> threads;
       
   273 //	            CleanupClosePushL( threads );
       
   274 	            /* TODO: to solve thread cond. vars.
       
   275 	            iEngine.HelperCondVar().GetCondVarSuspendedThreadsL( iKernelObjectItems[iListBox->CurrentItemIndex(), threads );
       
   276 	            const TInt count = threads.Count();
       
   277 	            for ( TInt i = 0; i < count; i++ )
       
   278 	                {
       
   279 	                const TMemSpyDriverCondVarSuspendedThreadInfo& thr = threads[ i ];
       
   280 	                AppendFormatString( messagePtr, _L("SuspThrdAddr: 0x%08X\n"), thr.iAddress );
       
   281 	                TFullName thrName;
       
   282 	                thrName.Copy( thr.iName );
       
   283 	                AppendFormatString( messagePtr, _L("Thr: %S\n"), &thrName );
       
   284 	                }
       
   285 	            CleanupStack::PopAndDestroy( &threads );
       
   286 	            */
       
   287 	            break;
       
   288 	            }
       
   289 //	        default:
       
   290 //	            {
       
   291 //	            // Programming error
       
   292 //	            __ASSERT_ALWAYS( EFalse, User::Panic( _L("MemSpy-View"), 0 ) );
       
   293 //	            }
       
   294 	        }
       
   295 	
       
   296 	return result;
       
   297 }