/**************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtQml module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qqmlprofilertypedevent_p.h" #include "qqmlprofilerclientdefinitions_p.h" #include QT_BEGIN_NAMESPACE QDataStream &operator>>(QDataStream &stream, QQmlProfilerTypedEvent &event) { qint64 time; qint32 messageType; qint32 subtype; stream >> time >> messageType; if (messageType < 0 || messageType > MaximumMessage) messageType = MaximumMessage; RangeType rangeType = MaximumRangeType; if (!stream.atEnd()) { stream >> subtype; if (subtype >= 0 && subtype < MaximumRangeType) rangeType = static_cast(subtype); } else { subtype = -1; } event.event.setTimestamp(time > 0 ? time : 0); event.event.setTypeIndex(-1); event.serverTypeId = 0; switch (messageType) { case Event: { event.type = QQmlProfilerEventType( static_cast(messageType), MaximumRangeType, subtype); switch (subtype) { case StartTrace: case EndTrace: { QVarLengthArray engineIds; while (!stream.atEnd()) { qint32 id; stream >> id; engineIds << id; } event.event.setNumbers, qint32>(engineIds); break; } case AnimationFrame: { qint32 frameRate, animationCount; qint32 threadId; stream >> frameRate >> animationCount; if (!stream.atEnd()) stream >> threadId; else threadId = 0; event.event.setNumbers({frameRate, animationCount, threadId}); break; } case Mouse: case Key: int inputType = (subtype == Key ? InputKeyUnknown : InputMouseUnknown); if (!stream.atEnd()) stream >> inputType; qint32 a = -1; if (!stream.atEnd()) stream >> a; qint32 b = -1; if (!stream.atEnd()) stream >> b; event.event.setNumbers({inputType, a, b}); break; } break; } case Complete: { event.type = QQmlProfilerEventType( static_cast(messageType), MaximumRangeType, subtype); break; } case SceneGraphFrame: { QVarLengthArray params; qint64 param; while (!stream.atEnd()) { stream >> param; params.push_back(param); } event.type = QQmlProfilerEventType( static_cast(messageType), MaximumRangeType, subtype); event.event.setNumbers, qint64>(params); break; } case PixmapCacheEvent: { qint32 width = 0, height = 0, refcount = 0; QString filename; stream >> filename; if (subtype == PixmapReferenceCountChanged || subtype == PixmapCacheCountChanged) { stream >> refcount; } else if (subtype == PixmapSizeKnown) { stream >> width >> height; refcount = 1; } event.type = QQmlProfilerEventType( static_cast(messageType), MaximumRangeType, subtype, QQmlProfilerEventLocation(filename, 0, 0)); event.event.setNumbers({width, height, refcount}); break; } case MemoryAllocation: { qint64 delta; stream >> delta; event.type = QQmlProfilerEventType( static_cast(messageType), MaximumRangeType, subtype); event.event.setNumbers({delta}); break; } case RangeStart: { if (!stream.atEnd()) { qint64 typeId; stream >> typeId; if (stream.status() == QDataStream::Ok) event.serverTypeId = typeId; // otherwise it's the old binding type of 4 bytes } event.type = QQmlProfilerEventType(MaximumMessage, rangeType, -1); event.event.setRangeStage(RangeStart); break; } case RangeData: { QString data; stream >> data; event.type = QQmlProfilerEventType(MaximumMessage, rangeType, -1, QQmlProfilerEventLocation(), data); event.event.setRangeStage(RangeData); if (!stream.atEnd()) stream >> event.serverTypeId; break; } case RangeLocation: { QString filename; qint32 line = 0; qint32 column = 0; stream >> filename >> line; if (!stream.atEnd()) { stream >> column; if (!stream.atEnd()) stream >> event.serverTypeId; } event.type = QQmlProfilerEventType(MaximumMessage, rangeType, -1, QQmlProfilerEventLocation(filename, line, column)); event.event.setRangeStage(RangeLocation); break; } case RangeEnd: { event.type = QQmlProfilerEventType(MaximumMessage, rangeType, -1); event.event.setRangeStage(RangeEnd); break; } default: event.event.setNumbers({}); event.type = QQmlProfilerEventType( static_cast(messageType), MaximumRangeType, subtype); break; } return stream; } QT_END_NAMESPACE