package com.netifera.platform.net.daemon.sniffing.ui;
import java.util.Collection;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.ControlContribution;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.PlatformUI;
import com.netifera.platform.api.events.IEvent;
import com.netifera.platform.api.events.IEventHandler;
import com.netifera.platform.api.probe.IProbe;
import com.netifera.platform.net.daemon.sniffing.ISniffingDaemon;
import com.netifera.platform.net.pcap.ICaptureInterface;
public class SniffingActionManager {
private final RGB WARNING_COLOR = new RGB(0xF5, 0xA9, 0xA9);
private final StartSnifferAction startSnifferAction;
private final StopSniffingAction stopSnifferAction;
private final ConfigureAction configureAction;
private final CaptureFileAction captureAction;
// The Model View toolbar contributions so we can add and remove them.
private final IContributionItem snifferActionItem;
private final IContributionItem stopSniffingActionItem;
private final IContributionItem captureFileItem;
private final ActionContributionItem configItem;
private IToolBarManager toolbarManager;
private IEventHandler probeEventHandler;
private ISniffingDaemon currentSniffingDaemon;
private IEventHandler changeHandler;
SniffingActionManager(IToolBarManager manager) {
toolbarManager = manager;
captureAction = new CaptureFileAction(this);
captureFileItem = new ActionContributionItem(captureAction);
configureAction = new ConfigureAction(this);
configItem = new ActionContributionItem(configureAction);
startSnifferAction = new StartSnifferAction(this);
snifferActionItem = new ActionContributionItem(startSnifferAction);
stopSnifferAction = new StopSniffingAction(this);
stopSniffingActionItem = new ActionContributionItem(stopSnifferAction);
manager.add(stopSniffingActionItem);
manager.add(snifferActionItem);
manager.add(configItem);
manager.add(captureFileItem);
changeHandler = new IEventHandler() {
public void handleEvent(IEvent event) {
setState();
}
};
currentSniffingDaemon = Activator.getDefault().createSniffingDaemon(changeHandler);
addProbeChangeListener();
}
private void addProbeChangeListener() {
probeEventHandler = new IEventHandler() {
public void handleEvent(IEvent event) {
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
currentSniffingDaemon = Activator.getDefault().createSniffingDaemon(changeHandler);
setState();
}
});
}
};
Activator.getDefault().getProbeManager().addProbeChangeListener(probeEventHandler);
}
public void dispose() {
Activator.getDefault().getProbeManager().removeProbeChangeListener(probeEventHandler);
}
public IToolBarManager getToolBar() {
return toolbarManager;
}
public void setFailed(final String message) {
IContributionItem snifferLabelItem = new ControlContribution("sniffer_text") {
@Override
protected Control createControl(Composite parent) {
final CLabel label = new CLabel(parent, SWT.CENTER);
label.setBackground(new Color(parent.getDisplay(), WARNING_COLOR));
label.setText(" " + message + " ");
label.pack(true);
return label;
}
};
toolbarManager.insertAfter(CaptureFileAction.ID, snifferLabelItem);
toolbarManager.update(true);
}
public void asynchSetState() {
if(PlatformUI.getWorkbench().getDisplay().isDisposed())
return;
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
setState();
}
});
}
public void setState() {
removeLabelIfExists();
enableAll();
final IProbe probe = Activator.getDefault().getCurrentProbe();
if(probe == null) {
failAll("No probe found!");
return;
}
if(!probe.isConnected()) {
failAll("Probe for this space is currently disconnected");
return;
}
final ISniffingDaemon daemon = Activator.getDefault().getSniffingDaemon();
if(daemon == null) {
failAll("No sniffing service found");
return;
}
final Collection<ICaptureInterface> interfaces = daemon.getInterfaces();
if(interfaces == null) {
failAll("No sniffing service found on remote probe");
return;
}
if(interfaces.isEmpty()) {
failLive("No packet capture interfaces found");
if(daemon.isRunning())
daemon.stop();
return;
}
if(!hasEnabledInterface(interfaces)) {
failLive("None of the interfaces are available");
if(daemon.isRunning())
daemon.stop();
return;
}
if(daemon.isRunning()) {
disableConfigAndCapture();
startSnifferAction.setEnabled(false);
} else {
stopSnifferAction.setEnabled(false);
}
}
private void removeLabelIfExists() {
final IContributionItem item = toolbarManager.remove("sniffer_text");
if(item != null) {
item.dispose();
toolbarManager.update(true);
}
}
private void failAll(String message) {
setFailed(message);
disableAll();
}
private void failLive(String message) {
setFailed(message);
startSnifferAction.setEnabled(false);
stopSnifferAction.setEnabled(false);
}
private boolean hasEnabledInterface(Collection<ICaptureInterface> interfaces) {
for(ICaptureInterface iface : interfaces) {
if(iface.captureAvailable())
return true;
}
return false;
}
public void disableConfigAndCapture() {
captureAction.setEnabled(false);
configureAction.setEnabled(false);
}
public void enableConfigAndCapture() {
captureAction.setEnabled(true);
configureAction.setEnabled(true);
}
public void disableAll() {
stopSnifferAction.setEnabled(false);
startSnifferAction.setEnabled(false);
configureAction.setEnabled(false);
captureAction.setEnabled(false);
}
private void enableAll() {
stopSnifferAction.setEnabled(true);
startSnifferAction.setEnabled(true);
configureAction.setEnabled(true);
captureAction.setEnabled(true);
}
public Point getConfigDialogLocation() {
Widget widget = configItem.getWidget();
if(!(widget instanceof ToolItem))
return null;
ToolItem item = (ToolItem) widget;
int x = item.getBounds().x;
int y = item.getBounds().y + item.getBounds().height;
Point p = item.getDisplay().map(item.getParent(), null, x, y);
return p;
}
}