/******************************************************************************* * Copyright (c) 2012 Sierra Wireless 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: * Sierra Wireless - initial API and implementation *******************************************************************************/ package org.eclipse.koneki.ldt.remote.debug.core.internal.sshprocess; //FIXME This class is partial copy from eclipse.debug.core plugin import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.eclipse.debug.core.model.IStreamMonitor; import org.eclipse.debug.core.model.IStreamsProxy; import org.eclipse.debug.core.model.IStreamsProxy2; /** * Standard implementation of a streams proxy for IStreamsProxy. */ public class StreamsProxy implements IStreamsProxy, IStreamsProxy2 { /** * The monitor for the output stream (connected to standard out of the process) */ private OutputStreamMonitor fOutputMonitor; /** * The monitor for the error stream (connected to standard error of the process) */ private OutputStreamMonitor fErrorMonitor; /** * The monitor for the input stream (connected to standard in of the process) */ private InputStreamMonitor fInputMonitor; /** * Records the open/closed state of communications with the underlying streams. Note: fClosed is initialized to <code>false</code> by default. */ private boolean fClosed; /** * Creates a <code>StreamsProxy</code> on the streams of the given system process. * * @param process * system process to create a streams proxy on * @param encoding * the process's encoding or <code>null</code> if default */ public StreamsProxy(InputStream inputStream, InputStream errorStream, OutputStream outputStream, String inputEncoding, String outputEncoding) { fOutputMonitor = new OutputStreamMonitor(inputStream, inputEncoding); fErrorMonitor = new OutputStreamMonitor(errorStream, inputEncoding); fInputMonitor = new InputStreamMonitor(outputStream, outputEncoding); fOutputMonitor.startMonitoring(); fErrorMonitor.startMonitoring(); fInputMonitor.startMonitoring(); } /** * Causes the proxy to close all communications between it and the underlying streams after all remaining data in the streams is read. */ public void close() { if (!isClosed(true)) { fOutputMonitor.close(); fErrorMonitor.close(); fInputMonitor.close(); } } /** * Returns whether the proxy is currently closed. This method synchronizes access to the <code>fClosed</code> flag. * * @param setClosed * If <code>true</code> this method will also set the <code>fClosed</code> flag to true. Otherwise, the <code>fClosed</code> flag is * not modified. * @return Returns whether the stream proxy was already closed. */ private boolean isClosed(boolean setClosed) { boolean closed; synchronized (this) { closed = fClosed; if (setClosed) { fClosed = true; } } return closed; } /** * Causes the proxy to close all communications between it and the underlying streams immediately. Data remaining in the streams is lost. */ public void kill() { synchronized (this) { fClosed = true; } fOutputMonitor.kill(); fErrorMonitor.kill(); fInputMonitor.close(); } /** * @see IStreamsProxy#getErrorStreamMonitor() */ public IStreamMonitor getErrorStreamMonitor() { return fErrorMonitor; } /** * @see IStreamsProxy#getOutputStreamMonitor() */ public IStreamMonitor getOutputStreamMonitor() { return fOutputMonitor; } /** * @see IStreamsProxy#write(String) */ public void write(String input) throws IOException { if (!isClosed(false)) { fInputMonitor.write(input); } else { throw new IOException(); } } /* * (non-Javadoc) * * @see org.eclipse.debug.core.model.IStreamsProxy2#closeInputStream() */ public void closeInputStream() throws IOException { if (!isClosed(false)) { fInputMonitor.closeInputStream(); } else { throw new IOException(); } } }