memspyui/ui/hb/src/memspykernelobjectview.cpp
branchRCL_3
changeset 21 b3cee849fa46
equal deleted inserted replaced
20:48060abbbeaf 21:b3cee849fa46
       
     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 	QStringList list = QStringList() << "Threads" << "Processes" << "Chunks" << "Libraries" <<
       
    59 			"Semaphores" << "Mutexes" << "Timers" << "Servers" << "Sessions" << "Logical Devices" <<
       
    60 			"Physical Devices" << "Logical Channels" << "Change Notifiers" << "Undertakers" <<
       
    61 			"Message Queues" << "Property Refs." << "Conditional Vars.";
       
    62 	
       
    63 	int type = params.value("type").toInt();
       
    64 	
       
    65 	setTitle(list.at(type));
       
    66 	
       
    67 	MemSpyView::initialize(params);
       
    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 bool MemSpyKernelObjectView::isBreadCrumbVisible() const
       
    76 {
       
    77     return true;
       
    78 }
       
    79             
       
    80 QString MemSpyKernelObjectView::getBreadCrumbText() const
       
    81 {
       
    82     return tr("Kernel Objects");
       
    83 }
       
    84 
       
    85 
       
    86 void MemSpyKernelObjectView::itemClicked(const QModelIndex& index)
       
    87 {
       
    88 	QVariantMap map;
       
    89 	map.insert("details", getDetails(static_cast<MemSpyKernelObject*>(qVariantValue<void*>(index.data(Qt::UserRole)))));
       
    90 	map.insert("typeName", title());
       
    91 	map.insert("objectName", static_cast<MemSpyKernelObject*>(qVariantValue<void*>(index.data(Qt::UserRole)))->nameDetail());
       
    92     mViewManager.showView(KernelObjectDetailView, map);
       
    93 }
       
    94 
       
    95 QStringList MemSpyKernelObjectView::getDetails(MemSpyKernelObject *object)
       
    96 {
       
    97 	QStringList result;
       
    98 	
       
    99 	result << QString("%1: %2").arg(tr("Name")).arg(object->nameDetail());
       
   100 	result << QString("%1: %2").arg(tr("Full Name")).arg(object->name());
       
   101 	result << QString("%1: %2").arg(tr("AccessCount")).arg(object->accessCount());
       
   102 	result << QString("%1: %2").arg(tr("UniqueID")).arg(object->uniqueId());
       
   103 	result << QString("%1: %2").arg(tr("Protection")).arg(object->protection());
       
   104 	result << QString("%1: %2").arg(tr("OwnrAddr")).arg(object->addressOfKernelOwner());
       
   105 	result << QString("%1: %2").arg(tr("KernelAddr")).arg(object->kernelAddress());
       
   106 		    
       
   107 	    // Object type specific attributes:
       
   108 	    switch (object->type())
       
   109 	        {
       
   110 	        case KernelObjectTypeUnknown:
       
   111 	            {
       
   112 	            break;
       
   113 	            }
       
   114 	        case KernelObjectTypeThread:
       
   115 	            {
       
   116 	            result << QString("%1: %2").arg(tr("OwnrPrAddr")).arg(object->addressOfOwningProcess());
       
   117 	            result << QString("%1: %2").arg(tr("ThreadID")).arg(object->id());
       
   118 	            result << QString("%1: %2").arg(tr("Priority")).arg(object->priority());
       
   119 	            result << QString("%1: %2").arg(tr("Proc")).arg(object->nameOfOwner());
       
   120 	            break;
       
   121 	            }
       
   122 	        case KernelObjectTypeProcess:
       
   123 	            {
       
   124 	            result << QString("%1: %2").arg(tr("OwnrPrAddr")).arg(object->addressOfOwningProcess());
       
   125 	            result << QString("%1: %2").arg(tr("CreatorId")).arg(object->creatorId());
       
   126 	            result << QString("%1: %2").arg(tr("Attributes")).arg(object->attributes());
       
   127 	            result << QString("%1: %2").arg(tr("StckChnk")).arg(object->addressOfDataBssStackChunk());
       
   128 	            result << QString("%1: %2").arg(tr("ProcessID")).arg(object->id());
       
   129 	            result << QString("%1: %2").arg(tr("Priority")).arg(object->priority());
       
   130 	            result << QString("%1: %2").arg(tr("SecurityZone")).arg(object->securityZone());
       
   131 	            
       
   132 	            /* TODO: to solve process details
       
   133 	            CMemSpyEngineObjectContainer& container = iEngine.Container();
       
   134 	            TProcessId id( iKernelObjectItems[iListBox->CurrentItemIndex().iId );
       
   135 	            TRAP_IGNORE(
       
   136 	                CMemSpyProcess& process = container.ProcessByIdL( id );
       
   137 	                AppendFormatString( messagePtr, _L("\nSID: 0x%08X\n"), process.SID() );
       
   138 	                AppendFormatString( messagePtr, _L("VID: 0x%08X\n"), process.VID() );
       
   139 	                AppendFormatString( messagePtr, _L("UID1: 0x%08X\n"), process.UIDs()[0].iUid  );
       
   140 	                AppendFormatString( messagePtr, _L("UID2: 0x%08X\n"), process.UIDs()[1].iUid  );
       
   141 	                AppendFormatString( messagePtr, _L("UID3: 0x%08X\n"), process.UIDs()[2].iUid );
       
   142 	                AppendFormatString( messagePtr, _L("Caps: 0x%08X%08X"), process.Capabilities().iCaps[0], process.Capabilities().iCaps[1]);
       
   143 	                );
       
   144 	            */
       
   145 	            break;
       
   146 	            }
       
   147 	        case KernelObjectTypeChunk:
       
   148 	            {
       
   149 	            result << QString("%1: %2").arg(tr("OwnrPrAddr")).arg(object->addressOfOwningProcess());
       
   150 	            result << QString("%1: %2").arg(tr("Size")).arg(object->size());
       
   151 	            result << QString("%1: %2").arg(tr("MaxSize")).arg(object->maxSize());
       
   152 	            result << QString("%1: %2").arg(tr("Bottom")).arg(object->bottom());
       
   153 	            result << QString("%1: %2").arg(tr("Top")).arg(object->top());
       
   154 	            result << QString("%1: %2").arg(tr("Attr")).arg(object->attributes());
       
   155 	            result << QString("%1: %2").arg(tr("Start")).arg(object->startPos());
       
   156 	            result << QString("%1: %2").arg(tr("CntrlID")).arg(object->controllingOwner());
       
   157 	            result << QString("%1: %2").arg(tr("Restrictions")).arg(object->restrictions());
       
   158 	            result << QString("%1: %2").arg(tr("MapAttr")).arg(object->mapAttr());
       
   159 	            result << QString("%1: %2").arg(tr("Type")).arg(object->chunkType());
       
   160 	            result << QString("%1: %2").arg(tr("Proc")).arg(object->nameOfOwner());
       
   161 	            break;
       
   162 	            }
       
   163 	        case KernelObjectTypeLibrary:
       
   164 	            {
       
   165 	            result << QString("%1: %2").arg(tr("MapCount")).arg(object->mapCount());
       
   166 	            result << QString("%1: %2").arg(tr("State")).arg(object->state());
       
   167 	            result << QString("%1: %2").arg(tr("CodeSeg")).arg(object->addressOfCodeSeg());
       
   168 	            break;
       
   169 	            }
       
   170 	        case KernelObjectTypeSemaphore:
       
   171 	            {
       
   172 	            result << QString("%1: %2").arg(tr("Count")).arg(object->count());
       
   173 	            result << QString("%1: %2").arg(tr("Resetting")).arg(object->resetting());
       
   174 	            break;
       
   175 	            }
       
   176 	        case KernelObjectTypeMutex:
       
   177 	            {
       
   178 	            result << QString("%1: %2").arg(tr("HoldCount")).arg(object->count());
       
   179 	            result << QString("%1: %2").arg(tr("WaitCount")).arg(object->waitCount());
       
   180 	            result << QString("%1: %2").arg(tr("Resetting")).arg(object->resetting());
       
   181 	            result << QString("%1: %2").arg(tr("Order")).arg(object->order());
       
   182 	            break;
       
   183 	            }
       
   184 	        case KernelObjectTypeTimer:
       
   185 	            {
       
   186 	            result << QString("%1: %2").arg(tr("State")).arg(object->timerState());
       
   187 	            result << QString("%1: %2").arg(tr("Type")).arg(object->timerType());
       
   188 	            break;
       
   189 	            }
       
   190 	        case KernelObjectTypeServer:
       
   191 	            {
       
   192 	            result << QString("%1: %2").arg(tr("ThrdAddr")).arg(object->addressOfOwningThread());
       
   193 	            result << QString("%1: %2").arg(tr("Thr")).arg(object->nameOfOwner());
       
   194 	            result << QString("%1: %2").arg(tr("Type")).arg(object->sessionType());
       
   195 //	            RArray<TMemSpyDriverServerSessionInfo> sessions;
       
   196 //	            CleanupClosePushL( sessions );
       
   197 	            /* TODO: to solve server sessions
       
   198 	            iEngine.HelperServer().GetServerSessionsL( iKernelObjectItems[iListBox->CurrentItemIndex(), sessions );
       
   199 	            const TInt count = sessions.Count();
       
   200 	            for ( TInt i = 0; i < count; i++ )
       
   201 	                {
       
   202 	                const TMemSpyDriverServerSessionInfo& session = sessions[ i ];
       
   203 	                AppendFormatString( messagePtr, _L("SessAddr: 0x%08X\n"), session.iAddress );
       
   204 	                TFullName sessName;
       
   205 	                sessName.Copy( session.iName );
       
   206 	                AppendFormatString( messagePtr, _L("Sess: %S\n"), &sessName );
       
   207 	                }
       
   208 	            CleanupStack::PopAndDestroy( &sessions );
       
   209 	            */
       
   210 	            break;
       
   211 	            }
       
   212 	        case KernelObjectTypeSession:
       
   213 	            {
       
   214 	            result << QString("%1: %2").arg(tr("Server")).arg(object->addressOfServer());
       
   215 				result << QString("%1: %2").arg(tr("Srv")).arg(object->name());
       
   216 				result << QString("%1: %2").arg(tr("AccCount")).arg(object->totalAccessCount());
       
   217 				result << QString("%1: %2").arg(tr("SesType")).arg(object->sessionType());
       
   218 				result << QString("%1: %2").arg(tr("SvrType")).arg(object->svrSessionType());
       
   219 				result << QString("%1: %2").arg(tr("MsgCount")).arg(object->msgCount());
       
   220 				result << QString("%1: %2").arg(tr("MsgLimit")).arg(object->msgLimit());
       
   221 
       
   222 	            break;
       
   223 	            }
       
   224 	        case KernelObjectTypeLogicalDevice:
       
   225 	            {
       
   226 	            result << QString("%1: %2").arg(tr("Version")).arg(object->version());
       
   227 				result << QString("%1: %2").arg(tr("ParseMask")).arg(object->parseMask());
       
   228 				result << QString("%1: %2").arg(tr("UnitsMask")).arg(object->unitsMask());
       
   229 				result << QString("%1: %2").arg(tr("Open channels")).arg(object->openChannels());
       
   230 	            break;
       
   231 	            }
       
   232 	        case KernelObjectTypePhysicalDevice:
       
   233 	            {
       
   234 	            result << QString("%1: %2").arg(tr("Version")).arg(object->version());
       
   235 				result << QString("%1: %2").arg(tr("UnitsMask")).arg(object->unitsMask());
       
   236 				result << QString("%1: %2").arg(tr("CodeSeg")).arg(object->addressOfCodeSeg());
       
   237 	            break;
       
   238 	            }
       
   239 	        case KernelObjectTypeLogicalChannel:
       
   240 	            {
       
   241 	            // No other details
       
   242 	            break;
       
   243 	            }
       
   244 	        case KernelObjectTypeChangeNotifier:
       
   245 	            {
       
   246 	            result << QString("%1: %2").arg(tr("Changes")).arg(object->changes());
       
   247 				result << QString("%1: %2").arg(tr("ThrdAddr")).arg(object->addressOfOwningThread());
       
   248 				result << QString("%1: %2").arg(tr("Thr")).arg(object->nameOfOwner());
       
   249 	            break;
       
   250 	            }
       
   251 	        case KernelObjectTypeUndertaker:
       
   252 	            {
       
   253 	            result << QString("%1: %2").arg(tr("ThrdAddr")).arg(object->addressOfOwningThread());
       
   254 	            result << QString("%1: %2").arg(tr("Thr")).arg(object->nameOfOwner());
       
   255 				break;
       
   256 	            }
       
   257 	        case KernelObjectTypeMsgQueue:
       
   258 	            {
       
   259 	            // No other details
       
   260 	            break;
       
   261 	            }
       
   262 	        case KernelObjectTypePropertyRef:
       
   263 	            {
       
   264 	            /*
       
   265 	            Not listing details here, as propertyRef is not listed in TaskMgr.
       
   266 	            Following propertyRef attributes are available at engine side. 
       
   267 	            
       
   268 	            IsReady
       
   269 	            Type
       
   270 	            Category
       
   271 	            Key
       
   272 	            RefCount
       
   273 	            ThreadId
       
   274 	            CreatorSID
       
   275 	            */
       
   276 	            break;
       
   277 	            }
       
   278 	        case KernelObjectTypeCondVar:
       
   279 	            {
       
   280 	            result << QString("%1: %2").arg(tr("Resetting")).arg(object->resetting());
       
   281 				result << QString("%1: %2").arg(tr("Mutex")).arg(object->addressOfOwningThread());
       
   282 				result << QString("%1: %2").arg(tr("Mtx")).arg(object->nameOfOwner());
       
   283 				result << QString("%1: %2").arg(tr("WaitCount")).arg(object->waitCount());
       
   284 	            
       
   285 //	            RArray<TMemSpyDriverCondVarSuspendedThreadInfo> threads;
       
   286 //	            CleanupClosePushL( threads );
       
   287 	            /* TODO: to solve thread cond. vars.
       
   288 	            iEngine.HelperCondVar().GetCondVarSuspendedThreadsL( iKernelObjectItems[iListBox->CurrentItemIndex(), threads );
       
   289 	            const TInt count = threads.Count();
       
   290 	            for ( TInt i = 0; i < count; i++ )
       
   291 	                {
       
   292 	                const TMemSpyDriverCondVarSuspendedThreadInfo& thr = threads[ i ];
       
   293 	                AppendFormatString( messagePtr, _L("SuspThrdAddr: 0x%08X\n"), thr.iAddress );
       
   294 	                TFullName thrName;
       
   295 	                thrName.Copy( thr.iName );
       
   296 	                AppendFormatString( messagePtr, _L("Thr: %S\n"), &thrName );
       
   297 	                }
       
   298 	            CleanupStack::PopAndDestroy( &threads );
       
   299 	            */
       
   300 	            break;
       
   301 	            }
       
   302 //	        default:
       
   303 //	            {
       
   304 //	            // Programming error
       
   305 //	            __ASSERT_ALWAYS( EFalse, User::Panic( _L("MemSpy-View"), 0 ) );
       
   306 //	            }
       
   307 	        }
       
   308 	
       
   309 	return result;
       
   310 }