From 9adbae0a8edee6724708f5d5043b72354a15a0ce Mon Sep 17 00:00:00 2001 From: Taka Date: Tue, 3 Nov 2020 01:02:11 +0000 Subject: [PATCH] Changed how the VASSAL shim saves scenarios. --- vassal-shim/release/vassal-shim.jar | Bin 34913 -> 34550 bytes .../src/vassal_shim/DummyLauncher.java | 19 ++++ vassal-shim/src/vassal_shim/VassalShim.java | 95 +++++------------- 3 files changed, 45 insertions(+), 69 deletions(-) create mode 100644 vassal-shim/src/vassal_shim/DummyLauncher.java diff --git a/vassal-shim/release/vassal-shim.jar b/vassal-shim/release/vassal-shim.jar index c32a82036bde679f546317c08d84403465b53489..36459f47e2cbaf0959b2a6273d30cbd8f2976d9d 100644 GIT binary patch delta 18282 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 WQ<@5jvXDw}01mvC1ppHLhyTCbGMN_u diff --git a/vassal-shim/src/vassal_shim/DummyLauncher.java b/vassal-shim/src/vassal_shim/DummyLauncher.java new file mode 100644 index 0000000..6e21415 --- /dev/null +++ b/vassal-shim/src/vassal_shim/DummyLauncher.java @@ -0,0 +1,19 @@ +package vassal_shim ; + +import VASSAL.launch.Launcher ; +import VASSAL.tools.menu.MenuManager ; +import java.io.IOException ; + +// -------------------------------------------------------------------- + +class DummyLauncher extends Launcher +{ + public DummyLauncher() { + // FUDGE! The Launcher constructor does a lot of program initialization (which + // causes crashes), but running in stand-alone mode stops that from happening. + super( new String[]{ "--standalone" } ) ; + } + + protected MenuManager createMenuManager() { return null ; } + protected void launch() throws IOException {} +} diff --git a/vassal-shim/src/vassal_shim/VassalShim.java b/vassal-shim/src/vassal_shim/VassalShim.java index 7742668..3d5160b 100644 --- a/vassal-shim/src/vassal_shim/VassalShim.java +++ b/vassal-shim/src/vassal_shim/VassalShim.java @@ -1,11 +1,11 @@ package vassal_shim ; +import java.lang.reflect.Field ; import java.io.File ; import java.io.FileInputStream ; import java.io.InputStream ; import java.io.InputStreamReader ; import java.io.FileOutputStream ; -import java.io.OutputStream ; import java.io.BufferedReader ; import java.io.IOException ; import java.io.FileNotFoundException ; @@ -32,6 +32,7 @@ import javax.xml.parsers.ParserConfigurationException ; import javax.xml.transform.TransformerException ; import javax.xml.transform.TransformerConfigurationException ; import javax.xml.xpath.XPathExpressionException ; +import javax.swing.Action ; import org.w3c.dom.Document ; import org.w3c.dom.NodeList ; import org.w3c.dom.Node ; @@ -43,19 +44,15 @@ import org.slf4j.LoggerFactory ; import VASSAL.build.GameModule ; import VASSAL.build.GpIdChecker ; import VASSAL.build.module.GameState ; -import VASSAL.build.module.GameComponent ; import VASSAL.build.module.BasicLogger.LogCommand ; import VASSAL.build.module.ModuleExtension ; import VASSAL.build.module.ObscurableOptions ; -import VASSAL.build.module.metadata.SaveMetaData ; import VASSAL.build.module.Chatter.DisplayText ; import VASSAL.build.widget.PieceSlot ; import VASSAL.launch.BasicModule ; import VASSAL.command.Command ; import VASSAL.command.AddPiece ; import VASSAL.command.RemovePiece ; -import VASSAL.command.ConditionalCommand ; -import VASSAL.command.AlertCommand ; import VASSAL.build.module.map.boardPicker.Board ; import VASSAL.counters.GamePiece ; import VASSAL.counters.BasicPiece ; @@ -65,12 +62,6 @@ import VASSAL.counters.PieceCloner ; import VASSAL.preferences.Prefs ; import VASSAL.tools.DataArchive ; import VASSAL.tools.DialogUtils ; -import VASSAL.tools.io.FileArchive ; -import VASSAL.tools.io.IOUtils ; -import VASSAL.tools.io.FastByteArrayOutputStream ; -import VASSAL.tools.io.ObfuscatingOutputStream ; -import VASSAL.tools.io.ZipArchive ; -import VASSAL.i18n.Resources ; import vassal_shim.lfa.* ; @@ -1062,68 +1053,34 @@ public class VassalShim String PROMPT_LOG_COMMENT = "promptLogComment"; prefs.setValue( PROMPT_LOG_COMMENT, false ) ; - // FUDGE! We would like to just call GameState.saveGame(), but it calls getRestoreCommand(), - // which does nothing unless the "save game" menu action has been enabled!?! Due to Java protections, - // there doesn't seem to be any way to get at this object and enable it, so we have to re-implement - // the whole saveGame() code without this check :-/ - - // get the save string - Command cmd = getRestoreCommand() ; - String saveString = GameModule.getGameModule().encode( cmd ) ; + // get the GameState + GameState gameState = GameModule.getGameModule().getGameState() ; - // save the scenario - logger.info( "Saving scenario: {}", saveFilename ) ; - final FastByteArrayOutputStream ba = new FastByteArrayOutputStream() ; - OutputStream out = null ; + // FUDGE! GameState.saveGame() calls Launcher.getInstance().sendSaveCmd() to notify listeners + // that the save was successful (which is a bit annoying, since the game has already been saved + // at this point, and nobody's listening :-/), which means that we need to install a Launcher. + // Note that even if we use reflection to gain access to the private "instance" member variable, + // we still need to set it to be a Launcher-derived object, and since the Launcher constructor + // sets this "instance" member variable, all we actually need to do is instantiate the object. + new DummyLauncher() ; + + // NOTE: We had problems in earlier versions with the GameState.saveGame menu item being disabled, + // which caused problems since GameState.saveGame() ends up in getRestoreCommand(), which doesn't + // do anything if this menu item is disabled. However, when we upgraded to support VASSAL 3.3.0+, + // this menu item seems to be enabled, but I suspect there's a race condition in there somewhere, + // so for safety, we explicitly enable the menu item. try { - out = new ObfuscatingOutputStream( ba ) ; - out.write( saveString.getBytes( "UTF-8" ) ) ; - out.close() ; - } - finally { - IOUtils.closeQuietly( out ) ; - } - FileArchive archive = null ; - try { - archive = new ZipArchive( new File( saveFilename ) ) ; - String SAVEFILE_ZIP_ENTRY = "savedGame" ; //$NON-NLS-1$ - archive.add( SAVEFILE_ZIP_ENTRY, ba.toInputStream() ) ; - (new SaveMetaData()).save( archive ) ; - archive.close() ; - } - finally { - IOUtils.closeQuietly( archive ) ; + Field field = GameState.class.getDeclaredField( "saveGame" ) ; + field.setAccessible( true ) ; + Action saveGameAction = (Action) field.get( gameState ) ; + saveGameAction.setEnabled( true ) ; + } catch( NoSuchFieldException | IllegalAccessException ex ) { + // NOTE: We're enabling the menu item to be on the safe side (things seems to work even if + // we don't do it), so if something fails, we try to keep going. } - } - - private static Command getRestoreCommand() // nb: taken from GameState.getRestoreCommand() - { - // NOTE: This is the check that's causing the problem :-/ - // if (!saveGame.isEnabled()) { - // return null; - // } - - GameState gameState = GameModule.getGameModule().getGameState() ; - Command c = new GameState.SetupCommand(false); - c.append(checkVersionCommand()); - c.append( gameState.getRestorePiecesCommand() ); - for (GameComponent gc : gameState.getGameComponents()) { - c.append(gc.getRestoreCommand()); - } - c.append(new GameState.SetupCommand(true)); - return c; - } - private static Command checkVersionCommand() { - // NOTE: This is the same as GameState.checkVersionCommand(), but we can't call that since it's private :-/ - String runningVersion = GameModule.getGameModule().getAttributeValueString(GameModule.VASSAL_VERSION_RUNNING); - ConditionalCommand.Condition cond = new ConditionalCommand.Lt(GameModule.VASSAL_VERSION_RUNNING, runningVersion); - Command c = new ConditionalCommand(new ConditionalCommand.Condition[]{cond}, new AlertCommand(Resources.getString("GameState.version_mismatch", runningVersion))); //$NON-NLS-1$ - String moduleName = GameModule.getGameModule().getAttributeValueString(GameModule.MODULE_NAME); - String moduleVersion = GameModule.getGameModule().getAttributeValueString(GameModule.MODULE_VERSION); - cond = new ConditionalCommand.Lt(GameModule.MODULE_VERSION, moduleVersion); - c.append(new ConditionalCommand(new ConditionalCommand.Condition[]{cond}, new AlertCommand(Resources.getString("GameState.version_mismatch2", moduleName, moduleVersion )))); //$NON-NLS-1$ - return c; + // save the game + gameState.saveGame( new File( saveFilename ) ) ; } private Command loadScenario( String scenarioFilename ) throws IOException