#pragma once #include #include #include class UpdateTransaction { public: UpdateTransaction(const QString& installDir, const QString& fromVersion, const QString& toVersion, int manifestId); bool initialize(); bool resumeExisting(QString* errorMessage = nullptr); bool recordVerifiedFiles(const QStringList& changedPaths, const QStringList& obsoletePaths); bool backupCurrentFiles(); bool installStagedFiles(QString* failedPath = nullptr); bool markAwaitingBootstrap(); bool markRollbackRequired(const QString& reason); bool markRolledBack(); bool markPostVerify(); bool rollback(QString* failedPath = nullptr); bool commit(); bool markFailed(const QString& errorCode, const QString& message); QString transactionId() const; QString fromVersion() const; QString stagingDir() const; QString backupDir() const; QStringList obsoletePaths() const; QString healthFile() const; static bool recoverInterrupted(const QString& installDir, QString* restoredVersion = nullptr, QString* errorMessage = nullptr); private: bool writeState(const QString& status, const QString& errorCode = QString(), const QString& message = QString()); bool copyOverwrite(const QString& source, const QString& destination) const; static bool safeRelativePath(const QString& path); QString m_installDir; QString m_updateDir; QString m_stateFile; QString m_transactionId; QString m_fromVersion; QString m_toVersion; int m_manifestId = 0; QString m_stagingDir; QString m_backupDir; QStringList m_changedPaths; QStringList m_obsoletePaths; QJsonObject m_state; };