blob: 68fa7f274ac2605fa6fa161c38b7e18db366a61d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2012 Ericsson and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Ericsson - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.internal.ui.actions;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.core.model.IResumeAtAddress;
import org.eclipse.cdt.debug.core.model.IResumeAtLine;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
import org.eclipse.cdt.dsf.concurrent.Query;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl2;
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
/**
* Implements the CDT's resume at line interface.
*
* @since 2.1
*/
public class ResumeAtLine implements IResumeAtLine, IResumeAtAddress {
private final IExecutionDMContext fContext;
public ResumeAtLine(IExecutionDMContext context) {
fContext = context;
}
@Override
public boolean canResumeAtLine(IFile file, final int lineNumber) {
return canResumeAtLine(file.getLocation().makeAbsolute().toOSString(), lineNumber);
}
@Override
public boolean canResumeAtLine(final String fileName, final int lineNumber) {
DsfSession session = DsfSession.getSession(fContext.getSessionId());
if (session != null && session.isActive()) {
try {
Query<Boolean> query = new Query<>() {
@Override
protected void execute(DataRequestMonitor<Boolean> rm) {
DsfServicesTracker tracker = new DsfServicesTracker(DsfUIPlugin.getBundleContext(),
fContext.getSessionId());
IRunControl2 runControl = tracker.getService(IRunControl2.class);
if (runControl != null) {
runControl.canMoveToLine(fContext, fileName, lineNumber, true, rm);
} else {
rm.setData(false);
rm.done();
}
tracker.dispose();
}
};
session.getExecutor().execute(query);
return query.get(IDsfActionsConstants.ACTION_ADAPTERS_TIMEOUT_MS, TimeUnit.MILLISECONDS);
} catch (RejectedExecutionException e) {
} catch (InterruptedException e) {
} catch (ExecutionException e) {
} catch (TimeoutException e) {
}
}
return false;
}
@Override
public void resumeAtLine(IFile file, int lineNumber) throws DebugException {
resumeAtLine(file.getLocation().makeAbsolute().toOSString(), lineNumber);
}
@Override
public void resumeAtLine(final String fileName, final int lineNumber) throws DebugException {
DsfSession session = DsfSession.getSession(fContext.getSessionId());
if (session != null && session.isActive()) {
Throwable exception = null;
try {
Query<Object> query = new Query<>() {
@Override
protected void execute(final DataRequestMonitor<Object> rm) {
DsfServicesTracker tracker = new DsfServicesTracker(DsfUIPlugin.getBundleContext(),
fContext.getSessionId());
IRunControl2 runControl = tracker.getService(IRunControl2.class);
if (runControl != null) {
runControl.moveToLine(fContext, fileName, lineNumber, true, rm);
} else {
rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID,
IDsfStatusConstants.NOT_SUPPORTED, "IRunControl2 service not available", null)); //$NON-NLS-1$
rm.done();
}
tracker.dispose();
}
};
session.getExecutor().execute(query);
query.get();
} catch (RejectedExecutionException e) {
exception = e;
} catch (InterruptedException e) {
exception = e;
} catch (ExecutionException e) {
exception = e;
}
if (exception != null) {
throw new DebugException(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, DebugException.REQUEST_FAILED,
"Failed executing move to line", exception)); //$NON-NLS-1$
}
} else {
throw new DebugException(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, DebugException.REQUEST_FAILED,
"Debug session is not active", null)); //$NON-NLS-1$
}
}
@Override
public boolean canResumeAtAddress(final IAddress address) {
DsfSession session = DsfSession.getSession(fContext.getSessionId());
if (session != null && session.isActive()) {
try {
Query<Boolean> query = new Query<>() {
@Override
protected void execute(DataRequestMonitor<Boolean> rm) {
DsfServicesTracker tracker = new DsfServicesTracker(DsfUIPlugin.getBundleContext(),
fContext.getSessionId());
IRunControl2 runControl = tracker.getService(IRunControl2.class);
if (runControl != null) {
runControl.canMoveToAddress(fContext, address, true, rm);
} else {
rm.setData(false);
rm.done();
}
tracker.dispose();
}
};
session.getExecutor().execute(query);
return query.get(IDsfActionsConstants.ACTION_ADAPTERS_TIMEOUT_MS, TimeUnit.MILLISECONDS);
} catch (RejectedExecutionException e) {
} catch (InterruptedException e) {
} catch (ExecutionException e) {
} catch (TimeoutException e) {
}
}
return false;
}
@Override
public void resumeAtAddress(final IAddress address) throws DebugException {
DsfSession session = DsfSession.getSession(fContext.getSessionId());
if (session != null && session.isActive()) {
Throwable exception = null;
try {
Query<Object> query = new Query<>() {
@Override
protected void execute(final DataRequestMonitor<Object> rm) {
DsfServicesTracker tracker = new DsfServicesTracker(DsfUIPlugin.getBundleContext(),
fContext.getSessionId());
IRunControl2 runControl = tracker.getService(IRunControl2.class);
if (runControl != null) {
runControl.moveToAddress(fContext, address, true, rm);
} else {
rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID,
IDsfStatusConstants.NOT_SUPPORTED, "IRunControl2 service not available", null)); //$NON-NLS-1$
rm.done();
}
tracker.dispose();
}
};
session.getExecutor().execute(query);
query.get();
} catch (RejectedExecutionException e) {
exception = e;
} catch (InterruptedException e) {
exception = e;
} catch (ExecutionException e) {
exception = e;
}
if (exception != null) {
throw new DebugException(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, DebugException.REQUEST_FAILED,
"Failed executing move to line", exception)); //$NON-NLS-1$
}
} else {
throw new DebugException(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, DebugException.REQUEST_FAILED,
"Debug session is not active", null)); //$NON-NLS-1$
}
}
}