package org.osmdroid.tileprovider.modules; import android.util.Log; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; import org.osmdroid.api.IMapView; import org.osmdroid.tileprovider.MapTile; import org.osmdroid.tileprovider.tilesource.ITileSource; public class ZipFileArchive implements IArchiveFile { protected ZipFile mZipFile; public ZipFileArchive(){} private ZipFileArchive(final ZipFile pZipFile) { mZipFile = pZipFile; } public static ZipFileArchive getZipFileArchive(final File pFile) throws ZipException, IOException { return new ZipFileArchive(new ZipFile(pFile)); } @Override public void init(File pFile) throws Exception { mZipFile=new ZipFile(pFile); } @Override public InputStream getInputStream(final ITileSource pTileSource, final MapTile pTile) { final String path = pTileSource.getTileRelativeFilenameString(pTile); try { final ZipEntry entry = mZipFile.getEntry(path); if (entry != null) { return mZipFile.getInputStream(entry); } } catch (final IOException e) { Log.w(IMapView.LOGTAG,"Error getting zip stream: " + pTile, e); } return null; } public Set<String> getTileSources(){ Set<String> ret = new HashSet<String>(); try { Enumeration<? extends ZipEntry> entries = mZipFile.entries(); while (entries.hasMoreElements()) { ZipEntry nextElement = entries.nextElement(); String str=nextElement.getName(); if (str.contains("/")) ret.add(str.split("/")[0]); } } catch (final Exception e) { Log.w(IMapView.LOGTAG,"Error getting tile sources: ", e); } return ret; } @Override public void close() { try { mZipFile.close(); } catch (IOException e) { } } @Override public String toString() { return "ZipFileArchive [mZipFile=" + mZipFile.getName() + "]"; } }