X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Fsave%2Fxml%2FGpxSlicer.java;fp=src%2Ftim%2Fprune%2Fsave%2Fxml%2FGpxSlicer.java;h=d18d7607656533d6aacbae5c599daa17df6076fe;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/save/xml/GpxSlicer.java b/src/tim/prune/save/xml/GpxSlicer.java new file mode 100644 index 0000000..d18d760 --- /dev/null +++ b/src/tim/prune/save/xml/GpxSlicer.java @@ -0,0 +1,122 @@ +package tim.prune.save.xml; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Class to slice up a gpx stream and report the found tags + * back to a listener. + * Used by Gpx caching to re-read and store the gpx source + */ +public class GpxSlicer +{ + /** listener to receive tags */ + private TagReceiver _receiver = null; + + // character sequences for start and end of tags + private static final char[] GPX_START = "= 0) + { + // copy character + byteBuffer.appendByte((byte) b); + // clear buffer if necessary + if (!insideTag && !insideCdata && (b == '>' || b == '\n')) + { + byteBuffer.clear(); + continue; + } + // if we're still at the beginning, copy to the begin buffer as well + if (beginBuffer != null) {beginBuffer.append((char) b);} + + if (insideCdata) { + // Just look for end of cdata block + if (byteBuffer.foundSequence(CDATA_END)) {insideCdata = false;} + } + else + { + if (!insideTag) + { + // Look for start of one of the tags + if (!foundHeader && byteBuffer.foundSequence(GPX_START)) + { + insideTag = true; + foundHeader = true; + endTag = GPX_END; + // Check begin buffer for utf8 encoding + if (beginBuffer != null && beginBuffer.toString().toLowerCase().indexOf("encoding=\"utf-8\"") > 0) + { + byteBuffer.setEncodingUtf8(); + } + beginBuffer = null; // don't need it any more + } + else if (b == 't') + { + if (byteBuffer.foundSequence(TRKPT_START)) { + insideTag = true; + endTag = TRKPT_END; + } + else if (byteBuffer.foundSequence(WPT_START)) { + insideTag = true; + endTag = WPT_END; + } + else if (byteBuffer.foundSequence(RTEPT_START)) { + insideTag = true; + endTag = RTEPT_END; + } + } + } + else + { + // Look for end of found tag + if (byteBuffer.foundSequence(endTag)) + { + String tag = byteBuffer.toString(); + _receiver.reportTag(tag); + byteBuffer.clear(); + insideTag = false; + } + } + // Look for start of cdata block + if (byteBuffer.foundSequence(CDATA_START)) { + insideCdata = true; + } + } + } + } + catch (IOException e) {} // ignore + } +}