private boolean stashContinuationBytes(ByteBuffer nioBuffer, int missingBytes) { for (int i = 0; i < missingBytes; i++) { byte b = nioBuffer.get(); // make sure we only add continuation bytes in buffer if (isContinuation(b)) { splitCharBuffer.put(b); } else { // we hit a non-continuation byte // push it back and flush nioBuffer.position(nioBuffer.position() - 1); charBuffer.append(INVALID_CHAR_REPLACEMENT); splitCharBuffer.clear(); return false; } } return true; }
public void put(int index, String s) { int len = s.length(); int sLen = buffer.limit(); if (index < 0) return; char ch = len == 0 ? '\0' : s.charAt(0); if (index < sLen) buffer.put(index, ch); else { int cnt = index - sLen; CharBuffer tmp = CharBuffer.allocate(sLen + cnt + 1); tmp.put(buffer.array()); buffer = tmp; for(int i = 0; i < cnt; i++) { buffer.append('\32'); } buffer.append(ch); } }
private void handlePendingSplitCharBuffer(ByteBuffer nioBuffer, boolean endOfInput) { int charSize = moreThanOneByteCharSize(splitCharBuffer.get(0)); if (charSize > 0) { int missingBytes = charSize - splitCharBuffer.position(); if (nioBuffer.remaining() < missingBytes) { if (endOfInput) { charBuffer.append(INVALID_CHAR_REPLACEMENT); } else { stashContinuationBytes(nioBuffer, nioBuffer.remaining()); } } else if (stashContinuationBytes(nioBuffer, missingBytes)) { splitCharBuffer.flip(); decoder.decode(splitCharBuffer, charBuffer, endOfInput && !nioBuffer.hasRemaining()); splitCharBuffer.clear(); } } else { // drop chars until we hit a non continuation one charBuffer.append(INVALID_CHAR_REPLACEMENT); splitCharBuffer.clear(); } }
cbRef.set(out); while(in.remaining()>0) { out.append((char)in.get());
@Test public void testIpcService() throws IOException { unixDomainSocket = new UnixDomainSocket(reader, writer, RESPONSE.length()); doAnswer(invocation -> { Object[] args = invocation.getArguments(); ((CharBuffer) args[0]).append(RESPONSE); return RESPONSE.length(); // void method, so return null }).when(reader).read(any(CharBuffer.class)); runTest(); }
@Test public void testReadExceedsBuffer() throws IOException { int bufferSize = RESPONSE.length() / 3; unixDomainSocket = new UnixDomainSocket(reader, writer, RESPONSE.length() / 3); doAnswer(invocation -> { Object[] args = invocation.getArguments(); ((CharBuffer) args[0]).append(RESPONSE.substring(0, bufferSize)); return RESPONSE.length(); }) .doAnswer(invocation -> { Object[] args = invocation.getArguments(); ((CharBuffer) args[0]).append( RESPONSE.substring(bufferSize, bufferSize * 2)); return RESPONSE.length(); }).doAnswer(invocation -> { Object[] args = invocation.getArguments(); ((CharBuffer) args[0]).append( RESPONSE.substring(bufferSize * 2, bufferSize * 3)); return RESPONSE.length(); }) .doAnswer(invocation -> { Object[] args = invocation.getArguments(); ((CharBuffer) args[0]).append( RESPONSE.substring(bufferSize * 3, RESPONSE.length())); return RESPONSE.length(); }) .when(reader).read(any(CharBuffer.class)); runTest(); }
@Test public void testSlowResponse() throws Exception { String response = "{\"jsonrpc\":\"2.0\",\"id\":1," + "\"result\":\"Geth/v1.5.4-stable-b70acf3c/darwin/go1.7.3\"}\n"; unixDomainSocket = new UnixDomainSocket(reader, writer, response.length()); final LinkedList<String> segments = new LinkedList<>(); // 1st part of response segments.add(response.substring(0, 50)); // rest of response segments.add(response.substring(50)); doAnswer(invocation -> { String segment = segments.poll(); if (segment == null) { return 0; } else { Object[] args = invocation.getArguments(); ((CharBuffer) args[0]).append(segment); return segment.length(); } }).when(reader).read(any(CharBuffer.class)); IpcService ipcService = new IpcService() { @Override protected IOFacade getIO() { return unixDomainSocket; } }; ipcService.send(new Request(), Web3ClientVersion.class); } }
@Test public void testAppendCharBuffer() { final StrBuilder sb1 = new StrBuilder(); final CharBuffer buf = CharBuffer.allocate(10); buf.append("0123456789"); buf.flip(); sb1.append(buf); assertEquals("0123456789", sb1.toString()); final StrBuilder sb2 = new StrBuilder(); sb2.append(buf, 1, 8); assertEquals("12345678", sb2.toString()); }
@Override protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) { while (true) { if (!in.hasRemaining()) return CoderResult.UNDERFLOW; if (!out.hasRemaining()) return CoderResult.OVERFLOW; byte b = in.get(); out.append((char) ((b >= 0) ? b : 0xF700 + (b & 0xFF))); } } };
@Override public Output append( CharSequence str ) { output.append( str ); return this; }
@Test public void testAppendCharBuffer() { final TextStringBuilder sb1 = new TextStringBuilder(); final CharBuffer buf = CharBuffer.allocate(10); buf.append("0123456789"); buf.flip(); sb1.append(buf); assertEquals("0123456789", sb1.toString()); final TextStringBuilder sb2 = new TextStringBuilder(); sb2.append(buf, 1, 8); assertEquals("12345678", sb2.toString()); }
@Test public void testAppendCharBuffer() { final StrBuilder sb1 = new StrBuilder(); final CharBuffer buf = CharBuffer.allocate(10); buf.append("0123456789"); buf.flip(); sb1.append(buf); assertEquals("0123456789", sb1.toString()); final StrBuilder sb2 = new StrBuilder(); sb2.append(buf, 1, 8); assertEquals("12345678", sb2.toString()); }
@Override protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) { while (true) { if (!in.hasRemaining()) return CoderResult.UNDERFLOW; if (!out.hasRemaining()) return CoderResult.OVERFLOW; byte b = in.get(); out.append((char) ((b >= 0) ? b : 0xF700 + (b & 0xFF))); } } };
private static String escapeChar(char chr) { CharBuffer cb = CharBuffer.allocate(7); if (USE_X_ESCAPE) { cb.append("_x"); //$NON-NLS-1$ } else { cb.append("_u"); //$NON-NLS-1$ } CharsetUtils.toHex(cb, (byte)(chr >> 8)); CharsetUtils.toHex(cb, (byte)chr); return cb.append("_").flip().toString(); //$NON-NLS-1$ }
public void dump(char c) { length += 1; processBuf(false); buf.append(c); }
@Override @JTranscAsync final public void decode(ByteBuffer in, CharBuffer out) { while (in.hasRemaining() && out.hasRemaining()) { int b = in.get() & 0xFF; out.append(decode.charAt(b)); } } }
@Override public int read(CharBuffer cb) { if(count-- == 0) return -1; String result = Double.toString(next()) + " "; cb.append(result); return result.length(); } public static void main(String[] args) {
public Appendable append(CharSequence in) throws IOException{ for(int start = 0, len = in.length(); start < len;){ int read = Math.min(cb.remaining(), len - start); cb.append(in, start, start + read); start += read; if(!cb.hasRemaining()){ flush(false); } } return this; }