From 07726310aefaf6477824bc300caa9d89ce04f595 Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Mon, 22 Mar 2010 18:02:45 -0700 Subject: [PATCH] Compact when NativeDaemonConnector hits buffer limit If NativeDaemonConnector hits its buffer limit, it would truncate the data and lose some information. This change compacts the buffer and then retries to read the rest of the data. Change-Id: I0d5fee097bdd6808212ef3ad6fb4abbc6310fd4a --- .../android/server/NativeDaemonConnector.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/services/java/com/android/server/NativeDaemonConnector.java b/services/java/com/android/server/NativeDaemonConnector.java index 39c847ab22..08d7ce6b30 100644 --- a/services/java/com/android/server/NativeDaemonConnector.java +++ b/services/java/com/android/server/NativeDaemonConnector.java @@ -48,6 +48,8 @@ final class NativeDaemonConnector implements Runnable { private String mSocket; private INativeDaemonConnectorCallbacks mCallbacks; + private final int BUFFER_SIZE = 4096; + class ResponseCode { public static final int ActionInitiated = 100; @@ -87,7 +89,7 @@ final class NativeDaemonConnector implements Runnable { } private void listenToSocket() throws IOException { - LocalSocket socket = null; + LocalSocket socket = null; try { socket = new LocalSocket(); @@ -100,13 +102,13 @@ final class NativeDaemonConnector implements Runnable { InputStream inputStream = socket.getInputStream(); mOutputStream = socket.getOutputStream(); - byte[] buffer = new byte[4096]; + byte[] buffer = new byte[BUFFER_SIZE]; + int start = 0; while (true) { - int count = inputStream.read(buffer); + int count = inputStream.read(buffer, start, BUFFER_SIZE - start); if (count < 0) break; - int start = 0; for (int i = 0; i < count; i++) { if (buffer[i] == 0) { String event = new String(buffer, start, i - start); @@ -139,6 +141,13 @@ final class NativeDaemonConnector implements Runnable { start = i + 1; } } + if (start != count) { + final int remaining = BUFFER_SIZE - start; + System.arraycopy(buffer, start, buffer, 0, remaining); + start = remaining; + } else { + start = 0; + } } } catch (IOException ex) { Slog.e(TAG, "Communications error", ex);