/* Copyright (C) 2012 Sebastian Herbord. All rights reserved. This file is part of Mod Organizer. Mod Organizer is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Mod Organizer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ #ifndef SELFUPDATER_H #define SELFUPDATER_H #include #include class Archive; class NexusInterface; class PluginContainer; namespace MOBase { class IPluginGame; } #include #include #include #include #include //for qint64 class QNetworkReply; class QProgressDialog; class Settings; /** * @brief manages updates for Mod Organizer itself * This class is used to update the Mod Organizer * The process looks like this: * 1. call testForUpdate() to determine is available * 2. if the updateAvailable() signal is received, allow the user to start the update * 3. if the user start the update, call startUpdate() * 4. startUpdate() will first query a list of files, try to determine if there is an * incremental update. If not, the user will have to confirm the download of a full download. * Once the correct file is selected, it is downloaded. * 5. before the downloaded file is extracted, existing files that are going to be replaced are * moved to "update_backup" on because files that are currently open can't be replaced. * 6. the update is extracted and then deleted * 7. finally, a restart is requested via signal. * 8. at restart, Mod Organizer will remove the update_backup directory since none of the files * should now be open * * @todo use NexusBridge **/ class SelfUpdater : public QObject { Q_OBJECT public: /** * @brief constructor * * @param nexusInterface interface to query information from nexus * @param parent parent widget * @todo passing the nexus interface is unneccessary **/ explicit SelfUpdater(NexusInterface *nexusInterface); virtual ~SelfUpdater(); void setUserInterface(QWidget *widget); void setPluginContainer(PluginContainer *pluginContainer); /** * @brief request information about the current version **/ void testForUpdate(const Settings& settings); /** * @brief start the update process * @note this should not be called if there is no update available **/ void startUpdate(); /** * @return current version of Mod Organizer **/ MOBase::VersionInfo getVersion() const { return m_MOVersion; } signals: /** * @brief emitted if a restart of the client is necessary to complete the update **/ void restart(); /** * @brief emitted if an update is available **/ void updateAvailable(); /** * @brief emitted if a message of the day was received **/ void motdAvailable(const QString &motd); private: void openOutputFile(const QString &fileName); void download(const QString &downloadLink); void installUpdate(); void report7ZipError(const QString &errorMessage); void showProgress(); void closeProgress(); private slots: void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); void downloadReadyRead(); void downloadFinished(); void downloadCancel(); private: QWidget *m_Parent; MOBase::VersionInfo m_MOVersion; NexusInterface *m_Interface; QFile m_UpdateFile; QNetworkReply *m_Reply; QProgressDialog *m_Progress { nullptr }; bool m_Canceled; int m_Attempts; Archive *m_ArchiveHandler; GitHub m_GitHub; QJsonObject m_UpdateCandidate; }; #endif // SELFUPDATER_H