| /******************************************************************************* |
| * Copyright (c) 2009 IBM Corporation and others All rights reserved. This |
| * program and the accompanying materials are made available under the terms of |
| * the Eclipse Public License v1.0 which accompanies this distribution, and is |
| * available at http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.e4.languages.javascript.debug.connect; |
| |
| import java.io.BufferedReader; |
| import java.io.BufferedWriter; |
| import java.io.EOFException; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| import java.io.OutputStreamWriter; |
| import java.io.Reader; |
| import java.io.Writer; |
| import java.net.Socket; |
| import java.util.Map; |
| |
| public class SocketConnection implements Connection { |
| |
| private Writer writer; |
| private Reader reader; |
| private Socket socket; |
| |
| public SocketConnection(Socket socket) throws IOException { |
| this.socket = socket; |
| writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8")); //$NON-NLS-1$ |
| reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8")); //$NON-NLS-1$ |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.e4.languages.internal.javascript.debug.connect.Connection #isOpen() |
| */ |
| public boolean isOpen() { |
| return !socket.isClosed(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.e4.languages.internal.javascript.debug.connect.Connection #close() |
| */ |
| public void close() throws IOException { |
| socket.close(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.e4.languages.internal.javascript.debug.connect.Connection #writePacket(java.util.Map) |
| */ |
| public void writePacket(Packet packet) throws IOException { |
| String jsonString = JSONUtil.write(packet.toJSON()); |
| String count = Integer.toString(jsonString.length()); |
| writer.write(count); |
| writer.write('\r'); |
| writer.write('\n'); |
| writer.write(jsonString); |
| writer.flush(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.e4.languages.internal.javascript.debug.connect.Connection #readPacket() |
| */ |
| public Packet readPacket() throws IOException { |
| StringBuffer buffer = new StringBuffer(); |
| int c; |
| while ((c = reader.read()) != -1) { |
| if (c == '\r') |
| break; |
| buffer.append((char) c); |
| if (buffer.length() > 10) { |
| throw new IOException("Invalid content length: " + buffer.toString()); //$NON-NLS-1$ |
| } |
| } |
| |
| int length = 0; |
| try { |
| length = Integer.parseInt(buffer.toString()); |
| } catch (NumberFormatException e) { |
| throw new IOException("Failed to parse content length: " + buffer.toString()); //$NON-NLS-1$ |
| } |
| |
| if ('\r' != c || '\n' != (char) reader.read()) |
| throw new IOException("Missing CRLF after content length"); //$NON-NLS-1$ |
| |
| char[] message = new char[length]; |
| int n = 0; |
| int off = 0; |
| while (n < length) { |
| int count = reader.read(message, off + n, length - n); |
| if (count < 0) |
| throw new EOFException(); |
| n += count; |
| } |
| |
| Map json = (Map) JSONUtil.read(new String(message)); |
| String type = Packet.getType(json); |
| if (EventPacket.TYPE.equals(type)) |
| return new EventPacket(json); |
| if (JSONConstants.REQUEST.equals(type)) |
| return new Request(json); |
| if (JSONConstants.RESPONSE.equals(type)) |
| return new Response(json); |
| |
| throw new IOException("Unknown packet type: " + type); //$NON-NLS-1$ |
| } |
| } |