package tim.prune.load.xml; import java.io.File; import java.io.FileInputStream; import java.util.zip.GZIPInputStream; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import tim.prune.App; import tim.prune.I18nManager; import tim.prune.data.Altitude; import tim.prune.data.SourceInfo; /** * Class to handle the loading of gzipped xml files */ public class GzipFileLoader { /** App for callback of file loading */ private App _app = null; /** Object to do the handling of the xml */ XmlFileLoader _xmlLoader = null; /** * Constructor * @param inApp App object * @param inXmlLoader object to do the xml handling */ public GzipFileLoader(App inApp, XmlFileLoader inXmlLoader) { _app = inApp; _xmlLoader = inXmlLoader; } /** * Open the selected file and select appropriate xml loader * @param inFile File to open */ public void openFile(File inFile) { GZIPInputStream istream = null; try { istream = new GZIPInputStream(new FileInputStream(inFile)); _xmlLoader.reset(); SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); saxParser.parse(istream, _xmlLoader); XmlHandler handler = _xmlLoader.getHandler(); if (handler == null) { _app.showErrorMessage("error.load.dialogtitle", "error.load.noread"); } else { // Send back to app SourceInfo sourceInfo = new SourceInfo(inFile, (handler instanceof GpxHandler?SourceInfo.FILE_TYPE.GPX:SourceInfo.FILE_TYPE.KML)); _app.informDataLoaded(handler.getFieldArray(), handler.getDataArray(), Altitude.Format.METRES, sourceInfo, handler.getTrackNameList()); } } catch (Exception e) { // Error occurred, could be a non-xml file borking the parser _app.showErrorMessageNoLookup("error.load.dialogtitle", I18nManager.getText("error.load.othererror") + " " + e.getClass().getName()); // It would be nice to verify the filename of the file inside the gz, // but the java classes don't give access to this information } finally { try { istream.close(); } catch (Exception e2) {} } } }