/**
* Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package com.python.pydev.debug.model;
import java.io.InputStream;
import java.io.OutputStream;
import org.python.pydev.core.log.Log;
import org.python.pydev.shared_core.io.PipedInputStream;
import org.python.pydev.shared_core.string.StringUtils;
import com.python.pydev.debug.DebugPluginPrefsInitializer;
import com.python.pydev.debug.remote.RemoteDebuggerServer;
/**
* This is the process for the remote debugger. This is a process 'mock' and only
* one process is available for any number of clients connecting at it.
*
* The stdout and stderr are 'MyPipedInputStream' objects so that we can write to it and get
* clients listening to them to hear it.
*/
public class ProcessServer extends Process {
private PipedInputStream inputStream;
private PipedInputStream errorStream;
private OutputStream outputStream;
private Object lock;
public ProcessServer() {
super();
try {
inputStream = new PipedInputStream();
inputStream.write(StringUtils.format("Debug Server at port: %s\r\n",
DebugPluginPrefsInitializer.getRemoteDebuggerPort()).getBytes());
errorStream = new PipedInputStream();
outputStream = new ProcessServerOutputStream();
lock = new Object();
} catch (Exception e) {
Log.log(e);
throw new RuntimeException(e);
}
}
@Override
public OutputStream getOutputStream() {
return outputStream;
}
@Override
public InputStream getInputStream() {
return inputStream;
}
@Override
public InputStream getErrorStream() {
return errorStream;
}
@Override
public int waitFor() throws InterruptedException {
synchronized (lock) {
lock.wait();
}
return 0;
}
@Override
public int exitValue() {
throw new IllegalThreadStateException();
}
@Override
public void destroy() {
synchronized (lock) {
lock.notify();
}
//Let it manage if it was already disposed or not.
RemoteDebuggerServer.getInstance().dispose();
try {
if (outputStream != null) {
outputStream.close();
outputStream = null;
}
} catch (Exception e) {
Log.log(e);
}
try {
if (inputStream != null) {
inputStream.close();
inputStream = null;
}
} catch (Exception e) {
Log.log(e);
}
try {
if (errorStream != null) {
errorStream.close();
errorStream = null;
}
} catch (Exception e) {
Log.log(e);
}
}
/**
* Print something to the stdout in the server console
*/
public void writeToStdOut(String str) {
try {
PipedInputStream p = inputStream;
if (p != null) {
p.write(str.getBytes());
}
} catch (Exception e) {
Log.log(e);
}
}
/**
* Print something to the stdout in the server console
*/
public void writeToStdErr(String str) {
try {
PipedInputStream p = errorStream;
if (p != null) {
p.write(str.getBytes());
}
} catch (Exception e) {
Log.log(e);
}
}
}