File indexing completed on 2024-06-23 04:23:34

0001 /*
0002  *  SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef __KIS_OFFSET_ON_EXIT_VERIFIER_H
0008 #define __KIS_OFFSET_ON_EXIT_VERIFIER_H
0009 
0010 #include "kritapsdutils_export.h"
0011 
0012 #include <QIODevice>
0013 #include <QString>
0014 #include <kis_debug.h>
0015 
0016 //#define DEBUG_OFFSET_ON_EXIT
0017 
0018 /**
0019  * Check if the position of \p device has moved further by
0020  * \p expectedOffset and correct it if needed. It also issues
0021  * a warning if needed.
0022  */
0023 
0024 class KRITAPSDUTILS_EXPORT KisOffsetOnExitVerifier
0025 {
0026 public:
0027     KisOffsetOnExitVerifier(QIODevice &device, qint64 expectedOffset, int maxPadding, const QString &objectName = "", const QString &domain = "")
0028         : m_device(device)
0029         , m_maxPadding(maxPadding)
0030         , m_domain(domain)
0031         , m_objectName(objectName)
0032     {
0033         m_expectedPos = m_device.pos() + expectedOffset;
0034     }
0035 
0036     ~KisOffsetOnExitVerifier()
0037     {
0038         if (m_device.pos() < m_expectedPos - m_maxPadding || m_device.pos() > m_expectedPos) {
0039 #ifdef DEBUG_OFFSET_ON_EXIT
0040 
0041             QString msg = QString("Incorrect offset on exit %1, expected %2!").arg(m_device.pos()).arg(m_expectedPos);
0042 
0043             warnKrita << "*** |" << m_objectName << msg;
0044             warnKrita << "    |" << m_domain;
0045 
0046 #endif /* DEBUG_OFFSET_ON_EXIT */
0047 
0048             m_device.seek(m_expectedPos);
0049         }
0050     }
0051 
0052 private:
0053     QIODevice &m_device;
0054     int m_maxPadding;
0055     qint64 m_expectedPos;
0056     QString m_domain;
0057     QString m_objectName;
0058 };
0059 
0060 #define SETUP_OFFSET_VERIFIER(name, device, expectedOffset, maxPadding)                                                                                        \
0061     KisOffsetOnExitVerifier name(device, expectedOffset, maxPadding, QString(#name), QString(__FILE__) + ":" + QString::number(__LINE__))
0062 
0063 #endif /* __KIS_OFFSET_ON_EXIT_VERIFIER_H */