| /******************************************************************************* |
| * 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$ |
| } |
| } |
| |
| } |