[vassalengine-svn-trunk] [vassalengine-svn] SF.net SVN: vassalengine:[4546] VASSAL-src/trunk/src/VA
Brought to you by:
rodneykinney,
uckelman
From: <uck...@us...> - 2008-11-26 19:37:03
|
Revision: 4546 http://vassalengine.svn.sourceforge.net/vassalengine/?rev=4546&view=rev Author: uckelman Date: 2008-11-26 19:36:55 +0000 (Wed, 26 Nov 2008) Log Message: ----------- Merged kiefte@4505. * Generate MeteData for imported files. * Importer selected on the basis of filename extension and value of first byte. * File partially validated before MetaData generated. Modified Paths: -------------- VASSAL-src/trunk/src/VASSAL/launch/AbstractLaunchAction.java VASSAL-src/trunk/src/VASSAL/tools/imports/ImportAction.java VASSAL-src/trunk/src/VASSAL/tools/imports/Importer.java VASSAL-src/trunk/src/VASSAL/tools/imports/adc2/ADC2Module.java VASSAL-src/trunk/src/VASSAL/tools/imports/adc2/MapBoard.java VASSAL-src/trunk/src/VASSAL/tools/imports/adc2/SymbolSet.java Modified: VASSAL-src/trunk/src/VASSAL/launch/AbstractLaunchAction.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/launch/AbstractLaunchAction.java 2008-11-26 19:34:09 UTC (rev 4545) +++ VASSAL-src/trunk/src/VASSAL/launch/AbstractLaunchAction.java 2008-11-26 19:36:55 UTC (rev 4546) @@ -61,6 +61,8 @@ import VASSAL.tools.WarningDialog; import VASSAL.tools.filechooser.FileChooser; import VASSAL.tools.filechooser.ModuleFileFilter; +import VASSAL.tools.imports.ImportAction; +import VASSAL.tools.imports.Importer; import VASSAL.tools.io.IOUtils; import VASSAL.tools.logging.Logger; import VASSAL.tools.logging.LogEntry; @@ -211,9 +213,16 @@ String moduleName = null; // find module-specific heap settings, if any - if (lr.module != null && lr.mode != LaunchRequest.Mode.IMPORT) { - final AbstractMetaData data = AbstractMetaData.buildMetaData(lr.module); + if (lr.module != null) { + final AbstractMetaData data; + if (lr.mode == LaunchRequest.Mode.IMPORT) { + data = ImportAction.buildMetaData(lr.module); + } + else { + data = AbstractMetaData.buildMetaData(lr.module); + } + if (data == null) { WarningDialog.show( "Error.invalid_vassal_file", lr.module.getAbsolutePath()); @@ -225,7 +234,12 @@ moduleName = ((ModuleMetaData) data).getName(); // log the module name - Logger.log("-- Loading module " + moduleName); + if (lr.mode == LaunchRequest.Mode.IMPORT) { + Logger.log("-- Importing module " + moduleName); + } + else { + Logger.log("-- Loading module " + moduleName); + } // read module prefs final ReadOnlyPrefs p = new ReadOnlyPrefs(moduleName); Modified: VASSAL-src/trunk/src/VASSAL/tools/imports/ImportAction.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/tools/imports/ImportAction.java 2008-11-26 19:34:09 UTC (rev 4545) +++ VASSAL-src/trunk/src/VASSAL/tools/imports/ImportAction.java 2008-11-26 19:36:55 UTC (rev 4546) @@ -20,7 +20,6 @@ package VASSAL.tools.imports; import java.awt.Component; -import java.awt.Window; import java.awt.event.ActionEvent; import java.io.File; import java.io.IOException; @@ -28,6 +27,8 @@ import javax.swing.JOptionPane; import VASSAL.build.GameModule; +import VASSAL.build.module.AbstractMetaData; +import VASSAL.build.module.ModuleMetaData; import VASSAL.configure.DirectoryConfigurer; import VASSAL.i18n.Resources; import VASSAL.launch.BasicModule; @@ -66,6 +67,8 @@ /* * The following three arrays describe the import file types that we can handle. + * They should be ordered in priority from most likely to least likely. File formats + * with complex file headers should take greater priority. */ private static final String[] EXTENSIONS = { @@ -107,6 +110,36 @@ return chooser; } + public static Class getImporterClass(File f) throws IOException { + int[] indeces = new int[IMPORTERS.length]; + for (int i = 0; i < indeces.length; ++i) { + indeces[i] = i; + } + + String s = '.' + Importer.getExtension(f.getName()); + for (int i = 0; i < EXTENSIONS.length; ++i) { + if (EXTENSIONS[i].compareToIgnoreCase(s) == 0) { + indeces[0] = i; + indeces[i] = 0; + break; + } + } + + for (int i = 0; i < indeces.length; ++i) { + try { + if (((Importer) (IMPORTERS[indeces[i]].newInstance())).isValidImportFile(f)) { + return IMPORTERS[indeces[i]]; + } + } catch (InstantiationException e) { + ErrorDialog.bug(e); + } catch (IllegalAccessException e) { + ErrorDialog.bug(e); + } + } + + return null; + } + @Override public void performAction(ActionEvent e) throws IOException { actionCancelled = true; @@ -133,38 +166,27 @@ final GameModule module = new BasicModule(new ArchiveWriter((String) null)); GameModule.init(module); - // try to import the module on the basis of the extension - for (int i = 0; i < IMPORTERS.length; ++i) { - if (f.getName().toLowerCase().endsWith(EXTENSIONS[i].toLowerCase())) { - try { - Importer imp = null; -// JFrame frame = ModuleManager.getInstance().getFrame(); - try { -// frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - imp = (Importer) (IMPORTERS[i].newInstance()); - imp.importFile(this, f); - imp.writeToArchive(); - } - finally { -// frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - } - - module.getFrame().setVisible(true); - new ModuleEditorWindow(module).setVisible(true); - } - // some serious problems. - catch (IllegalAccessException e) { - ErrorDialog.bug(e); - } - catch (InstantiationException e) { - ErrorDialog.bug(e); - } - return; - } + final Class impClass = getImporterClass(f); + if (impClass == null) { + throw new FileFormatException("Unrecognized file format"); } - - // went through all of the extensions. - throw new FileFormatException("Unrecognized filename extension"); + + final Importer imp; + try { + imp = (Importer) (impClass.newInstance()); + imp.importFile(this, f); + imp.writeToArchive(); + } + // these should never happen + catch (IllegalAccessException e) { + ErrorDialog.bug(e); + } + catch (InstantiationException e) { + ErrorDialog.bug(e); + } + + module.getFrame().setVisible(true); + new ModuleEditorWindow(module).setVisible(true); } /** @@ -301,4 +323,18 @@ // total failure return null; } + + public static AbstractMetaData buildMetaData(File module) { + try { + if (getImporterClass(module) == null) { + // not a recognized file + return null; + } + } catch (IOException e) { + return null; + } + String name = Importer.stripExtension(module.getName()); + ModuleMetaData metaData = new ModuleMetaData(name, "0.1"); + return metaData; + } } Modified: VASSAL-src/trunk/src/VASSAL/tools/imports/Importer.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/tools/imports/Importer.java 2008-11-26 19:34:09 UTC (rev 4545) +++ VASSAL-src/trunk/src/VASSAL/tools/imports/Importer.java 2008-11-26 19:36:55 UTC (rev 4546) @@ -18,6 +18,7 @@ package VASSAL.tools.imports; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.List; @@ -224,5 +225,14 @@ if (s.equals(".") || s.equals("..")) return s; return Importer.stripExtension(s) + '.' + ext; - } + } + + /** + * Determine whether the file is valid for the given importer. + * @param f + * @return <code>true</code> if <code>f</code> is a valid file for this type. + * @throws FileNotFoundException + * @throws IOException + */ + public abstract boolean isValidImportFile(File f) throws IOException; } Modified: VASSAL-src/trunk/src/VASSAL/tools/imports/adc2/ADC2Module.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/tools/imports/adc2/ADC2Module.java 2008-11-26 19:34:09 UTC (rev 4545) +++ VASSAL-src/trunk/src/VASSAL/tools/imports/adc2/ADC2Module.java 2008-11-26 19:36:55 UTC (rev 4546) @@ -2873,4 +2873,13 @@ protected SymbolSet getSet() { return getMap().getSet(); } + + @Override + public boolean isValidImportFile(File f) throws IOException { + DataInputStream in = new DataInputStream(new FileInputStream(f)); + int header = in.readByte(); + boolean valid = header == -3 || header == -2; + in.close(); + return valid; + } } Modified: VASSAL-src/trunk/src/VASSAL/tools/imports/adc2/MapBoard.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/tools/imports/adc2/MapBoard.java 2008-11-26 19:34:09 UTC (rev 4545) +++ VASSAL-src/trunk/src/VASSAL/tools/imports/adc2/MapBoard.java 2008-11-26 19:36:55 UTC (rev 4546) @@ -3082,4 +3082,12 @@ boardPicker = getMainMap().getAllDescendantComponentsOf(BoardPicker.class).toArray(new BoardPicker[0])[0]; return boardPicker; } + + @Override + public boolean isValidImportFile(File f) throws IOException { + DataInputStream in = new DataInputStream(new FileInputStream(f)); + boolean valid = in.readByte() == -3; + in.close(); + return valid; + } } Modified: VASSAL-src/trunk/src/VASSAL/tools/imports/adc2/SymbolSet.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/tools/imports/adc2/SymbolSet.java 2008-11-26 19:34:09 UTC (rev 4545) +++ VASSAL-src/trunk/src/VASSAL/tools/imports/adc2/SymbolSet.java 2008-11-26 19:36:55 UTC (rev 4546) @@ -18,7 +18,6 @@ package VASSAL.tools.imports.adc2; import java.awt.AlphaComposite; -import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Rectangle; @@ -638,4 +637,12 @@ // for (SymbolData terrain : mapBoardData) // terrain.writeToArchive(); } + + @Override + public boolean isValidImportFile(File f) throws IOException { + DataInputStream in = new DataInputStream(new FileInputStream(f)); + boolean valid = in.readUnsignedByte() >= 0xFA; + in.close(); + return valid; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ vassalengine-svn mailing list vas...@li... https://lists.sourceforge.net/lists/listinfo/vassalengine-svn |