package com.netifera.platform.net.wifi.ui.toolbar; 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.probe.IProbe; import com.netifera.platform.net.pcap.ICaptureInterface; import com.netifera.platform.net.wifi.pcap.IWirelessCaptureInterface; import com.netifera.platform.net.wifi.sniffing.IWifiSniffingDaemon; import com.netifera.platform.net.wifi.ui.Activator; public class WifiToolbar { private final RGB WARNING_COLOR = new RGB(0xF5, 0xA9, 0xA9); private final StartWifiSnifferAction startAction; private final IContributionItem startActionItem; private final StopWifiSnifferAction stopAction; private final ConfigureWifiSnifferAction configureAction; private final OpenCaptureFileAction captureAction; private final IContributionItem stopActionItem; private final ActionContributionItem configureActionItem; private final IContributionItem captureActionItem; private final IToolBarManager toolbarManager; public WifiToolbar(IToolBarManager manager) { toolbarManager = manager; startAction = new StartWifiSnifferAction(this); startActionItem = new ActionContributionItem(startAction); stopAction = new StopWifiSnifferAction(this); stopActionItem = new ActionContributionItem(stopAction); configureAction = new ConfigureWifiSnifferAction(this); configureActionItem = new ActionContributionItem(configureAction); captureAction = new OpenCaptureFileAction(this); captureActionItem = new ActionContributionItem(captureAction); manager.add(stopActionItem); manager.add(startActionItem); manager.add(configureActionItem); manager.add(captureActionItem); } public void dispose() { } public IToolBarManager getToolBar() { return toolbarManager; } public Point getConfigDialogLocation() { Widget widget = configureActionItem.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; } 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(OpenCaptureFileAction.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 IWifiSniffingDaemon wifiDaemon = Activator.getDefault().getWifiDaemon(); if(wifiDaemon == null) { failAll("No Wireless Service found."); return; } final Collection<IWirelessCaptureInterface> wifiInterfaces = wifiDaemon.getWirelessInterfaces(); if(wifiInterfaces == null) { failAll("No Wireless service found on remote probe"); return; } if(wifiInterfaces.isEmpty()) { failLive("No 'monitor-mode' capable wireless devices found"); if(wifiDaemon.isRunning()) { wifiDaemon.stop(); } return; } if(!hasEnabledInterface(wifiInterfaces)) { failLive("None of the interfaces are available"); if(wifiDaemon.isRunning()) wifiDaemon.stop(); return; } if(wifiDaemon.isRunning()) { disableConfigAndCapture(); startAction.setEnabled(false); } else { stopAction.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); startAction.setEnabled(false); stopAction.setEnabled(false); } private boolean hasEnabledInterface(Collection<IWirelessCaptureInterface> 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() { stopAction.setEnabled(false); startAction.setEnabled(false); configureAction.setEnabled(false); captureAction.setEnabled(false); } private void enableAll() { stopAction.setEnabled(true); startAction.setEnabled(true); configureAction.setEnabled(true); captureAction.setEnabled(true); } }