Merge "Support optional values in ProcFileReader."
This commit is contained in:
@@ -19,6 +19,7 @@ package com.android.internal.util;
|
|||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.net.ProtocolException;
|
||||||
import java.nio.charset.Charsets;
|
import java.nio.charset.Charsets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -82,12 +83,15 @@ public class ProcFileReader implements Closeable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find buffer index of next token delimiter, usually space or newline. Will
|
* Find buffer index of next token delimiter, usually space or newline.
|
||||||
* fill buffer as needed.
|
* Fills buffer as needed.
|
||||||
|
*
|
||||||
|
* @return Index of next delimeter, otherwise -1 if no tokens remain on
|
||||||
|
* current line.
|
||||||
*/
|
*/
|
||||||
private int nextTokenIndex() throws IOException {
|
private int nextTokenIndex() throws IOException {
|
||||||
if (mLineFinished) {
|
if (mLineFinished) {
|
||||||
throw new IOException("no tokens remaining on current line");
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -105,7 +109,7 @@ public class ProcFileReader implements Closeable {
|
|||||||
}
|
}
|
||||||
} while (fillBuf() > 0);
|
} while (fillBuf() > 0);
|
||||||
|
|
||||||
throw new IOException("end of stream while looking for token boundary");
|
throw new ProtocolException("End of stream while looking for token boundary");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -136,7 +140,7 @@ public class ProcFileReader implements Closeable {
|
|||||||
}
|
}
|
||||||
} while (fillBuf() > 0);
|
} while (fillBuf() > 0);
|
||||||
|
|
||||||
throw new IOException("end of stream while looking for line boundary");
|
throw new ProtocolException("End of stream while looking for line boundary");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -144,9 +148,11 @@ public class ProcFileReader implements Closeable {
|
|||||||
*/
|
*/
|
||||||
public String nextString() throws IOException {
|
public String nextString() throws IOException {
|
||||||
final int tokenIndex = nextTokenIndex();
|
final int tokenIndex = nextTokenIndex();
|
||||||
final String s = new String(mBuffer, 0, tokenIndex, Charsets.US_ASCII);
|
if (tokenIndex == -1) {
|
||||||
consumeBuf(tokenIndex + 1);
|
throw new ProtocolException("Missing required string");
|
||||||
return s;
|
} else {
|
||||||
|
return parseAndConsumeString(tokenIndex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -154,6 +160,33 @@ public class ProcFileReader implements Closeable {
|
|||||||
*/
|
*/
|
||||||
public long nextLong() throws IOException {
|
public long nextLong() throws IOException {
|
||||||
final int tokenIndex = nextTokenIndex();
|
final int tokenIndex = nextTokenIndex();
|
||||||
|
if (tokenIndex == -1) {
|
||||||
|
throw new ProtocolException("Missing required long");
|
||||||
|
} else {
|
||||||
|
return parseAndConsumeLong(tokenIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse and return next token as base-10 encoded {@code long}, or return
|
||||||
|
* the given default value if no remaining tokens on current line.
|
||||||
|
*/
|
||||||
|
public long nextOptionalLong(long def) throws IOException {
|
||||||
|
final int tokenIndex = nextTokenIndex();
|
||||||
|
if (tokenIndex == -1) {
|
||||||
|
return def;
|
||||||
|
} else {
|
||||||
|
return parseAndConsumeLong(tokenIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String parseAndConsumeString(int tokenIndex) throws IOException {
|
||||||
|
final String s = new String(mBuffer, 0, tokenIndex, Charsets.US_ASCII);
|
||||||
|
consumeBuf(tokenIndex + 1);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
private long parseAndConsumeLong(int tokenIndex) throws IOException {
|
||||||
final boolean negative = mBuffer[0] == '-';
|
final boolean negative = mBuffer[0] == '-';
|
||||||
|
|
||||||
// TODO: refactor into something like IntegralToString
|
// TODO: refactor into something like IntegralToString
|
||||||
@@ -193,6 +226,7 @@ public class ProcFileReader implements Closeable {
|
|||||||
return (int) value;
|
return (int) value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
mStream.close();
|
mStream.close();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ public class ProcFileReaderTest extends AndroidTestCase {
|
|||||||
fail("somehow read a string value?");
|
fail("somehow read a string value?");
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// expected
|
// expected
|
||||||
assertTrue(e.getMessage().contains("end of stream"));
|
assertTrue(e.getMessage().contains("End of stream"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,6 +152,20 @@ public class ProcFileReaderTest extends AndroidTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testOptionalLongs() throws Exception {
|
||||||
|
final ProcFileReader reader = buildReader("123 456\n789\n");
|
||||||
|
|
||||||
|
assertEquals(123L, reader.nextLong());
|
||||||
|
assertEquals(456L, reader.nextOptionalLong(-1L));
|
||||||
|
assertEquals(-1L, reader.nextOptionalLong(-1L));
|
||||||
|
assertEquals(-1L, reader.nextOptionalLong(-1L));
|
||||||
|
assertEquals(-1L, reader.nextOptionalLong(-1L));
|
||||||
|
reader.finishLine();
|
||||||
|
|
||||||
|
assertEquals(789L, reader.nextOptionalLong(-1L));
|
||||||
|
assertEquals(-1L, reader.nextOptionalLong(-1L));
|
||||||
|
}
|
||||||
|
|
||||||
private static ProcFileReader buildReader(String string) throws IOException {
|
private static ProcFileReader buildReader(String string) throws IOException {
|
||||||
return buildReader(string, 2048);
|
return buildReader(string, 2048);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user