blob: 9c4ef1d1cb04e21e95eb025adce33f7b6c9ffc77 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2016 Kichwa Coders Ltd 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:
* Jonah Graham (Kichwa Coders) - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.examples.dsf.gdb.actions;
import java.util.Optional;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
import org.eclipse.cdt.examples.dsf.gdb.GDBExamplePlugin;
import org.eclipse.cdt.examples.dsf.gdb.commands.IShowVersionHandler;
import org.eclipse.cdt.examples.dsf.gdb.service.IGDBExtendedFunctions;
import org.eclipse.debug.core.commands.IDebugCommandRequest;
import org.eclipse.debug.core.commands.IEnabledStateRequest;
public class GdbShowVersionHandler implements IShowVersionHandler {
private final DsfExecutor fExecutor;
private final DsfServicesTracker fTracker;
public GdbShowVersionHandler(DsfSession session) {
fExecutor = session.getExecutor();
fTracker = new DsfServicesTracker(GDBExamplePlugin.getBundleContext(), session.getId());
}
public void dispose() {
fTracker.dispose();
}
private Optional<ICommandControlDMContext> getContext(final IDebugCommandRequest request) {
if (request.getElements().length != 1 || !(request.getElements()[0] instanceof IDMVMContext)) {
return Optional.empty();
}
final IDMVMContext context = (IDMVMContext) request.getElements()[0];
ICommandControlDMContext controlDmc = DMContexts.getAncestorOfType(context.getDMContext(),
ICommandControlDMContext.class);
if (controlDmc != null)
return Optional.of(controlDmc);
return Optional.empty();
}
@Override
public void canExecute(final IEnabledStateRequest request) {
final Optional<ICommandControlDMContext> context = getContext(request);
if (!context.isPresent()) {
request.setEnabled(false);
request.done();
return;
}
fExecutor.execute(new DsfRunnable() {
@Override
public void run() {
final IGDBExtendedFunctions funcService = fTracker.getService(IGDBExtendedFunctions.class);
if (funcService == null) {
request.setEnabled(false);
request.done();
} else {
funcService.canGetVersion(context.get(), new DataRequestMonitor<Boolean>(fExecutor, null) {
@Override
protected void handleCompleted() {
if (!isSuccess()) {
request.setEnabled(false);
} else {
request.setEnabled(getData());
}
request.done();
}
});
}
}
});
}
@Override
public boolean execute(final IDebugCommandRequest request) {
final Optional<ICommandControlDMContext> context = getContext(request);
if (!context.isPresent()) {
request.done();
return false;
}
fExecutor.execute(new DsfRunnable() {
@Override
public void run() {
final IGDBExtendedFunctions funcService = fTracker.getService(IGDBExtendedFunctions.class);
if (funcService == null) {
request.done();
} else {
funcService.getVersion(context.get(), new DataRequestMonitor<String>(fExecutor, null) {
@Override
protected void handleCompleted() {
String str;
if (isSuccess()) {
str = "======= GDB version: " + getData() + " ======="; //$NON-NLS-1$ //$NON-NLS-2$
} else {
str = "Could not obtain GDB version. Error: " + //$NON-NLS-1$
getStatus();
}
funcService.notify(context.get(), str, new RequestMonitor(fExecutor, null) {
@Override
protected void handleCompleted() {
request.done();
}
});
}
});
}
}
});
/*
* Return true so that the show version pop-up command is immediately
* reenabled, this allows users to run the command multiple times
* without any other operations in between. There is a small chance the
* command may be issued again while it is still running, however with
* this particular command it is very fast so that is unlikely. In
* addition for this command no harm comes if it is issued twice.
*
* Most commands return false here because they need to be reenabled by
* some operation. For example continue would only be reenabled by the
* state change in the backend to being suspended again.
*/
return true;
}
}