dicttool header to read stream exhaustively

Change-Id: I50a286c115f5bd6e93763bd2f79031676d6fffd8
main
Adrian Velicu 2014-11-11 17:51:29 -08:00
parent 1e72f9da12
commit 9f46834839
1 changed files with 15 additions and 3 deletions

View File

@ -186,9 +186,7 @@ public final class BinaryDictOffdeviceUtils {
throw new UnsupportedFormatException("Header too large"); throw new UnsupportedFormatException("Header too large");
} }
final byte[] headerBuffer = new byte[totalHeaderSize - tmpBuffer.length]; final byte[] headerBuffer = new byte[totalHeaderSize - tmpBuffer.length];
if (headerBuffer.length != input.read(headerBuffer)) { readStreamExhaustively(input, headerBuffer);
throw new UnsupportedFormatException("File shorter than specified in the header");
}
final HashMap<String, String> attributes = final HashMap<String, String> attributes =
BinaryDictDecoderUtils.decodeHeaderAttributes(headerBuffer); BinaryDictDecoderUtils.decodeHeaderAttributes(headerBuffer);
return new DictionaryHeader(totalHeaderSize, new DictionaryOptions(attributes), return new DictionaryHeader(totalHeaderSize, new DictionaryOptions(attributes),
@ -196,6 +194,20 @@ public final class BinaryDictOffdeviceUtils {
} }
} }
private static void readStreamExhaustively(final InputStream inputStream,
final byte[] outBuffer) throws IOException, UnsupportedFormatException {
int readBytes = 0;
int readBytesLastCycle = -1;
while (readBytes != outBuffer.length) {
readBytesLastCycle = inputStream.read(outBuffer, readBytes,
outBuffer.length - readBytes);
if (readBytesLastCycle == -1)
throw new UnsupportedFormatException("File shorter than specified in the header"
+ " (expected " + outBuffer.length + ", read " + readBytes + ")");
readBytes += readBytesLastCycle;
}
}
public static void copy(final InputStream input, final OutputStream output) throws IOException { public static void copy(final InputStream input, final OutputStream output) throws IOException {
final byte[] buffer = new byte[COPY_BUFFER_SIZE]; final byte[] buffer = new byte[COPY_BUFFER_SIZE];
for (int readBytes = input.read(buffer); readBytes >= 0; readBytes = input.read(buffer)) { for (int readBytes = input.read(buffer); readBytes >= 0; readBytes = input.read(buffer)) {