Fixed: [Issue 26] Terminal emulator does not honor the encoding of the
terminal connector
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/LocalTerminalConnector.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/LocalTerminalConnector.java
index 9da4a52..8d24772 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/LocalTerminalConnector.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/LocalTerminalConnector.java
@@ -38,18 +38,10 @@
public class LocalTerminalConnector extends TerminalConnectorDelegate implements LifeCycleListener {
private static final String ID = "com.google.eclipse.terminal.local.core.connector";
- public static final String ENCODING = "UTF-8";
-
- private IPath workingDirectory;
- private PseudoTerminal pseudoTerminal;
-
- private StreamsProxy streamsProxy;
- private OutputStream terminalToRemoteStream;
-
- public static ITerminalConnector createLocalTerminalConnector() {
+ public static ITerminalConnector createLocalTerminalConnector(final String encoding) {
TerminalConnector.Factory factory = new TerminalConnector.Factory(){
@Override public TerminalConnectorDelegate makeConnector() {
- return new LocalTerminalConnector();
+ return new LocalTerminalConnector(encoding);
}
};
TerminalConnector connector = new TerminalConnector(factory, ID, localTerminalName);
@@ -60,7 +52,17 @@
return connector;
}
- private LocalTerminalConnector() {}
+ private IPath workingDirectory;
+ private PseudoTerminal pseudoTerminal;
+
+ private StreamsProxy streamsProxy;
+ private OutputStream terminalToRemoteStream;
+
+ private final String encoding;
+
+ private LocalTerminalConnector(String encoding) {
+ this.encoding = encoding;
+ }
/**
* Verifies that PTY support is available on this platform.
@@ -81,8 +83,8 @@
pseudoTerminal.addLifeCycleListener(this);
try {
pseudoTerminal.launch();
- streamsProxy = new StreamsProxy(pseudoTerminal.systemProcess(), ENCODING);
- terminalToRemoteStream = new BufferedOutputStream(new TerminalOutputStream(streamsProxy, ENCODING), 1024);
+ streamsProxy = new StreamsProxy(pseudoTerminal.systemProcess(), encoding);
+ terminalToRemoteStream = new BufferedOutputStream(new TerminalOutputStream(streamsProxy, encoding), 1024);
addListeners(terminalControl, streamsProxy.getOutputStreamMonitor(), streamsProxy.getErrorStreamMonitor());
if (streamsProxy != null) {
terminalControl.setState(CONNECTED);
@@ -105,7 +107,7 @@
private void addListeners(ITerminalControl control, IStreamMonitor...monitors) throws UnsupportedEncodingException {
for (IStreamMonitor monitor : monitors) {
- addListener(monitor, new TerminalOutputListener(control));
+ addListener(monitor, new TerminalOutputListener(control, encoding));
}
}
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/TerminalOutputListener.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/TerminalOutputListener.java
index d993d89..aafd129 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/TerminalOutputListener.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/TerminalOutputListener.java
@@ -8,8 +8,6 @@
*/
package com.google.eclipse.terminal.local.core.connector;
-import static com.google.eclipse.terminal.local.core.connector.LocalTerminalConnector.ENCODING;
-
import java.io.*;
import org.eclipse.debug.core.IStreamListener;
@@ -23,16 +21,15 @@
class TerminalOutputListener implements IStreamListener {
private final PrintStream printStream;
- TerminalOutputListener(ITerminalControl control) throws UnsupportedEncodingException {
- printStream = new PrintStream(control.getRemoteToTerminalOutputStream(), true, ENCODING);
+ TerminalOutputListener(ITerminalControl control, String encoding) throws UnsupportedEncodingException {
+ printStream = new PrintStream(control.getRemoteToTerminalOutputStream(), true, encoding);
}
@Override public void streamAppended(String text, IStreamMonitor monitor) {
- String clean = text;
if (text.contains("\u001b[1A\u001b[K")) {
- clean = text.replace("\u001b[1A\u001b[K", "\u001b[K");
+ // clean = text.replace("\u001b[1A\u001b[K", "\u001b[K");
// TODO(alruiz) figure out why 1+ lines deleted in blaze build.
}
- printStream.print(clean);
+ printStream.print(text);
}
}
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/TerminalOutputStream.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/TerminalOutputStream.java
index dff8e4f..aff8254 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/TerminalOutputStream.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/TerminalOutputStream.java
@@ -31,6 +31,7 @@
@Override
public void write(byte[] b, int off, int len) throws IOException {
- streamsProxy.write(new String(b, off, len, encoding));
+ String input = new String(b, off, len, encoding);
+ streamsProxy.write(input);
}
}
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java
index 3be64a7..7f592fe 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java
@@ -8,10 +8,12 @@
*/
package com.google.eclipse.terminal.local.ui.view;
-
import static com.google.eclipse.terminal.local.core.connector.LocalTerminalConnector.createLocalTerminalConnector;
+import static com.google.eclipse.terminal.local.util.Encodings.DEFAULT_ENCODING;
import static com.google.eclipse.tm.internal.terminal.provisional.api.TerminalState.CONNECTING;
+import java.io.UnsupportedEncodingException;
+
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.layout.*;
import org.eclipse.swt.SWT;
@@ -34,13 +36,20 @@
private final VT100TerminalControl terminalControl;
private LifeCycleListener lifeCycleListener;
+ private final String encoding = DEFAULT_ENCODING;
TerminalWidget(Composite parent, IViewSite viewSite) {
super(parent, SWT.NONE);
GridLayoutFactory.fillDefaults().spacing(0, 0).applyTo(this);
- ITerminalConnector terminalConnector = createLocalTerminalConnector();
+ ITerminalConnector terminalConnector = createLocalTerminalConnector(encoding);
terminalControl = new VT100TerminalControl(terminalListener, this, new ITerminalConnector[] { terminalConnector });
terminalControl.setConnector(terminalConnector);
+ try {
+ terminalControl.setEncoding(encoding);
+ } catch (UnsupportedEncodingException e) {
+ // TODO(alruiz): do something meaningful with the exception.
+ e.printStackTrace();
+ }
GridDataFactory.fillDefaults().grab(true, true).applyTo(terminalControl.getRootControl());
terminalControl.setInvertedColors(true);
addDisposeListener(new DisposeListener() {
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/util/Encodings.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/util/Encodings.java
new file mode 100644
index 0000000..1e5dd7b
--- /dev/null
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/util/Encodings.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2012 Google Inc.
+ *
+ * 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
+ */
+package com.google.eclipse.terminal.local.util;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public final class Encodings {
+ public static final String DEFAULT_ENCODING = "ISO-8859-1";
+
+ private Encodings() {}
+}