Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmlprofilertypedevent.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant
4
7
8#include <QtCore/qvarlengtharray.h>
9
10QT_BEGIN_NAMESPACE
11
12QDataStream &operator>>(QDataStream &stream, QQmlProfilerTypedEvent &event)
13{
14 qint64 time;
15 qint32 messageType;
16 qint32 subtype;
17
18 stream >> time >> messageType;
19
20 if (messageType < 0 || messageType > MaximumMessage)
21 messageType = MaximumMessage;
22
23 RangeType rangeType = MaximumRangeType;
24 if (!stream.atEnd()) {
25 stream >> subtype;
26 if (subtype >= 0 && subtype < MaximumRangeType)
27 rangeType = static_cast<RangeType>(subtype);
28 } else {
29 subtype = -1;
30 }
31
32 event.event.setTimestamp(time > 0 ? time : 0);
33 event.event.setTypeIndex(-1);
34 event.serverTypeId = 0;
35
36 switch (messageType) {
37 case Event: {
38 event.type = QQmlProfilerEventType(
39 static_cast<Message>(messageType),
40 MaximumRangeType, subtype);
41 switch (subtype) {
42 case StartTrace:
43 case EndTrace: {
44 QVarLengthArray<qint32> engineIds;
45 while (!stream.atEnd()) {
46 qint32 id;
47 stream >> id;
48 engineIds << id;
49 }
50 event.event.setNumbers<QVarLengthArray<qint32>, qint32>(engineIds);
51 break;
52 }
53 case AnimationFrame: {
54 qint32 frameRate, animationCount;
55 qint32 threadId;
56 stream >> frameRate >> animationCount;
57 if (!stream.atEnd())
58 stream >> threadId;
59 else
60 threadId = 0;
61
62 event.event.setNumbers<qint32>({frameRate, animationCount, threadId});
63 break;
64 }
65 case Mouse:
66 case Key:
67 int inputType = (subtype == Key ? InputKeyUnknown : InputMouseUnknown);
68 if (!stream.atEnd())
69 stream >> inputType;
70 qint32 a = -1;
71 if (!stream.atEnd())
72 stream >> a;
73 qint32 b = -1;
74 if (!stream.atEnd())
75 stream >> b;
76
77 event.event.setNumbers<qint32>({inputType, a, b});
78 break;
79 }
80
81 break;
82 }
83 case Complete: {
84 event.type = QQmlProfilerEventType(
85 static_cast<Message>(messageType),
86 MaximumRangeType, subtype);
87 break;
88 }
89 case SceneGraphFrame: {
90 QVarLengthArray<qint64> params;
91 qint64 param;
92
93 while (!stream.atEnd()) {
94 stream >> param;
95 params.push_back(param);
96 }
97
98 event.type = QQmlProfilerEventType(
99 static_cast<Message>(messageType),
100 MaximumRangeType, subtype);
101 event.event.setNumbers<QVarLengthArray<qint64>, qint64>(params);
102 break;
103 }
104 case PixmapCacheEvent: {
105 qint32 width = 0, height = 0, refcount = 0;
106 QString filename;
107 stream >> filename;
108 if (subtype == PixmapReferenceCountChanged || subtype == PixmapCacheCountChanged) {
109 stream >> refcount;
110 } else if (subtype == PixmapSizeKnown) {
111 stream >> width >> height;
112 refcount = 1;
113 }
114
115 event.type = QQmlProfilerEventType(
116 static_cast<Message>(messageType),
117 MaximumRangeType, subtype,
118 QQmlProfilerEventLocation(filename, 0, 0));
119 event.event.setNumbers<qint32>({width, height, refcount});
120 break;
121 }
122 case MemoryAllocation: {
123 qint64 delta;
124 stream >> delta;
125
126 event.type = QQmlProfilerEventType(
127 static_cast<Message>(messageType),
128 MaximumRangeType, subtype);
129 event.event.setNumbers<qint64>({delta});
130 break;
131 }
132 case RangeStart: {
133 if (!stream.atEnd()) {
134 qint64 typeId;
135 stream >> typeId;
136 if (stream.status() == QDataStream::Ok)
137 event.serverTypeId = typeId;
138 // otherwise it's the old binding type of 4 bytes
139 }
140
141 event.type = QQmlProfilerEventType(MaximumMessage, rangeType, -1);
142 event.event.setRangeStage(RangeStart);
143 break;
144 }
145 case RangeData: {
146 QString data;
147 stream >> data;
148
149 event.type = QQmlProfilerEventType(MaximumMessage, rangeType, -1,
150 QQmlProfilerEventLocation(), data);
151 event.event.setRangeStage(RangeData);
152 if (!stream.atEnd())
153 stream >> event.serverTypeId;
154 break;
155 }
156 case RangeLocation: {
157 QString filename;
158 qint32 line = 0;
159 qint32 column = 0;
160 stream >> filename >> line;
161
162 if (!stream.atEnd()) {
163 stream >> column;
164 if (!stream.atEnd())
165 stream >> event.serverTypeId;
166 }
167
168 event.type = QQmlProfilerEventType(MaximumMessage, rangeType, -1,
169 QQmlProfilerEventLocation(filename, line, column));
170 event.event.setRangeStage(RangeLocation);
171 break;
172 }
173 case RangeEnd: {
174 event.type = QQmlProfilerEventType(MaximumMessage, rangeType, -1);
175 event.event.setRangeStage(RangeEnd);
176 break;
177 }
178 default:
179 event.event.setNumbers<char>({});
180 event.type = QQmlProfilerEventType(
181 static_cast<Message>(messageType),
182 MaximumRangeType, subtype);
183 break;
184 }
185
186 return stream;
187}
188
189QT_END_NAMESPACE