13
13
/** listener to receive tags */
14
14
private TagReceiver _receiver = null;
15
/** string builder for copying source xml */
16
private StringBuilder _builder = null;
18
16
// character sequences for start and end of tags
19
17
private static final char[] GPX_START = "<gpx".toCharArray();
44
41
public void slice(InputStream inStream)
46
_builder = new StringBuilder(100);
43
StringBuffer beginBuffer = new StringBuffer(200);
44
ByteBuffer byteBuffer = new ByteBuffer();
47
45
boolean insideTag = false;
48
46
boolean insideCdata = false;
49
47
char[] endTag = null;
54
52
while ((b = inStream.read()) >= 0)
56
if (!insideTag && !insideCdata) {
57
if (b == '<') _builder.setLength(0);
60
_builder.append((char)b);
55
byteBuffer.appendByte((byte) b);
56
// clear buffer if necessary
57
if (!insideTag && !insideCdata && (b == '>' || b == '\n'))
62
// if we're still at the beginning, copy to the begin buffer as well
63
if (beginBuffer != null) {beginBuffer.append((char) b);}
63
66
// Just look for end of cdata block
64
if (foundSequence(CDATA_END)) {insideCdata = false;}
67
if (byteBuffer.foundSequence(CDATA_END)) {insideCdata = false;}
70
73
// Look for start of one of the tags
71
if (!foundHeader && foundSequence(GPX_START)) {
74
if (!foundHeader && byteBuffer.foundSequence(GPX_START))
73
77
foundHeader = true;
79
// Check begin buffer for utf8 encoding
80
if (beginBuffer != null && beginBuffer.toString().toLowerCase().indexOf("encoding=\"utf-8\"") > 0)
82
byteBuffer.setEncodingUtf8();
84
beginBuffer = null; // don't need it any more
78
if (foundSequence(TRKPT_START)) {
88
if (byteBuffer.foundSequence(TRKPT_START)) {
80
90
endTag = TRKPT_END;
82
else if (foundSequence(WPT_START)) {
92
else if (byteBuffer.foundSequence(WPT_START)) {
86
else if (foundSequence(RTEPT_START)) {
96
else if (byteBuffer.foundSequence(RTEPT_START)) {
88
98
endTag = RTEPT_END;
94
104
// Look for end of found tag
95
if (foundSequence(endTag)) {
96
_receiver.reportTag(_builder.toString());
97
_builder.setLength(0);
105
if (byteBuffer.foundSequence(endTag))
107
String tag = byteBuffer.toString();
108
_receiver.reportTag(tag);
98
110
insideTag = false;
101
113
// Look for start of cdata block
102
if (foundSequence(CDATA_START)) {insideCdata = true;}
114
if (byteBuffer.foundSequence(CDATA_START)) {
106
120
catch (IOException e) {} // ignore
110
* Look for the given character sequence in the last characters read
111
* @param inChars sequence to look for
112
* @return true if sequence found
114
private boolean foundSequence(char[] inChars)
116
final int numChars = inChars.length;
117
final int bufflen = _builder.length();
118
if (bufflen < numChars) {return false;}
119
for (int i=0; i<numChars; i++)
121
char searchChar = inChars[numChars - 1 - i];
122
char sourceChar = _builder.charAt(bufflen - 1 - i);
123
if (searchChar != sourceChar) {return false;}
124
//if (Character.toLowerCase(searchChar) != Character.toLowerCase(sourceChar)) {return false;}