From 30e18663f6b7fc044cee28b7df9d0f276622500c Mon Sep 17 00:00:00 2001 From: coppro Date: Tue, 25 Sep 2007 23:28:12 +0000 Subject: [PATCH] Added some new update code (YET TO BE TESTED) and some fixes to the VS templates. Still looking to find one source of a reference to "futsymbol_artifact.png" (case-sensitive) git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@757 0fc631ac-6414-0410-93d0-97cfa31319b6 --- data/vs-alter.mse-style/style | 2 +- data/vs-extended-art.mse-style/style | 2 +- data/vs-extended-hellboy.mse-style/style | 2 +- data/vs-hellboy.mse-style/style | 2 +- data/vs-new.mse-style/style | 6 +- .../{F4.png => f4.png} | Bin data/vs-standard.mse-style/style | 2 +- data/vs.mse-game/game | 7 +- src/data/installer.cpp | 16 +++-- src/data/installer.hpp | 2 +- src/gui/update_checker.cpp | 64 ++++++++++++++++-- src/gui/update_checker.hpp | 2 +- src/util/io/package_manager.hpp | 5 ++ 13 files changed, 88 insertions(+), 24 deletions(-) rename data/vs-standard-new.mse-symbol-font/{F4.png => f4.png} (100%) diff --git a/data/vs-alter.mse-style/style b/data/vs-alter.mse-style/style index c92d6a65..08b5b30c 100644 --- a/data/vs-alter.mse-style/style +++ b/data/vs-alter.mse-style/style @@ -164,7 +164,7 @@ card style: visible: script: styling.watermarkings render style: image - include file: vs-common.mse-include/watermarks + include file: /vs-common.mse-include/watermarks z index: 4 ############################# Attack/defence diff --git a/data/vs-extended-art.mse-style/style b/data/vs-extended-art.mse-style/style index 1d70aee7..c21af62a 100644 --- a/data/vs-extended-art.mse-style/style +++ b/data/vs-extended-art.mse-style/style @@ -345,7 +345,7 @@ card style: visible: script: styling.watermarkings render style: image - include file: vs-common.mse-include/watermarks + include file: /vs-common.mse-include/watermarks z index: 4 ############################# Atack/defence diff --git a/data/vs-extended-hellboy.mse-style/style b/data/vs-extended-hellboy.mse-style/style index 01bb2c72..3d68bf28 100644 --- a/data/vs-extended-hellboy.mse-style/style +++ b/data/vs-extended-hellboy.mse-style/style @@ -345,7 +345,7 @@ card style: visible: script: styling.watermarkings render style: image - include file: vs-common.mse-include/watermarks + include file: /vs-common.mse-include/watermarks z index: 4 ############################# Atack/defence diff --git a/data/vs-hellboy.mse-style/style b/data/vs-hellboy.mse-style/style index d8399dcf..098d8557 100644 --- a/data/vs-hellboy.mse-style/style +++ b/data/vs-hellboy.mse-style/style @@ -364,7 +364,7 @@ card style: visible: script: styling.watermarkings render style: image - include file: vs-common.mse-include/watermarks + include file: /vs-common.mse-include/watermarks z index: 4 ############################# Atack/defence diff --git a/data/vs-new.mse-style/style b/data/vs-new.mse-style/style index 3085cdd4..995d87cb 100644 --- a/data/vs-new.mse-style/style +++ b/data/vs-new.mse-style/style @@ -342,7 +342,7 @@ card style: visible: script: styling.watermarkings render style: image - include file: vs-common.mse-include/watermarks + include file: /vs-common.mse-include/watermarks z index: 4 @@ -447,7 +447,7 @@ extra card field: name: affiliation editable: false initial: none - include file: vs-common.mse-include/watermark-names + include file: /vs-common.mse-include/watermark-names extra card style: playarea: @@ -505,4 +505,4 @@ extra card style: z index: 5 alignment: middle right render style: image - include file: vs-common.mse-include/affiliations + include file: /vs-common.mse-include/affiliations diff --git a/data/vs-standard-new.mse-symbol-font/F4.png b/data/vs-standard-new.mse-symbol-font/f4.png similarity index 100% rename from data/vs-standard-new.mse-symbol-font/F4.png rename to data/vs-standard-new.mse-symbol-font/f4.png diff --git a/data/vs-standard.mse-style/style b/data/vs-standard.mse-style/style index efed9317..ece27e05 100644 --- a/data/vs-standard.mse-style/style +++ b/data/vs-standard.mse-style/style @@ -367,7 +367,7 @@ card style: visible: script: styling.watermarkings render style: image - include file: vs-common.mse-include/watermarks + include file: /vs-common.mse-include/watermarks z index: 4 diff --git a/data/vs.mse-game/game b/data/vs.mse-game/game index ed413e86..dc9eaefd 100644 --- a/data/vs.mse-game/game +++ b/data/vs.mse-game/game @@ -4,6 +4,9 @@ short name: VS icon: card-back.png version: 2007-09-23 position hint: 3 +depends on: + package: vs-common.mse-include + version: 2007-09-23 ############################################################## Functions & filters # General functions @@ -606,7 +609,7 @@ card field: card field: type: choice name: watermark - include file: vs-common.mse-include/watermark-names + include file: /vs-common.mse-include/watermark-names editable: false description: The Watermark for this set. @@ -828,4 +831,4 @@ keyword: keyword: Substitute match: Substitute mode: real - reminder: Reveal this card -> You may remove from the game a ready character you control with cost greater than or equal to the cost of this card. If you do, put this card into play. Use only if this card is in your hand and only during your recruit step." \ No newline at end of file + reminder: Reveal this card -> You may remove from the game a ready character you control with cost greater than or equal to the cost of this card. If you do, put this card into play. Use only if this card is in your hand and only during your recruit step." diff --git a/src/data/installer.cpp b/src/data/installer.cpp index 2b3c6c6e..ef5e1c38 100644 --- a/src/data/installer.cpp +++ b/src/data/installer.cpp @@ -62,7 +62,7 @@ struct dependency_check : public unary_function { PackageDependencyP dep; }; -void Installer::install(bool local) { +void Installer::install(bool local, bool check_dependencies) { // Destination directory String install_dir = local ? ::packages.getLocalDataDir() : ::packages.getGlobalDataDir(); if (!wxDirExists(install_dir)) { @@ -92,12 +92,14 @@ void Installer::install(bool local) { new_packages.push_back(pack); } - // Check dependencies for each and every package. - FOR_EACH(p, new_packages) { - FOR_EACH(d, p->dependencies) { - if (find_if(new_packages.begin(), new_packages.end(), dependency_check(d)) == new_packages.end() && - !::packages.checkDependency(*d, false)) { - throw PackageError(_("Unmet dependency for package ") + p->relativeFilename() + _(": ") + d->package + _(", version ") + d->version.toString() + _(" or higher.")); + if (check_dependencies) { + // Check dependencies for each and every package. + FOR_EACH(p, new_packages) { + FOR_EACH(d, p->dependencies) { + if (find_if(new_packages.begin(), new_packages.end(), dependency_check(d)) == new_packages.end() && + !::packages.checkDependency(*d, false)) { + throw PackageError(_("Unmet dependency for package ") + p->relativeFilename() + _(": ") + d->package + _(", version ") + d->version.toString() + _(" or higher.")); + } } } } diff --git a/src/data/installer.hpp b/src/data/installer.hpp index b6bee733..241b51c3 100644 --- a/src/data/installer.hpp +++ b/src/data/installer.hpp @@ -37,7 +37,7 @@ class Installer : public Packaged { /// Load an installer from a file, and run it static void installFrom(const String& filename, bool message_on_success, bool local); /// Install all the packages - void install(bool local); + void install(bool local, bool check_dependencies = true); /// Install a specific package void install(const String& package); diff --git a/src/gui/update_checker.cpp b/src/gui/update_checker.cpp index 35c93f47..2c7cdeab 100644 --- a/src/gui/update_checker.cpp +++ b/src/gui/update_checker.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -17,8 +18,11 @@ #include #include #include +#include +#include DECLARE_POINTER_TYPE(PackageVersionData); +DECLARE_POINTER_TYPE(Installer); DECLARE_POINTER_TYPE(VersionData); DECLARE_TYPEOF_COLLECTION(PackageVersionDataP); @@ -358,6 +362,10 @@ UpdatesWindow::UpdatesWindow() SetSizer(v); } +UpdatesWindow::~UpdatesWindow() { + (new WelcomeWindow)->Show(); +} + void UpdatesWindow::onUpdateCheckFinished(wxCommandEvent&) { setDefaultPackageStatus(); } @@ -405,9 +413,53 @@ void UpdatesWindow::onActionChange(wxCommandEvent& ev) { } void UpdatesWindow::onApplyChanges(wxCommandEvent& ev) { + list to_install, to_remove; + FOR_EACH(pack, update_version_data->packages) { - PackageAction action = package_data[pack].second; + switch (package_data[pack].second) { + case ACTION_INSTALL: + to_install.push_back(pack); + break; + case ACTION_UPGRADE: + to_install.push_back(pack); + case ACTION_UNINSTALL: + to_remove.push_back(pack); + default:; + } } + + FOR_EACH(pack, to_remove) { + wxFileName filename (packages.openAny(pack->name, true)->absoluteFilename()); + if (filename.DirExists()) { + // TODO: Recursive removal of directory. + } else { + if (!wxRemoveFile(filename.GetFullPath())) + handle_error(_("Cannot delete ") + filename.GetFullPath() + _(" to remove package ") + pack->name + _(". " + "Other packages may have been removed, including packages that this on is dependent on. Please remove manually.")); + } + } + + FOR_EACH(pack, to_install) { + wxURL url(pack->url); + wxInputStream* is = url.GetInputStream(); + if (!is) { + handle_error(_("Cannot fetch file ") + pack->url + _(" to install package ") + pack->name + _(". " + "Other packages may have been installed, including packages that depend on this one. " + "Please remove those packages manually or install this one manually.")); + } + wxZipInputStream zis(is); + InstallerP inst(new Installer); + + inst->openZipStream(&zis); + inst->install(isInstallLocal(settings.install_type), false); + delete is; + } + + setDefaultPackageStatus(); + updateButtons(package_list->GetSelection()); + package_list->Refresh(); + + packages.clearPackageCache(); } void UpdatesWindow::updateButtons(int id) { @@ -446,9 +498,9 @@ void UpdatesWindow::setDefaultPackageStatus() { FOR_EACH(p, update_version_data->packages) { PackagedP pack; try { pack = packages.openAny(p->name, true); } - catch (const PackageError&) { } // We couldn't open a package... wonder why? + catch (PackageNotFoundError&) { } // We couldn't open a package... no cause for alarm - if (!pack) { + if (!pack || !(wxFileExists(pack->absoluteFilename()) || wxDirExists(pack->absoluteFilename()))) { // not installed if (p->app_version > file_version) { package_data[p] = PackageData(STATUS_NOT_INSTALLED, ACTION_NEW_MSE); @@ -512,7 +564,7 @@ void UpdatesWindow::RemovePackageDependencies (PackageVersionDataP pack) { if (status != STATUS_NOT_INSTALLED) action = ACTION_UNINSTALL; else // status == STATUS_NOT_INSTALLED - action = p->app_version > file_version ? ACTION_NOTHING : ACTION_NEW_MSE; + action = p->app_version > file_version ? ACTION_NEW_MSE : ACTION_NOTHING; break; } } @@ -545,6 +597,8 @@ void UpdatesWindow::DowngradePackageDependencies (PackageVersionDataP pack) { // TODO: Decide what to do if a dependency can't be met. // It shouldn't happen with a decently maintained updates list. // But it could, and we need to decide what to do in this situation. + // Ideally, some sort of error should occur, such that we don't have packages + // with unmet dependencies. } FOR_EACH(p, update_version_data->packages) { @@ -558,7 +612,7 @@ void UpdatesWindow::DowngradePackageDependencies (PackageVersionDataP pack) { if (status != STATUS_NOT_INSTALLED) action = ACTION_UNINSTALL; else // status == STATUS_NOT_INSTALLED - action = p->app_version > file_version ? ACTION_NOTHING : ACTION_NEW_MSE; + action = p->app_version > file_version ? ACTION_NEW_MSE : ACTION_NOTHING; break; } } diff --git a/src/gui/update_checker.hpp b/src/gui/update_checker.hpp index ea2079ad..6e47bc6a 100644 --- a/src/gui/update_checker.hpp +++ b/src/gui/update_checker.hpp @@ -40,7 +40,7 @@ DECLARE_POINTER_TYPE(PackageVersionData); class UpdatesWindow : public Frame { public: UpdatesWindow(); - ~UpdatesWindow() { (new WelcomeWindow)->Show(); } + ~UpdatesWindow(); void DrawTitles(wxPaintEvent&); diff --git a/src/util/io/package_manager.hpp b/src/util/io/package_manager.hpp index 2af2db86..fc2616cf 100644 --- a/src/util/io/package_manager.hpp +++ b/src/util/io/package_manager.hpp @@ -78,6 +78,11 @@ class PackageManager { /// Check if the given dependency is currently installed bool checkDependency(const PackageDependency& dep, bool report_errors = true); + /// Clear that cache of opened packages + /** Used by the update manager + */ + inline void clearPackageCache() { loaded_packages.clear(); } + inline String getGlobalDataDir() const { return global_data_directory; } inline String getLocalDataDir() const { return local_data_directory; }