Methods Summary |
---|
public void | close()
mStream.close();
|
private void | consumeBuf(int count)Consume number of bytes from beginning of internal buffer. If consuming
all remaining bytes, will attempt to {@link #fillBuf()}.
// TODO: consider moving to read pointer, but for now traceview says
// these copies aren't a bottleneck.
System.arraycopy(mBuffer, count, mBuffer, 0, mTail - count);
mTail -= count;
if (mTail == 0) {
fillBuf();
}
|
private int | fillBuf()Read more data from {@link #mStream} into internal buffer.
final int length = mBuffer.length - mTail;
if (length == 0) {
throw new IOException("attempting to fill already-full buffer");
}
final int read = mStream.read(mBuffer, mTail, length);
if (read != -1) {
mTail += read;
}
return read;
|
public void | finishLine()Finish current line, skipping any remaining data.
// last token already finished line; reset silently
if (mLineFinished) {
mLineFinished = false;
return;
}
int i = 0;
do {
// scan forward for line boundary and consume
for (; i < mTail; i++) {
if (mBuffer[i] == '\n") {
consumeBuf(i + 1);
return;
}
}
} while (fillBuf() > 0);
throw new ProtocolException("End of stream while looking for line boundary");
|
public boolean | hasMoreData()Check if stream has more data to be parsed.
return mTail > 0;
|
private java.lang.NumberFormatException | invalidLong(int tokenIndex)
return new NumberFormatException(
"invalid long: " + new String(mBuffer, 0, tokenIndex, StandardCharsets.US_ASCII));
|
public int | nextInt()Parse and return next token as base-10 encoded {@code int}.
final long value = nextLong();
if (value > Integer.MAX_VALUE || value < Integer.MIN_VALUE) {
throw new NumberFormatException("parsed value larger than integer");
}
return (int) value;
|
public long | nextLong()Parse and return next token as base-10 encoded {@code long}.
final int tokenIndex = nextTokenIndex();
if (tokenIndex == -1) {
throw new ProtocolException("Missing required long");
} else {
return parseAndConsumeLong(tokenIndex);
}
|
public long | nextOptionalLong(long def)Parse and return next token as base-10 encoded {@code long}, or return
the given default value if no remaining tokens on current line.
final int tokenIndex = nextTokenIndex();
if (tokenIndex == -1) {
return def;
} else {
return parseAndConsumeLong(tokenIndex);
}
|
public java.lang.String | nextString()Parse and return next token as {@link String}.
final int tokenIndex = nextTokenIndex();
if (tokenIndex == -1) {
throw new ProtocolException("Missing required string");
} else {
return parseAndConsumeString(tokenIndex);
}
|
private int | nextTokenIndex()Find buffer index of next token delimiter, usually space or newline.
Fills buffer as needed.
if (mLineFinished) {
return -1;
}
int i = 0;
do {
// scan forward for token boundary
for (; i < mTail; i++) {
final byte b = mBuffer[i];
if (b == '\n") {
mLineFinished = true;
return i;
}
if (b == ' ") {
return i;
}
}
} while (fillBuf() > 0);
throw new ProtocolException("End of stream while looking for token boundary");
|
private long | parseAndConsumeLong(int tokenIndex)
final boolean negative = mBuffer[0] == '-";
// TODO: refactor into something like IntegralToString
long result = 0;
for (int i = negative ? 1 : 0; i < tokenIndex; i++) {
final int digit = mBuffer[i] - '0";
if (digit < 0 || digit > 9) {
throw invalidLong(tokenIndex);
}
// always parse as negative number and apply sign later; this
// correctly handles MIN_VALUE which is "larger" than MAX_VALUE.
final long next = result * 10 - digit;
if (next > result) {
throw invalidLong(tokenIndex);
}
result = next;
}
consumeBuf(tokenIndex + 1);
return negative ? result : -result;
|
private java.lang.String | parseAndConsumeString(int tokenIndex)
final String s = new String(mBuffer, 0, tokenIndex, StandardCharsets.US_ASCII);
consumeBuf(tokenIndex + 1);
return s;
|