package tim.prune.function.srtm; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public abstract class SrtmSource { public abstract String getName(); public abstract boolean isReadyToUse(); public abstract boolean downloadTile(SrtmTile inTile) throws SrtmSourceException; public abstract int getRowSize(SrtmTile inTile); protected abstract String getSourceExtension(); public int[] getTileHeights(SrtmTile inTile) throws SrtmSourceException { File cacheFileName = getCacheFileName(inTile); if (cacheFileName == null) { throw new SrtmSourceException("Tile "+inTile.getTileName()+" not in cache"); } try { ZipInputStream inStream = new ZipInputStream(new FileInputStream(cacheFileName)); ZipEntry entry = inStream.getNextEntry(); int rowSize = getRowSize(inTile); int tileSize = rowSize * rowSize; if (entry.getSize() != 2 * tileSize) { 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; } catch (IOException e) { throw new SrtmSourceException("Failure opening "+cacheFileName+" for reading:"+e.getMessage()); } } protected File getCacheDir() { return SrtmDiskCache.getCacheDir(getName()); } protected File getCacheFileName(SrtmTile inTile) { String fileName = inTile.getTileName() + getSourceExtension(); return new File(getCacheDir(), fileName); } public boolean isCached(SrtmTile inTile) { return getCacheFileName(inTile).exists(); } }