diff options
author | Andreas Loth | 2017-03-02 04:53:48 +0000 |
---|---|---|
committer | Sarika Sinha | 2017-03-02 04:53:48 +0000 |
commit | 5875ab13fa7cbd511932f98efcdeb50447d49d99 (patch) | |
tree | ab4196c371c13995e97999d5b99f688127d90526 /org.eclipse.ui.console | |
parent | b880d44d7e2ff505bfed40ca37b130b24e60993d (diff) | |
download | eclipse.platform.debug-5875ab13fa7cbd511932f98efcdeb50447d49d99.tar.gz eclipse.platform.debug-5875ab13fa7cbd511932f98efcdeb50447d49d99.tar.xz eclipse.platform.debug-5875ab13fa7cbd511932f98efcdeb50447d49d99.zip |
Bug 507664 - IOConsoleOutputStream does not handle multi-byte characters
at buffer boundaries correctly
Change-Id: Idfeabbcff7330541c5908ac4b3464a5cce1398ce
Signed-off-by: Andreas Loth <andy_2639@justmail.de>
Diffstat (limited to 'org.eclipse.ui.console')
-rw-r--r-- | org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java index 7e78ddf6a..70291df00 100644 --- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java +++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java @@ -14,6 +14,7 @@ package org.eclipse.ui.console; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; import org.eclipse.swt.graphics.Color; import org.eclipse.ui.internal.console.IOConsolePartitioner; @@ -158,6 +159,20 @@ public class IOConsoleOutputStream extends OutputStream { return closed; } + /** + * Writes remaining characters stored in the decoder state. + * + * Must only be called from synchronized methods. + * + * @see CharsetDecoder#flush(java.nio.CharBuffer) + * @throws IOException + */ + private void finishDecoder() throws IOException { + StringBuilder builder = new StringBuilder(); + this.decoder.finish(builder); + this.encodedWrite(builder.toString()); + } + /* * (non-Javadoc) * @see java.io.OutputStream#close() @@ -168,6 +183,7 @@ public class IOConsoleOutputStream extends OutputStream { // Closeable#close() has no effect if already closed return; } + this.finishDecoder(); if (prependCR) { // force writing of last /r prependCR = false; notifyParitioner("\r"); //$NON-NLS-1$ @@ -193,7 +209,7 @@ public class IOConsoleOutputStream extends OutputStream { * @see java.io.OutputStream#write(byte[], int, int) */ @Override - public void write(byte[] b, int off, int len) throws IOException { + public synchronized void write(byte[] b, int off, int len) throws IOException { StringBuilder builder = new StringBuilder(); this.decoder.decode(builder, b, off, len); encodedWrite(builder.toString()); @@ -317,10 +333,8 @@ public class IOConsoleOutputStream extends OutputStream { * @throws IOException if the stream is closed * @since 3.7 */ - public void setCharset(Charset charset) throws IOException { - StringBuilder builder = new StringBuilder(); - this.decoder.finish(builder); - this.encodedWrite(builder.toString()); + public synchronized void setCharset(Charset charset) throws IOException { + this.finishDecoder(); this.decoder = new StreamDecoder(charset); } |