diff --git a/forge-gui-desktop/src/main/java/forge/control/FControl.java b/forge-gui-desktop/src/main/java/forge/control/FControl.java index 3941abe5e80..9ef9c2d1ecd 100644 --- a/forge-gui-desktop/src/main/java/forge/control/FControl.java +++ b/forge-gui-desktop/src/main/java/forge/control/FControl.java @@ -28,6 +28,7 @@ import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; +import java.io.IOException; import java.util.Collections; import java.util.List; @@ -230,7 +231,11 @@ public enum FControl implements KeyEventDispatcher { final String questname = FModel.getQuestPreferences().getPref(QPref.CURRENT_QUEST); final File data = new File(dirQuests.getPath(), questname); if (data.exists()) { - FModel.getQuest().load(QuestDataIO.loadData(data)); + try { + FModel.getQuest().load(QuestDataIO.loadData(data)); + } catch(IOException ex) { + System.out.println(String.format("Error loading quest data (%s).. skipping for now..", questname)); + } } // Handles resizing in null layouts of layers in JLayeredPane as well as saving window layout diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index a7cfb424db2..7d4568af413 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -20,6 +20,7 @@ import forge.toolbox.FOptionPane; import javax.swing.*; import java.io.File; import java.io.FilenameFilter; +import java.io.IOException; import java.util.*; import java.util.Map.Entry; @@ -167,6 +168,7 @@ public enum CSubmenuQuestData implements ICDoc { final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE; final File dirQuests = new File(ForgeConstants.QUEST_SAVE_DIR); final QuestController qc = FModel.getQuest(); + ArrayList restorableQuests = new ArrayList<>(); // Iterate over files and load quest data for each. final FilenameFilter takeDatFiles = new FilenameFilter() { @@ -178,7 +180,13 @@ public enum CSubmenuQuestData implements ICDoc { final File[] arrFiles = dirQuests.listFiles(takeDatFiles); arrQuests.clear(); for (final File f : arrFiles) { - arrQuests.put(f.getName(), QuestDataIO.loadData(f)); + try { + System.out.println(String.format("About to load quest (%s)... ", f.getName())); + arrQuests.put(f.getName(), QuestDataIO.loadData(f)); + } catch(IOException ex) { + System.out.println(String.format("Error loading quest data (%s).. skipping for now..", f.getName())); + restorableQuests.add(f.getName()); + } } // Populate list with available quest data. diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java b/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java index 73338eb27dd..3a91b7ca4cd 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java @@ -1,6 +1,7 @@ package forge.screens.quest; import java.io.File; +import java.io.IOException; import forge.FThreads; import forge.Forge; @@ -190,7 +191,14 @@ public class QuestMenu extends FPopupMenu implements IVQuestStats { @Override @SuppressWarnings("unchecked") public void run() { - FModel.getQuest().load(QuestDataIO.loadData(data)); + try { + FModel.getQuest().load(QuestDataIO.loadData(data)); + } catch (IOException e) { + System.err.println(String.format("Failed to load quest '%s'", questname)); + // Failed to load last quest, don't continue with quest loading stuff + return; + } + ((DeckController)EditorType.Quest.getController()).setRootFolder(FModel.getQuest().getMyDecks()); ((DeckController)EditorType.QuestDraft.getController()).setRootFolder(FModel.getQuest().getDraftDecks()); if (reason == LaunchReason.StartQuestMode) { diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index 6cb80ddaaa8..0eab4ba4ef7 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -98,43 +98,41 @@ public class QuestDataIO { *   {@link java.io.File} * @return {@link forge.quest.data.QuestData} */ - public static QuestData loadData(final File xmlSaveFile) { + public static QuestData loadData(final File xmlSaveFile) throws IOException { + QuestData data; + + final GZIPInputStream zin = new GZIPInputStream(new FileInputStream(xmlSaveFile)); + final StringBuilder xml = new StringBuilder(); + final char[] buf = new char[1024]; + final InputStreamReader reader = new InputStreamReader(zin); + while (reader.ready()) { + final int len = reader.read(buf); + if (len == -1) { + break; + } // when end of stream was reached + xml.append(buf, 0, len); + } + + zin.close(); + + String bigXML = xml.toString(); try { - QuestData data; - - final GZIPInputStream zin = new GZIPInputStream(new FileInputStream(xmlSaveFile)); - final StringBuilder xml = new StringBuilder(); - final char[] buf = new char[1024]; - final InputStreamReader reader = new InputStreamReader(zin); - while (reader.ready()) { - final int len = reader.read(buf); - if (len == -1) { - break; - } // when end of stream was reached - xml.append(buf, 0, len); - } - - zin.close(); - - String bigXML = xml.toString(); data = (QuestData) QuestDataIO.getSerializer(true).fromXML(bigXML); + } catch(Exception ex) { + // Attempt to auto restore? + throw new IOException(ex); + } - if (data.getVersionNumber() != QuestData.CURRENT_VERSION_NUMBER) { - try { - QuestDataIO.updateSaveFile(data, bigXML, xmlSaveFile.getName().replace(".dat", "")); - } - catch (final Exception e) { - //BugReporter.reportException(e); - throw new RuntimeException(e); - } + if (data.getVersionNumber() != QuestData.CURRENT_VERSION_NUMBER) { + try { + QuestDataIO.updateSaveFile(data, bigXML, xmlSaveFile.getName().replace(".dat", "")); } + catch (final Exception e) { + throw new IOException(e); + } + } - return data; - } - catch (final Exception ex) { - //BugReporter.reportException(ex, "Error loading Quest Data"); - throw new RuntimeException(ex); - } + return data; } private static void setFinalField(final Class clasz, final String fieldName, final T instance,