Commit 2993ee2a authored by twanvl's avatar twanvl

Added update checker

parent 1440ae5c
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <gui/control/card_list.hpp> #include <gui/control/card_list.hpp>
#include <gui/control/gallery_list.hpp> #include <gui/control/gallery_list.hpp>
#include <gui/about_window.hpp> #include <gui/about_window.hpp>
#include <gui/update_checker.hpp>
#include <gui/new_window.hpp> #include <gui/new_window.hpp>
#include <gui/icon_menu.hpp> #include <gui/icon_menu.hpp>
#include <util/window_id.hpp> #include <util/window_id.hpp>
...@@ -529,7 +530,7 @@ void SetWindow::onChildMenu(wxCommandEvent& ev) { ...@@ -529,7 +530,7 @@ void SetWindow::onChildMenu(wxCommandEvent& ev) {
void SetWindow::onIdle(wxIdleEvent& ev) { void SetWindow::onIdle(wxIdleEvent& ev) {
// Stuff that must be done in the main thread // Stuff that must be done in the main thread
handle_pending_errors(); handle_pending_errors();
// showUpdateDialog(this); show_update_dialog(this);
} }
// ----------------------------------------------------------------------------- : Event table // ----------------------------------------------------------------------------- : Event table
......
//+----------------------------------------------------------------------------+
//| Description: Magic Set Editor - Program to make Magic (tm) cards |
//| Copyright: (C) 2001 - 2006 Twan van Laarhoven |
//| License: GNU General Public License 2 or later (see file COPYING) |
//+----------------------------------------------------------------------------+
// ----------------------------------------------------------------------------- : Includes
#include <gui/update_checker.hpp>
#include <data/settings.hpp>
#include <util/version.hpp>
#include <wx/dialup.h>
#include <wx/url.h>
#include <wx/html/htmlwin.h>
DECLARE_POINTER_TYPE(VersionData);
// ----------------------------------------------------------------------------- : Update data
/// Information on the latest availible version
class VersionData {
public:
Version version; ///< Latest version number
String description; ///< html description
String new_updates_url; ///< updates url has moved?
DECLARE_REFLECTION();
};
IMPLEMENT_REFLECTION(VersionData) {
REFLECT(version);
REFLECT(description);
REFLECT(new_updates_url);
}
// The information for the latest version
VersionDataP update_version_data;
// Is update checking in progress?
volatile bool checking_updates = false;
// ----------------------------------------------------------------------------- : Update checking
// Thread to retrieve update information
// Checks if the current version is the latest version
// If not, displays a message
class CheckUpdateThread : public wxThread {
public:
virtual void* Entry() {
Work();
return 0;;
}
static void Work() {
if (checking_updates) return; // don't check multiple times simultaniously
checking_updates = true;
try {
wxURL url(settings.updates_url);
wxInputStream* isP = url.GetInputStream();
if (!isP) return; // failed to get data
InputStreamP is(isP);
// Read version data
VersionDataP version_data;
Reader reader(is, _("updates"));
reader.handle(version_data);
// has the updates url changed?
if (!version_data->new_updates_url.empty()) {
settings.updates_url = version_data->new_updates_url;
}
// Make available
update_version_data = version_data;
} catch (...) {
// ignore all errors, we don't want problems if update checking fails
}
checking_updates = false;
}
};
void check_updates() {
if (settings.check_updates == CHECK_ALWAYS) {
check_updates_now();
} else if (settings.check_updates == CHECK_IF_CONNECTED) {
// only if internet connection exists
wxDialUpManager* dum = wxDialUpManager::Create();
if (dum->IsOk() && dum->IsOnline()) {
check_updates_now();
}
delete dum;
}
}
void check_updates_now(bool async) {
wxSocketBase::Initialize();
if (async) {
CheckUpdateThread* thread = new CheckUpdateThread;
thread->Create();
thread->Run();
} else {
CheckUpdateThread::Work();
}
}
// ----------------------------------------------------------------------------- : Dialog
// A HTML control that opens all pages in an actual browser
struct HtmlWindowToBrowser : public wxHtmlWindow {
HtmlWindowToBrowser(Window* parent, int id, const wxPoint& pos, const wxSize& size, long flags)
: wxHtmlWindow(parent, id, pos, size, flags)
{}
virtual void OnLinkClicked(const wxHtmlLinkInfo& info) {
wxLaunchDefaultBrowser( info.GetHref() );
}
};
void show_update_dialog(Window* parent) {
if (!update_version_data) return;
if (update_version_data->version <= app_version) return; // we already have the latest version
// Show update dialog
wxDialog* dlg = new wxDialog(parent, wxID_ANY, _("Updates availible"), wxDefaultPosition);
// controls
wxHtmlWindow* html = new HtmlWindowToBrowser(dlg, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO | wxSUNKEN_BORDER);
html->SetPage(update_version_data->description);
wxButton* close = new wxButton(dlg, wxID_OK, _("&Close"));
close->SetDefault();
// layout
wxSizer* s = new wxBoxSizer(wxVERTICAL);
s->Add(html, 1, wxEXPAND | wxALL, 8);
s->Add(close, 0, wxALIGN_RIGHT | wxALL & ~wxTOP, 8);
dlg->SetSizer(s);
dlg->SetSize(400,400);
dlg->Show();
// And never show it again this run
update_version_data = VersionDataP();
}
//+----------------------------------------------------------------------------+
//| Description: Magic Set Editor - Program to make Magic (tm) cards |
//| Copyright: (C) 2001 - 2006 Twan van Laarhoven |
//| License: GNU General Public License 2 or later (see file COPYING) |
//+----------------------------------------------------------------------------+
#ifndef HEADER_UTIL_UPDATE_CHECKER
#define HEADER_UTIL_UPDATE_CHECKER
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
// ----------------------------------------------------------------------------- : Update checking
// Checks for updates if the settings say so
void check_updates();
/// Checks if the current version is the latest version
/** If async==true then checking is done in another thread
*/
void check_updates_now(bool async = true);
/// Show a dialog to inform the user that updates are availible (if there are any)
/** Call check_updates first.
* Call this function from an onIdle loop */
void show_update_dialog(Window* parent);
// ----------------------------------------------------------------------------- : EOF
#endif
...@@ -13,8 +13,10 @@ ...@@ -13,8 +13,10 @@
#include <data/settings.hpp> #include <data/settings.hpp>
#include <data/format/formats.hpp> #include <data/format/formats.hpp>
#include <gui/welcome_window.hpp> #include <gui/welcome_window.hpp>
#include <gui/update_checker.hpp>
#include <gui/set/window.hpp> #include <gui/set/window.hpp>
#include <gui/symbol/window.hpp> #include <gui/symbol/window.hpp>
#include <wx/fs_inet.h>
// ----------------------------------------------------------------------------- : Main function/class // ----------------------------------------------------------------------------- : Main function/class
...@@ -39,9 +41,12 @@ bool MSE::OnInit() { ...@@ -39,9 +41,12 @@ bool MSE::OnInit() {
try { try {
SetAppName(_("Magic Set Editor")); SetAppName(_("Magic Set Editor"));
wxInitAllImageHandlers(); wxInitAllImageHandlers();
wxFileSystem::AddHandler(new wxInternetFSHandler); // needed for update checker
init_file_formats(); init_file_formats();
packages.init(); packages.init();
settings.read(); settings.read();
// check for updates
check_updates();
//Window* wnd = new SymbolWindow(nullptr); //Window* wnd = new SymbolWindow(nullptr);
//GameP g = Game::byName(_("magic")) //GameP g = Game::byName(_("magic"))
SetP s = new_shared<Set>(); SetP s = new_shared<Set>();
......
...@@ -178,7 +178,7 @@ ...@@ -178,7 +178,7 @@
Name="VCCustomBuildTool"/> Name="VCCustomBuildTool"/>
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="rpcrt4.lib wsock32.lib comctl32.lib wxbase26ud.lib wxmsw26ud_core.lib wxjpegd.lib wxpngd.lib wxtiffd.lib wxzlibd.lib wxregexud.lib" AdditionalDependencies="rpcrt4.lib wsock32.lib comctl32.lib wxbase26ud.lib wxmsw26ud_core.lib wxjpegd.lib wxpngd.lib wxtiffd.lib wxzlibd.lib wxregexud.lib wxbase26ud_net.lib wxmsw26ud_html.lib"
OutputFile="$(OutDir)/mse.exe" OutputFile="$(OutDir)/mse.exe"
LinkIncremental="2" LinkIncremental="2"
IgnoreDefaultLibraryNames="libcd.lib,libcid.lib" IgnoreDefaultLibraryNames="libcd.lib,libcid.lib"
...@@ -580,6 +580,12 @@ ...@@ -580,6 +580,12 @@
<File <File
RelativePath=".\gui\new_window.hpp"> RelativePath=".\gui\new_window.hpp">
</File> </File>
<File
RelativePath=".\gui\update_checker.cpp">
</File>
<File
RelativePath=".\gui\update_checker.hpp">
</File>
<File <File
RelativePath=".\gui\welcome_window.cpp"> RelativePath=".\gui\welcome_window.cpp">
</File> </File>
......
...@@ -25,7 +25,10 @@ struct Version { ...@@ -25,7 +25,10 @@ struct Version {
Version() : version(0) {} Version() : version(0) {}
Version(UInt version) : version(version) {} Version(UInt version) : version(version) {}
inline bool operator < (Version v) const { return version < v.version; } inline bool operator < (Version v) const { return version < v.version; }
inline bool operator <= (Version v) const { return version <= v.version; }
inline bool operator > (Version v) const { return version > v.version; }
inline bool operator >= (Version v) const { return version >= v.version; }
/// Convert a version number to a string /// Convert a version number to a string
String toString() const; String toString() const;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment