From b94440e0a0e0f295a181706129dddd745cb0d85c Mon Sep 17 00:00:00 2001 From: Vhati Date: Sun, 29 Sep 2013 07:58:57 -0400 Subject: [PATCH] Changed FTLDat to allow opening dats in read-only mode --- skel_common/readme_changelog.txt | 3 ++ src/main/java/net/vhati/ftldat/FTLDat.java | 54 ++++++++++++++++--- .../net/vhati/modmanager/FTLModManager.java | 2 +- .../vhati/modmanager/cli/SlipstreamCLI.java | 2 +- .../vhati/modmanager/core/ModPatchThread.java | 4 +- .../vhati/modmanager/ui/DatExtractDialog.java | 2 +- .../vhati/modmanager/ui/ModXMLSandbox.java | 2 +- 7 files changed, 55 insertions(+), 14 deletions(-) diff --git a/skel_common/readme_changelog.txt b/skel_common/readme_changelog.txt index c210ff6..767c889 100644 --- a/skel_common/readme_changelog.txt +++ b/skel_common/readme_changelog.txt @@ -1,5 +1,8 @@ Changelog +???: +- Changed FTLDat to allow opening dats in read-only mode + 1.4: - Cleaned up some dodgy code when initially prompting for FTL's location - Added another common game location: "C:\Program Files (x86)\FTL" diff --git a/src/main/java/net/vhati/ftldat/FTLDat.java b/src/main/java/net/vhati/ftldat/FTLDat.java index ea50b40..0d0b06e 100644 --- a/src/main/java/net/vhati/ftldat/FTLDat.java +++ b/src/main/java/net/vhati/ftldat/FTLDat.java @@ -313,10 +313,12 @@ public class FTLDat { public static class FolderPack extends AbstractPack { private File rootDir; + public FolderPack( File rootDir ) { this.rootDir = rootDir; } + @Override public String getName() { return rootDir.getName(); @@ -447,21 +449,57 @@ public class FTLDat { private Map pathToIndexMap = null; private ByteBuffer byteBuffer = null; - public FTLPack( File datFile, boolean create ) throws IOException { - this( datFile, create, 2048 ); + + /** + * Opens or creates a dat in various modes. + * When creating, the initial index size will be 2048. + * + * @see FTLPack(File datFile, String mode, int indexSize) + */ + public FTLPack( File datFile, String mode ) throws IOException { + this( datFile, mode, 2048 ); } - public FTLPack( File datFile, boolean create, int indexSize ) throws IOException { - this.datFile = datFile; - raf = new RandomAccessFile( datFile, "rw" ); + /** + * Opens or creates a dat in various modes. + * + * The mode must be one of the following: + * r - opens an existing dat, read-only. + * r+ - opens an existing dat, read/write. + * w+ - creates a new empty dat, read/write. + * + * @param datFile a file to open/create + * @param mode see above + * @param indexSize size of the initial index if creating + */ + public FTLPack( File datFile, String mode, int indexSize ) throws IOException { + if ( mode.equals( "r" ) ) { + if ( !datFile.exists() ) + throw new FileNotFoundException( String.format( "The datFile was not found: %s", datFile.getPath() ) ); - if ( create ) { - createIndex( indexSize ); - } else { + this.datFile = datFile; + raf = new RandomAccessFile( datFile, "r" ); readIndex(); } + else if ( mode.equals( "r+" ) ) { + if ( !datFile.exists() ) + throw new FileNotFoundException( String.format( "The datFile was not found: %s", datFile.getPath() ) ); + + this.datFile = datFile; + raf = new RandomAccessFile( datFile, "rw" ); + readIndex(); + } + else if ( mode.equals( "w+" ) ) { + this.datFile = datFile; + raf = new RandomAccessFile( datFile, "rw" ); + createIndex( indexSize ); + } + else { + throw new IllegalArgumentException( String.format( "FTLPack constructor's mode arg was not 'r', 'r+', or 'w+' (%s).", mode ) ); + } } + /** * Reads a little-endian unsigned int. * Java doesn't have an unsigned int primitive, diff --git a/src/main/java/net/vhati/modmanager/FTLModManager.java b/src/main/java/net/vhati/modmanager/FTLModManager.java index 43927bf..2c886b1 100644 --- a/src/main/java/net/vhati/modmanager/FTLModManager.java +++ b/src/main/java/net/vhati/modmanager/FTLModManager.java @@ -25,7 +25,7 @@ public class FTLModManager { private static final Logger log = LogManager.getLogger(FTLModManager.class); public static final String APP_NAME = "Slipstream Mod Manager"; - public static final ComparableVersion APP_VERSION = new ComparableVersion( "1.4" ); + public static final ComparableVersion APP_VERSION = new ComparableVersion( "???" ); public static final String APP_URL = "http://www.ftlgame.com/forum/viewtopic.php?f=12&t=17102"; public static final String APP_AUTHOR = "Vhati"; diff --git a/src/main/java/net/vhati/modmanager/cli/SlipstreamCLI.java b/src/main/java/net/vhati/modmanager/cli/SlipstreamCLI.java index 85c9b30..baa19ba 100644 --- a/src/main/java/net/vhati/modmanager/cli/SlipstreamCLI.java +++ b/src/main/java/net/vhati/modmanager/cli/SlipstreamCLI.java @@ -201,7 +201,7 @@ public class SlipstreamCLI { dstP = new FTLDat.FolderPack( extractDir ); for ( File datFile : datFiles ) { - srcP = new FTLDat.FTLPack( datFile, false ); + srcP = new FTLDat.FTLPack( datFile, "r" ); List innerPaths = srcP.list(); for ( String innerPath : innerPaths ) { diff --git a/src/main/java/net/vhati/modmanager/core/ModPatchThread.java b/src/main/java/net/vhati/modmanager/core/ModPatchThread.java index 9a55de4..2331691 100644 --- a/src/main/java/net/vhati/modmanager/core/ModPatchThread.java +++ b/src/main/java/net/vhati/modmanager/core/ModPatchThread.java @@ -156,8 +156,8 @@ public class ModPatchThread extends Thread { return true; } - dataP = new FTLPack( dataDat.datFile, false ); - resP = new FTLPack( resDat.datFile, false ); + dataP = new FTLPack( dataDat.datFile, "r+" ); + resP = new FTLPack( resDat.datFile, "r+" ); Map topFolderMap = new HashMap(); topFolderMap.put( "data", dataP ); diff --git a/src/main/java/net/vhati/modmanager/ui/DatExtractDialog.java b/src/main/java/net/vhati/modmanager/ui/DatExtractDialog.java index 7c3521d..ec1f566 100644 --- a/src/main/java/net/vhati/modmanager/ui/DatExtractDialog.java +++ b/src/main/java/net/vhati/modmanager/ui/DatExtractDialog.java @@ -84,7 +84,7 @@ public class DatExtractDialog extends ProgressDialog { dstP = new FTLDat.FolderPack( extractDir ); for ( File datFile : datFiles ) { - srcP = new FTLDat.FTLPack( datFile, false ); + srcP = new FTLDat.FTLPack( datFile, "r" ); progress = 0; List innerPaths = srcP.list(); setProgressLater( progress, innerPaths.size() ); diff --git a/src/main/java/net/vhati/modmanager/ui/ModXMLSandbox.java b/src/main/java/net/vhati/modmanager/ui/ModXMLSandbox.java index 2a25251..dbc5618 100644 --- a/src/main/java/net/vhati/modmanager/ui/ModXMLSandbox.java +++ b/src/main/java/net/vhati/modmanager/ui/ModXMLSandbox.java @@ -322,7 +322,7 @@ public class ModXMLSandbox extends JFrame implements ActionListener { FTLDat.FTLPack dataP = null; InputStream is = null; try { - dataP = new FTLDat.FTLPack( dataDatFile, false ); + dataP = new FTLDat.FTLPack( dataDatFile, "r" ); List innerPaths = dataP.list(); String innerPath = promptForInnerPath( innerPaths );