X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2Fsrtm%2FSrtmSource.java;h=6e49ad18383060541e8378c854df365db86c0144;hb=860ae36b24e22ff49b23cc5e3b51e9bd5520712b;hp=5651a3f314656b155e979056ba1deafd0a6cb671;hpb=a3cb2b5a1ffe4d027d1c896a5ef9bb3f7b280d89;p=GpsPrune.git diff --git a/src/tim/prune/function/srtm/SrtmSource.java b/src/tim/prune/function/srtm/SrtmSource.java index 5651a3f..6e49ad1 100644 --- a/src/tim/prune/function/srtm/SrtmSource.java +++ b/src/tim/prune/function/srtm/SrtmSource.java @@ -3,11 +3,13 @@ package tim.prune.function.srtm; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.InputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public abstract class SrtmSource { + // methods implemented by each source public abstract String getName(); public abstract boolean isReadyToUse(); public abstract boolean downloadTile(SrtmTile inTile) @@ -15,6 +17,47 @@ public abstract class SrtmSource { public abstract int getRowSize(SrtmTile inTile); protected abstract String getSourceExtension(); + protected boolean downloadToFile(InputStream inStream, File outputFile) + throws IOException + { + FileOutputStream outStream = new FileOutputStream(outputFile); + + byte[] buffer = new byte[4096]; + int read = 0; + while ((read = inStream.read(buffer)) != -1) + { + outStream.write(buffer, 0, read); + } + // Make sure streams are closed + try {inStream.close();} catch (Exception e) {} + try {outStream.close();} catch (Exception e) {} + return true; + + } + + protected int[] slurpTileHeigths(ZipInputStream inStream, int tileSize) + throws IOException + { + int[] heights = new int[tileSize]; + int dataSize = 2 * tileSize; + byte[] buffer = new byte[dataSize]; + // Read entire file contents into one byte array + int alreadyRead = 0; + while (alreadyRead < dataSize) + { + alreadyRead += inStream.read(buffer, alreadyRead, dataSize - alreadyRead); + } + for (int i = 0; i < tileSize; i++) + { + // Bytes are signed. Cast high-order to int with sign + // extension, and clamp low-order to its unsigned range + heights[i] = buffer[2 * i] * 256 + (0xff & buffer[2 * i + 1]); + } + // Close stream + inStream.close(); + return heights; + } + public int[] getTileHeights(SrtmTile inTile) throws SrtmSourceException { @@ -33,16 +76,7 @@ public abstract class SrtmSource { { throw new SrtmSourceException("Tile file "+cacheFileName+" does not have the expected size"); } - int[] heights = new int[tileSize]; - // Read entire file contents into one byte array - for (int i = 0; i < heights.length; i++) - { - heights[i] = inStream.read() * 256 + inStream.read(); - if (heights[i] >= 32768) {heights[i] -= 65536;} - } - // Close stream - inStream.close(); - return heights; + return slurpTileHeigths(inStream, tileSize); } catch (IOException e) { @@ -64,6 +98,8 @@ public abstract class SrtmSource { public boolean isCached(SrtmTile inTile) { - return getCacheFileName(inTile).exists(); + File cachedFileName = getCacheFileName(inTile); + return cachedFileName != null && + getCacheFileName(inTile).exists(); } }