diff --git a/skel_common/readme_changelog.txt b/skel_common/readme_changelog.txt index 339ddb8..22d00e9 100644 --- a/skel_common/readme_changelog.txt +++ b/skel_common/readme_changelog.txt @@ -8,6 +8,8 @@ Changelog - The main window's geometry is saved on exit - Added urls in the statusbar when hovering over links - Added periodic checking for SMM updates +- Added FTL launching on Linux +- Fixed critical bugs in InputStreams returned by FTLDat 1.1: - Added a button to open the mods/ folder diff --git a/src/main/java/net/vhati/ftldat/FileChannelRegionInputStream.java b/src/main/java/net/vhati/ftldat/FileChannelRegionInputStream.java index 37b37ff..5ab2d2f 100644 --- a/src/main/java/net/vhati/ftldat/FileChannelRegionInputStream.java +++ b/src/main/java/net/vhati/ftldat/FileChannelRegionInputStream.java @@ -62,8 +62,9 @@ public class FileChannelRegionInputStream extends InputStream { } } - // Do an absolute get() from the buffer. - int result = buf.get( (int)(intraPos - bufOffset) ); + // Do an absolute get() from the buffer, + // and interpret the byte as if it were unsigned. + int result = (int)(buf.get( (int)(intraPos - bufOffset) ) & 0xff); intraPos++; return result; } @@ -78,14 +79,16 @@ public class FileChannelRegionInputStream extends InputStream { int bytesTotal = Math.min( bLen, (int)(regionLength - intraPos) ); int bytesRemaining = bytesTotal; + int bytesRead = 0; - if ( intraPos >= bufOffset || intraPos < bufOffset+bufLength ) { + if ( intraPos >= bufOffset && intraPos < bufOffset+bufLength ) { // Read part of the current buffer, possibly until the end. buf.position( (int)(intraPos - bufOffset) ); int bufTodo = Math.min( bytesRemaining, bufLength - (int)(intraPos - bufOffset) ); buf.get( b, bOff, bufTodo ); bytesRemaining -= bufTodo; + bytesRead += bufTodo; intraPos += bufTodo; } @@ -105,11 +108,25 @@ public class FileChannelRegionInputStream extends InputStream { buf.position( 0 ); int bufTodo = Math.min( bytesRemaining, bufLength ); - buf.get( b, bOff, bufTodo ); + buf.get( b, bOff + bytesRead, bufTodo ); bytesRemaining -= bufTodo; + bytesRead += bufTodo; intraPos += bufTodo; } - return ( bytesTotal - bytesRemaining ); // Return number of bytes read. + return bytesRead; + } + + + @Override + public long skip( long n ) throws IOException { + if ( !channel.isOpen() ) throw new ClosedChannelException(); + if ( intraPos >= regionLength ) return -1; + + if ( intraPos + n <= regionLength ) { + n = regionLength - intraPos; + } + intraPos += n; + return n; } }