/*******************************************************************************
* Copyright (c) 2014 Ericsson 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:
* Marc Khouzam (Ericsson) - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.mi.service.command;
import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor;
import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetDPrintfStyle;
import org.eclipse.cdt.dsf.mi.service.command.output.MIConsoleStreamOutput;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIOOBRecord;
import org.eclipse.cdt.dsf.mi.service.command.output.MIOutput;
/**
* @since 4.4
*/
@ConfinedToDsfExecutor("fConnection#getExecutor")
public class CLIEventProcessor_7_7 extends CLIEventProcessor_7_0
implements IEventProcessor
{
private final ICommandControlService fControl;
private boolean fResetDPrintfStyle;
public CLIEventProcessor_7_7(ICommandControlService connection, ICommandControlDMContext controlDmc) {
super(connection, controlDmc);
fControl = connection;
}
@Override
public void eventReceived(Object output) {
if (!fResetDPrintfStyle) {
// Only do this if we haven't already reset the dprintf style
for (MIOOBRecord oobr : ((MIOutput)output).getMIOOBRecords()) {
if (oobr instanceof MIConsoleStreamOutput) {
MIConsoleStreamOutput exec = (MIConsoleStreamOutput) oobr;
// Look for a printout that indicates that we cannot call inferior methods.
// This affects Ubuntu 32bit OS
if (exec.getCString().indexOf("Cannot call inferior functions") != -1) { //$NON-NLS-1$
// In this case, make sure we use the 'gdb' style of dprintf
// and not the 'call' one.
fResetDPrintfStyle = true;
if (fControl instanceof IMICommandControl) {
CommandFactory factory = ((IMICommandControl)fControl).getCommandFactory();
fControl.queueCommand(
factory.createMIGDBSetDPrintfStyle(fControl.getContext(), MIGDBSetDPrintfStyle.GDB_STYLE),
new ImmediateDataRequestMonitor<MIInfo>() {
@Override
protected void handleCompleted() {
// We accept errors
}
});
}
}
}
}
}
super.eventReceived(output);
}
}