|
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 } |