/* * Copyright (c) 2014, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.github.sdbg.debug.ui.internal.chrome; import com.github.sdbg.debug.core.model.ISDBGDebugTarget; import java.io.IOException; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchListener; import org.eclipse.swt.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.events.ShellListener; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; /** * A class to help manage the devtools disconnect / re-connect process. */ public class DevToolsDisconnectManager { final ISDBGDebugTarget target; private Display display; private Shell shell; private ShellListener shellListener; private ILaunchListener launchListener; public DevToolsDisconnectManager(ISDBGDebugTarget target) { this.target = target; this.display = Display.getDefault(); shellListener = new ShellAdapter() { @Override public void shellActivated(ShellEvent e) { handleShellActivated(); } }; launchListener = new ILaunchListener() { @Override public void launchAdded(ILaunch launch) { handleLaunchAdded(launch); } @Override public void launchChanged(ILaunch launch) { } @Override public void launchRemoved(ILaunch launch) { handleLaunchRemoved(launch); } }; Display.getDefault().asyncExec(new Runnable() { @Override public void run() { shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); shell.addShellListener(shellListener); }; }); DebugPlugin.getDefault().getLaunchManager().addLaunchListener(launchListener); printToConsole("<devtools opened - debugger connection paused>"); } void dispose() { if (!display.isDisposed() && launchListener != null) { DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(launchListener); launchListener = null; Display.getDefault().asyncExec(new Runnable() { @Override public void run() { shell.removeShellListener(shellListener); shellListener = null; } }); } } private void handleLaunchAdded(ILaunch launch) { if (isSDBGLaunch(launch)) { dispose(); } } private void handleLaunchRemoved(ILaunch launch) { if (launch == target.getLaunch()) { dispose(); } } private void handleShellActivated() { if (display.isDisposed()) { return; } if (target.getProcess().isTerminated()) { dispose(); return; } try { target.reconnect(); printToConsole("<debugger connection resumed>"); dispose(); } catch (IOException e) { // Ignore this exception - devtools is still active. } } private boolean isSDBGLaunch(ILaunch launch) { try { return launch.getLaunchConfiguration().getType().getIdentifier().startsWith( "com.github.sdbg."); } catch (CoreException e) { return false; } } private void printToConsole(String message) { target.writeToStdout(message); } }