org.chromium.sdk/src/org/chromium/sdk/internal/transport/SocketConnection.java
changeset 52 f577ea64429e
parent 2 e4420d2515f1
--- a/org.chromium.sdk/src/org/chromium/sdk/internal/transport/SocketConnection.java	Wed Jan 27 10:42:14 2010 -0800
+++ b/org.chromium.sdk/src/org/chromium/sdk/internal/transport/SocketConnection.java	Wed Jan 27 15:45:27 2010 -0800
@@ -20,6 +20,7 @@
 import java.util.logging.Logger;
 
 import org.chromium.sdk.ConnectionLogger;
+import org.chromium.sdk.LineReader;
 import org.chromium.sdk.internal.transport.Message.MalformedMessageException;
 
 /**
@@ -67,9 +68,9 @@
    */
   private class WriterThread extends InterruptibleThread {
 
-    private final BufferedWriter writer;
+    private final ConnectionLogger.LoggableWriter writer;
 
-    public WriterThread(BufferedWriter writer) {
+    public WriterThread(ConnectionLogger.LoggableWriter writer) {
       super("WriterThread");
       this.writer = writer;
     }
@@ -88,7 +89,8 @@
     private void handleOutboundMessage(Message message) {
       try {
         LOGGER.log(Level.FINER, "-->{0}", message);
-        message.sendThrough(writer);
+        message.sendThrough(writer.getWriter());
+        writer.markSeparatorForLog();
       } catch (IOException e) {
         SocketConnection.this.shutdown(e, false);
       }
@@ -131,10 +133,11 @@
    */
   private class ReaderThread extends InterruptibleThread {
 
-    private final BufferedReader reader;
-    private final Writer handshakeWriter;
+    private final ConnectionLogger.LoggableReader reader;
+    private final ConnectionLogger.LoggableWriter handshakeWriter;
 
-    public ReaderThread(BufferedReader reader, Writer handshakeWriter) {
+    public ReaderThread(ConnectionLogger.LoggableReader reader,
+        ConnectionLogger.LoggableWriter handshakeWriter) {
       super("ReaderThread");
       this.reader = reader;
       this.handshakeWriter = handshakeWriter;
@@ -151,14 +154,17 @@
           connectionLogger.start();
         }
 
-        handshaker.perform(reader, handshakeWriter);
+        handshaker.perform(reader.getReader(), handshakeWriter.getWriter());
+
+        reader.markSeparatorForLog();
+        handshakeWriter.markSeparatorForLog();
 
         startWriterThread();
 
         while (!isTerminated && isAttached.get()) {
           Message message;
           try {
-            message = Message.fromBufferedReader(reader);
+            message = Message.fromBufferedReader(reader.getReader());
           } catch (MalformedMessageException e) {
             LOGGER.log(Level.SEVERE, "Malformed protocol message", e);
             continue;
@@ -168,6 +174,7 @@
             break;
           }
           inboundQueue.add(new RegularMessageItem(message));
+          reader.markSeparatorForLog();
         }
         breakException = null;
       } catch (IOException e) {
@@ -238,13 +245,13 @@
   private AtomicBoolean isAttached = new AtomicBoolean(false);
 
   /** The communication socket. */
-  protected Socket socket;
+  private Socket socket;
 
   /** The socket reader. */
-  protected BufferedReader reader;
+  private ConnectionLogger.LoggableReader reader;
 
   /** The socket writer. */
-  protected BufferedWriter writer;
+  private ConnectionLogger.LoggableWriter writer;
 
   private final ConnectionLogger connectionLogger;
 
@@ -252,13 +259,13 @@
   private final Handshaker handshaker;
 
   /** The listener to report network events to. */
-  protected volatile NetListener listener;
+  private volatile NetListener listener;
 
   /** The inbound message queue. */
-  protected final BlockingQueue<MessageItem> inboundQueue = new LinkedBlockingQueue<MessageItem>();
+  private final BlockingQueue<MessageItem> inboundQueue = new LinkedBlockingQueue<MessageItem>();
 
   /** The outbound message queue. */
-  protected final BlockingQueue<Message> outboundQueue = new LinkedBlockingQueue<Message>();
+  private final BlockingQueue<Message> outboundQueue = new LinkedBlockingQueue<Message>();
 
   /** The socket endpoint. */
   private final SocketAddress socketEndpoint;
@@ -283,12 +290,44 @@
   void attach() throws IOException {
     this.socket = new Socket();
     this.socket.connect(socketEndpoint, connectionTimeoutMs);
-    Writer streamWriter = new OutputStreamWriter(socket.getOutputStream(), SOCKET_CHARSET);
-    Reader streamReader = new InputStreamReader(socket.getInputStream(), SOCKET_CHARSET);
+    final Writer streamWriter = new OutputStreamWriter(socket.getOutputStream(), SOCKET_CHARSET);
+    final Reader streamReader = new InputStreamReader(socket.getInputStream(), SOCKET_CHARSET);
+
+    ConnectionLogger.LoggableReader loggableReader = new ConnectionLogger.LoggableReader() {
+      private final LineReader lineReader;
+      {
+        final BufferedReader bufferedReader =
+            new BufferedReader(streamReader, INPUT_BUFFER_SIZE_BYTES);
+        lineReader = new LineReader() {
+          public int read(char[] cbuf, int off, int len) throws IOException {
+            return bufferedReader.read(cbuf, off, len);
+          }
+          public String readLine() throws IOException {
+            return bufferedReader.readLine();
+          }
+        };
+      }
+
+      public LineReader getReader() {
+        return lineReader;
+      }
+
+      public void markSeparatorForLog() {
+      }
+    };
+
+    ConnectionLogger.LoggableWriter loggableWriter = new ConnectionLogger.LoggableWriter() {
+      private final BufferedWriter bufferedWriter = new BufferedWriter(streamWriter);
+      public Writer getWriter() {
+        return bufferedWriter;
+      }
+      public void markSeparatorForLog() {
+      }
+    };
 
     if (connectionLogger != null) {
-      streamWriter = connectionLogger.wrapWriter(streamWriter);
-      streamReader = connectionLogger.wrapReader(streamReader);
+      loggableWriter = connectionLogger.wrapWriter(loggableWriter);
+      loggableReader = connectionLogger.wrapReader(loggableReader);
       connectionLogger.setConnectionCloser(new ConnectionLogger.ConnectionCloser() {
         public void closeConnection() {
           close();
@@ -296,8 +335,8 @@
       });
     }
 
-    this.writer = new BufferedWriter(streamWriter);
-    this.reader = new BufferedReader(streamReader, INPUT_BUFFER_SIZE_BYTES);
+    this.writer = loggableWriter;
+    this.reader = loggableReader;
     isAttached.set(true);
 
     this.readerThread = new ReaderThread(reader, writer);