/*******************************************************************************
* Copyright (c) 2000, 2006 QNX Software Systems 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:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.cdi;
import java.util.Properties;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICDISessionConfiguration;
import org.eclipse.cdt.debug.core.cdi.ICDIEventManager;
import org.eclipse.cdt.debug.core.cdi.ICDISession;
import org.eclipse.cdt.debug.core.cdi.ICDISessionObject;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
import org.eclipse.cdt.debug.mi.core.MISession;
import org.eclipse.cdt.debug.mi.core.cdi.event.DestroyedEvent;
import org.eclipse.cdt.debug.mi.core.cdi.model.Target;
/**
* @see org.eclipse.cdt.debug.core.cdi.ICDISession
*/
public class Session implements ICDISession, ICDISessionObject {
public final static Target[] EMPTY_TARGETS = {};
Properties props;
ProcessManager processManager;
EventManager eventManager;
BreakpointManager breakpointManager;
ExpressionManager expressionManager;
VariableManager variableManager;
RegisterManager registerManager;
MemoryManager memoryManager;
SharedLibraryManager sharedLibraryManager;
SignalManager signalManager;
SourceManager sourceManager;
ICDISessionConfiguration configuration;
public Session(MISession miSession, ICDISessionConfiguration configuration) {
commonSetup();
Target target = new Target(this, miSession);
addTargets(new Target[] { target });
setConfiguration(configuration);
}
// Why do we need this?
public Session(MISession miSession, boolean attach) {
this(miSession);
}
public Session(MISession miSession) {
commonSetup();
Target target = new Target(this, miSession);
addTargets(new Target[] { target });
setConfiguration(new SessionConfiguration(this));
}
private void commonSetup() {
props = new Properties();
processManager = new ProcessManager(this);
breakpointManager = new BreakpointManager(this);
eventManager = new EventManager(this);
expressionManager = new ExpressionManager(this);
variableManager = new VariableManager(this);
registerManager = new RegisterManager(this);
memoryManager = new MemoryManager(this);
signalManager = new SignalManager(this);
sourceManager = new SourceManager(this);
sharedLibraryManager = new SharedLibraryManager(this);
}
public void addTargets(Target[] targets) {
ProcessManager pMgr = getProcessManager();
pMgr.addTargets(targets);
}
public void removeTargets(Target[] targets) {
ProcessManager pMgr = getProcessManager();
pMgr.removeTargets(targets);
}
public Target getTarget(MISession miSession) {
ProcessManager pMgr = getProcessManager();
return pMgr.getTarget(miSession);
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICDISession#getAttribute(String)
*/
public String getAttribute(String key) {
return props.getProperty(key);
}
public ProcessManager getProcessManager() {
return processManager;
}
public BreakpointManager getBreakpointManager() {
return breakpointManager;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICDISession#getEventManager()
*/
public ICDIEventManager getEventManager() {
return eventManager;
}
public ExpressionManager getExpressionManager() {
return expressionManager;
}
public VariableManager getVariableManager() {
return variableManager;
}
public RegisterManager getRegisterManager() {
return registerManager;
}
public SharedLibraryManager getSharedLibraryManager() {
return sharedLibraryManager;
}
public MemoryManager getMemoryManager() {
return memoryManager;
}
public SignalManager getSignalManager() {
return signalManager;
}
public SourceManager getSourceManager() {
return sourceManager;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICDISession#getTargets()
*/
public ICDITarget[] getTargets() {
ProcessManager pMgr = getProcessManager();
return pMgr.getCDITargets();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICDISession#setAttribute(String, String)
*/
public void setAttribute(String key, String value) {
props.setProperty(key, value);
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICDISession#getConfiguration()
*/
public ICDISessionConfiguration getConfiguration() {
return configuration;
}
public void setConfiguration(ICDISessionConfiguration conf) {
configuration = conf;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICDISessionObject#getSession()
*/
public ICDISession getSession() {
return this;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICDISession#terminate(ICDITarget)
*/
public void terminate() throws CDIException {
ProcessManager pMgr = getProcessManager();
Target[] targets = pMgr.getTargets();
for (int i = 0; i < targets.length; ++i) {
if (!targets[i].getMISession().isTerminated()) {
targets[i].getMISession().terminate();
}
}
// Do not do the removeTargets(), Target.getMISession().terminate() will do it
// via an event, MIGDBExitEvent of the mi session
//removeTargets(targets);
// wait ~2 seconds for the targets to be terminated.
for (int i = 0; i < 2; ++i) {
targets = pMgr.getTargets();
if (targets.length == 0) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//
}
}
// send our goodbyes.
EventManager eMgr = (EventManager)getEventManager();
eMgr.fireEvents(new ICDIEvent[] { new DestroyedEvent(this) });
eMgr.removeEventListeners();
}
/**
* @deprecated
* @see org.eclipse.cdt.debug.core.cdi.ICDISession#getSessionProcess()
*/
public Process getSessionProcess() throws CDIException {
ICDITarget[] targets = getTargets();
if (targets != null && targets.length > 0) {
return getSessionProcess(targets[0]);
}
return null;
}
public Process getSessionProcess(ICDITarget target) {
MISession miSession = ((Target)target).getMISession();
return miSession.getSessionProcess();
}
}