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
diff --git a/services/java/com/android/server/NativeDaemonConnector.java b/services/java/com/android/server/NativeDaemonConnector.java
index 39c847a..08d7ce6 100644
--- a/services/java/com/android/server/NativeDaemonConnector.java
+++ b/services/java/com/android/server/NativeDaemonConnector.java
@@ -48,6 +48,8 @@
     private String                mSocket;
     private INativeDaemonConnectorCallbacks mCallbacks;
 
+    private final int BUFFER_SIZE = 4096;
+
     class ResponseCode {
         public static final int ActionInitiated                = 100;
 
@@ -87,7 +89,7 @@
     }
 
     private void listenToSocket() throws IOException {
-       LocalSocket socket = null;
+        LocalSocket socket = null;
 
         try {
             socket = new LocalSocket();
@@ -100,13 +102,13 @@
             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 @@
                         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);