wiRedPanda
Logic Circuit Simulator
Loading...
Searching...
No Matches
Serialization.h
Go to the documentation of this file.
1// Copyright 2015 - 2026, GIBIS-UNIFESP and the wiRedPanda contributors
2// SPDX-License-Identifier: GPL-3.0-or-later
3
7
8#pragma once
9
10#include <QCoreApplication>
11#include <QFileInfo>
12#include <QKeySequence>
13#include <QMap>
14#include <QSet>
15#include <QString>
16#include <QVersionNumber>
17
19
20class QGraphicsItem;
21class Port;
22
33{
34 Q_DECLARE_TR_FUNCTIONS(Serialization)
35
36public:
44 static void serialize(const QList<QGraphicsItem *> &items, QDataStream &stream, SerializationOptions options);
45
52 static QList<QGraphicsItem *> deserialize(QDataStream &stream, SerializationContext &context);
53
54 // --- View Serialization ---
55
57 static QRectF loadRect(QDataStream &stream, const QVersionNumber &version);
58
59 // --- Waveform Serialization ---
60
62 static QString loadDolphinFileName(QDataStream &stream, const QVersionNumber &version);
63
64 // --- Utility ---
65
67 static QString typeName(const int type);
68
69 // --- File Headers ---
70
72 static QVersionNumber readPandaHeader(QDataStream &stream);
73
86 static QMap<QString, QVariant> readBoundedMetadata(QDataStream &stream);
87
92 static QString readBoundedString(QDataStream &stream);
93
100 static QKeySequence readBoundedKeySequence(QDataStream &stream);
101
109 static QMap<QString, QByteArray> readBoundedBlobMap(QDataStream &stream);
110
115 static void readDolphinHeader(QDataStream &stream);
116
121 static void writeDolphinHeader(QDataStream &stream);
122
127 static void writePandaHeader(QDataStream &stream);
128
139 static void writePayload(QDataStream &stream, const QByteArray &payload);
140
152 static QByteArray readPayload(QDataStream &stream, const QVersionNumber &version);
153
163 static void createVersionedBackup(const QString &fileName, const QVersionNumber &version);
164
165 // --- Panda Preamble ---
166
168 struct Preamble {
169 QVersionNumber version;
170 QMap<QString, QVariant> metadata;
179 };
180
182 static Preamble readPreamble(QDataStream &stream);
183
184 // --- Embedded ICs ---
185
197 static QMap<QString, QByteArray> deserializeBlobRegistry(const QMap<QString, QVariant> &metadata,
198 const QVersionNumber &fileVersion);
199
201 static void serializeBlobRegistry(const QMap<QString, QByteArray> &blobs, QMap<QString, QVariant> &metadata);
202
203 // --- File Utilities ---
204
214 static void copyPandaFile(const QFileInfo &srcPath, const QFileInfo &destPath,
215 QSet<QString> *visited = nullptr, int depth = 0);
216
217 // --- Magic Headers ---
218
219 constexpr static quint32 MAGIC_HEADER_CIRCUIT = 0x57504346; // "WPCF" (wiRedPanda Circuit File)
220 constexpr static quint32 MAGIC_HEADER_WAVEFORM = 0x57505746; // "WPWF" (wiRedPanda Waveform File)
221};
Deserialization/serialization context structs passed through load()/save() call chains.
Abstract base class for circuit element ports (connection endpoints).
Definition Port.h:39
Static utility class for reading and writing circuit and waveform files.
static void readDolphinHeader(QDataStream &stream)
Reads and validates the BeWavedDolphin waveform file header.
static QList< QGraphicsItem * > deserialize(QDataStream &stream, SerializationContext &context)
Deserializes items from stream until the stream is exhausted.
static void serialize(const QList< QGraphicsItem * > &items, QDataStream &stream, SerializationOptions options)
Serializes items to stream in the current .panda binary format.
static QMap< QString, QByteArray > readBoundedBlobMap(QDataStream &stream)
Reads a QMap<QString,QByteArray> from stream with bounds checking.
static void copyPandaFile(const QFileInfo &srcPath, const QFileInfo &destPath, QSet< QString > *visited=nullptr, int depth=0)
Copies a .panda file and its file-backed IC dependencies to destPath.
static QString readBoundedString(QDataStream &stream)
Reads a QString from stream, refusing to allocate more bytes than remain in the stream (prevents OOM ...
static void writePandaHeader(QDataStream &stream)
Writes the .panda circuit file header to stream.
static constexpr quint32 MAGIC_HEADER_WAVEFORM
static QString typeName(const int type)
Returns the human-readable element type name for the given type integer.
static void writeDolphinHeader(QDataStream &stream)
Writes the BeWavedDolphin waveform file header to stream.
static void serializeBlobRegistry(const QMap< QString, QByteArray > &blobs, QMap< QString, QVariant > &metadata)
Serializes embedded ICs into a metadata map (sets the "embeddedICs" key).
static QKeySequence readBoundedKeySequence(QDataStream &stream)
Reads a QKeySequence from stream, rejecting an implausible/oversized internal key-combination count b...
static QVersionNumber readPandaHeader(QDataStream &stream)
Reads and validates the .panda circuit file header; returns the stored version number.
static QString loadDolphinFileName(QDataStream &stream, const QVersionNumber &version)
Returns the BeWavedDolphin waveform file name stored in stream at version.
static void writePayload(QDataStream &stream, const QByteArray &payload)
Compresses payload (qCompress) and writes it to stream.
static Preamble readPreamble(QDataStream &stream)
Reads the full .panda preamble: header, dolphin filename, rect, and metadata (V_4_5+).
static QByteArray readPayload(QDataStream &stream, const QVersionNumber &version)
Reads the remainder of stream's device, decompressing it first if version indicates the compressed-pa...
static QMap< QString, QVariant > readBoundedMetadata(QDataStream &stream)
Reads the file-level metadata QMap<QString,QVariant> from stream without calling QList::reserve() wit...
static QMap< QString, QByteArray > deserializeBlobRegistry(const QMap< QString, QVariant > &metadata, const QVersionNumber &fileVersion)
Extracts the embedded IC registry from a metadata map.
static void createVersionedBackup(const QString &fileName, const QVersionNumber &version)
Copies fileName to a versioned sidecar before overwriting it during migration.
static constexpr quint32 MAGIC_HEADER_CIRCUIT
static QRectF loadRect(QDataStream &stream, const QVersionNumber &version)
Returns the canvas viewport rectangle from the last saved session.
Bundles all per-deserialization state so that load() overrides receive it through one explicit parame...
Options passed to GraphicElement::save() (and friends); the save-side counterpart of SerializationCon...
Result of reading a .panda file preamble (header + dolphin + rect + metadata).
QMap< QString, QVariant > metadata