aboutsummaryrefslogtreecommitdiff
path: root/Src/external_dependencies/openmpt-trunk/mptrack/UpdateCheck.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/external_dependencies/openmpt-trunk/mptrack/UpdateCheck.h')
-rw-r--r--Src/external_dependencies/openmpt-trunk/mptrack/UpdateCheck.h185
1 files changed, 185 insertions, 0 deletions
diff --git a/Src/external_dependencies/openmpt-trunk/mptrack/UpdateCheck.h b/Src/external_dependencies/openmpt-trunk/mptrack/UpdateCheck.h
new file mode 100644
index 00000000..337be2c2
--- /dev/null
+++ b/Src/external_dependencies/openmpt-trunk/mptrack/UpdateCheck.h
@@ -0,0 +1,185 @@
+/*
+ * UpdateCheck.h
+ * -------------
+ * Purpose: Class for easy software update check.
+ * Notes : (currently none)
+ * Authors: OpenMPT Devs
+ * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
+ */
+
+
+#pragma once
+
+#include "openmpt/all/BuildSettings.hpp"
+
+#include "mpt/uuid/uuid.hpp"
+
+#include <time.h>
+
+#include <atomic>
+
+#include "resource.h"
+#include "Settings.h"
+
+OPENMPT_NAMESPACE_BEGIN
+
+
+#if defined(MPT_ENABLE_UPDATE)
+
+
+namespace HTTP {
+class InternetSession;
+}
+
+enum UpdateChannel : uint32
+{
+ UpdateChannelRelease = 1,
+ UpdateChannelNext = 2,
+ UpdateChannelDevelopment = 3,
+};
+
+struct UpdateCheckResult
+{
+ time_t CheckTime = time_t{};
+ std::vector<std::byte> json;
+ bool IsFromCache() const noexcept { return CheckTime == time_t{}; }
+};
+
+class CUpdateCheck
+{
+
+private:
+
+ static std::atomic<int32> s_InstanceCount;
+
+public:
+
+ static mpt::ustring GetStatisticsUserInformation(bool shortText);
+
+ static std::vector<mpt::ustring> GetDefaultUpdateSigningKeysRootAnchors();
+ static mpt::ustring GetDefaultAPIURL();
+
+ int32 GetNumCurrentRunningInstances();
+
+ static bool IsSuitableUpdateMoment();
+
+ static void DoAutoUpdateCheck() { StartUpdateCheckAsync(true); }
+ static void DoManualUpdateCheck() { StartUpdateCheckAsync(false); }
+
+public:
+
+ struct Context
+ {
+ CWnd *window;
+ UINT msgStart;
+ UINT msgProgress;
+ UINT msgSuccess;
+ UINT msgFailure;
+ UINT msgCanceled;
+ bool autoUpdate;
+ bool loadPersisted;
+ std::string statistics;
+ };
+
+ struct Settings
+ {
+ int32 periodDays;
+ UpdateChannel channel;
+ mpt::PathString persistencePath;
+ mpt::ustring apiURL;
+ bool sendStatistics;
+ mpt::UUID statisticsUUID;
+ Settings();
+ };
+
+ class Error
+ : public std::runtime_error
+ {
+ private:
+ CString m_Message;
+ public:
+ Error(CString errorMessage);
+ Error(CString errorMessage, DWORD errorCode);
+ CString GetMessage() const;
+ protected:
+ static CString FormatErrorCode(CString errorMessage, DWORD errorCode);
+ };
+
+ class Cancel
+ : public std::exception
+ {
+ public:
+ Cancel();
+ };
+
+ static bool IsAutoUpdateFromMessage(WPARAM wparam, LPARAM lparam);
+
+ static const UpdateCheckResult &MessageAsResult(WPARAM wparam, LPARAM lparam);
+ static const CUpdateCheck::Error &MessageAsError(WPARAM wparam, LPARAM lparam);
+
+ static void AcknowledgeSuccess(const UpdateCheckResult &result);
+
+ static void ShowSuccessGUI(const bool autoUpdate, const UpdateCheckResult &result);
+ static void ShowFailureGUI(const bool autoUpdate, const CUpdateCheck::Error &error);
+
+public:
+
+ // v3
+ static std::string GetStatisticsDataV3(const Settings &settings); // UTF8
+
+protected:
+
+ static void StartUpdateCheckAsync(bool autoUpdate);
+
+ struct ThreadFunc
+ {
+ CUpdateCheck::Settings settings;
+ CUpdateCheck::Context context;
+ ThreadFunc(const CUpdateCheck::Settings &settings, const CUpdateCheck::Context &context);
+ void operator () ();
+ };
+
+ static void CheckForUpdate(const CUpdateCheck::Settings &settings, const CUpdateCheck::Context &context);
+
+ static UpdateCheckResult SearchUpdate(const CUpdateCheck::Context &context, const CUpdateCheck::Settings &settings, const std::string &statistics); // may throw
+
+ static void CleanOldUpdates(const CUpdateCheck::Settings &settings, const CUpdateCheck::Context &context);
+
+ static void SendStatistics(HTTP::InternetSession &internet, const CUpdateCheck::Settings &settings, const std::string &statistics); // may throw
+
+ static UpdateCheckResult SearchUpdateModern(HTTP::InternetSession &internet, const CUpdateCheck::Settings &settings); // may throw
+
+};
+
+
+class CUpdateSetupDlg: public CPropertyPage
+ , public ISettingChanged
+{
+public:
+ CUpdateSetupDlg();
+
+public:
+ void SettingChanged(const SettingPath &changedPath) override;
+
+protected:
+ void DoDataExchange(CDataExchange *pDX) override;
+ BOOL OnInitDialog() override;
+ void OnOK() override;
+ BOOL OnSetActive() override;
+
+ afx_msg void OnSettingsChanged();
+ afx_msg void OnCheckNow();
+ afx_msg void OnShowStatisticsData(NMHDR * /*pNMHDR*/, LRESULT * /*pResult*/);
+ void EnableDisableDialog();
+ DECLARE_MESSAGE_MAP()
+
+private:
+ SettingChangedNotifyGuard m_SettingChangedNotifyGuard;
+ CComboBox m_CbnUpdateFrequency;
+};
+
+
+#endif // MPT_ENABLE_UPDATE
+
+
+OPENMPT_NAMESPACE_END