// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.opendata.core.io.geographic; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import javax.xml.stream.FactoryConfigurationError; import javax.xml.stream.XMLStreamException; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.gui.progress.ProgressMonitor; import org.openstreetmap.josm.io.AbstractReader; import org.openstreetmap.josm.io.IllegalDataException; public class KmzReader extends AbstractReader { private ZipInputStream zis; public KmzReader(ZipInputStream zis) { this.zis = zis; } public static DataSet parseDataSet(InputStream in, ProgressMonitor instance) throws IOException, XMLStreamException, FactoryConfigurationError { return new KmzReader(new ZipInputStream(in)).parseDoc(instance); } @Override protected DataSet doParseDataSet(InputStream source, ProgressMonitor progressMonitor) throws IllegalDataException { return null; } private DataSet parseDoc(ProgressMonitor instance) throws IOException, XMLStreamException, FactoryConfigurationError { ZipEntry entry; do { entry = zis.getNextEntry(); if (entry == null) { Main.warn("No KML file found"); return null; } } while (!entry.getName().toLowerCase().endsWith(".kml")); long size = entry.getSize(); byte[] buffer; if (size > 0) { buffer = new byte[(int) size]; int off = 0; int count = 0; while ((count = zis.read(buffer, off, (int) size)) > 0) { off += count; size -= count; } } else { ByteArrayOutputStream out = new ByteArrayOutputStream(); int b; do { b = zis.read(); if (b != -1) { out.write(b); } } while (b != -1); buffer = out.toByteArray(); } return KmlReader.parseDataSet(new ByteArrayInputStream(buffer), instance); } }