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