package org.erlide.backend.debug.events;
import org.eclipse.debug.core.DebugEvent;
import org.erlide.backend.debug.model.ErlangDebugTarget;
import org.erlide.backend.debug.model.ErlangProcess;
import com.ericsson.otp.erlang.OtpErlangAtom;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangPid;
public class NewStatusEvent extends IntEvent {
public NewStatusEvent(final OtpErlangObject[] cmds) {
super(cmds);
}
@Override
public void execute(final ErlangDebugTarget debugTarget) {
final OtpErlangPid pid = (OtpErlangPid) cmds[1];
final ErlangProcess erlangProcess = debugTarget.getOrCreateErlangProcess(pid);
final OtpErlangAtom sa = (OtpErlangAtom) cmds[2];
final String status = sa.atomValue();
if (status.equals("break")) {
handleBreakStatus(erlangProcess, status);
} else if (status.equals("exit")) {
handleExitStatus(erlangProcess, status);
} else if (status.equals("running")) {
handleRunningStatus(erlangProcess, status);
} else if (status.equals("idle")) {
handleIdleStatus(erlangProcess, status);
} else {
erlangProcess.setStatus(status);
erlangProcess.fireChangeEvent(DebugEvent.STATE | DebugEvent.CHANGE);
}
}
private void handleIdleStatus(final ErlangProcess erlangProcess,
final String status) {
// FIXME: this must be cleaned, but the status messages seem
// to come out of order...
// erlangProcess.removeStackFrames();
erlangProcess.setStatus(status);
erlangProcess.fireChangeEvent(DebugEvent.STATE | DebugEvent.CHANGE);
}
private void handleRunningStatus(final ErlangProcess erlangProcess,
final String status) {
erlangProcess.setStatus(status);
if (erlangProcess.isStepping()) {
erlangProcess.fireResumeEvent(DebugEvent.STEP_OVER);
} else {
erlangProcess.fireResumeEvent(DebugEvent.RESUME);
}
}
private void handleExitStatus(final ErlangProcess erlangProcess,
final String status) {
erlangProcess.setStatus(status);
final OtpErlangObject esa = cmds[3];
erlangProcess.setExitStatus(esa.toString());
erlangProcess.fireSuspendEvent(DebugEvent.TERMINATE);
}
private void handleBreakStatus(final ErlangProcess erlangProcess,
final String status) {
erlangProcess.setStatus(status);
if (!erlangProcess.isStepping()) {
erlangProcess.fireSuspendEvent(DebugEvent.BREAKPOINT);
}
}
}