http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/PlayerSessionIsolateStatus.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/PlayerSessionIsolateStatus.java b/debugger/src/main/java/flash/tools/debugger/concrete/PlayerSessionIsolateStatus.java new file mode 100644 index 0000000..96700cb --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/concrete/PlayerSessionIsolateStatus.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.concrete; + +public class PlayerSessionIsolateStatus { + + /** + * Corresponding to playersession::m_isHalted, but for isolate. + */ + public boolean m_isHalted; +}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/PlayerSessionManager.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/PlayerSessionManager.java b/debugger/src/main/java/flash/tools/debugger/concrete/PlayerSessionManager.java new file mode 100644 index 0000000..8f8f755 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/concrete/PlayerSessionManager.java @@ -0,0 +1,1211 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.concrete; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.BindException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import flash.localization.LocalizationManager; +import flash.tools.debugger.AIRLaunchInfo; +import flash.tools.debugger.DebuggerLocalizer; +import flash.tools.debugger.DefaultDebuggerCallbacks; +import flash.tools.debugger.IDebuggerCallbacks; +import flash.tools.debugger.ILaunchNotification; +import flash.tools.debugger.ILauncher; +import flash.tools.debugger.IProgress; +import flash.tools.debugger.Player; +import flash.tools.debugger.Session; +import flash.tools.debugger.SessionManager2; +import flash.tools.debugger.VersionException; +import flash.util.URLHelper; + +public class PlayerSessionManager implements SessionManager2 +{ + private ServerSocket m_serverSocket; + private HashMap<String, Object> m_prefs; + private IDebuggerCallbacks m_debuggerCallbacks; + private static LocalizationManager m_localizationManager; + private Socket m_connectSocket; + private boolean m_cancelConnect; + + static + { + // set up for localizing messages + m_localizationManager = new LocalizationManager(); + m_localizationManager.addLocalizer( new DebuggerLocalizer("flash.tools.debugger.concrete.djapi.") ); //$NON-NLS-1$ + } + + public PlayerSessionManager() + { + m_debuggerCallbacks = new DefaultDebuggerCallbacks(); + + m_serverSocket = null; + m_connectSocket = null; + m_cancelConnect = false; + m_prefs = new HashMap<String, Object>(); + + // manager + setPreference(PREF_ACCEPT_TIMEOUT, 120000); // 2 minutes + setPreference(PREF_URI_MODIFICATION, 1); + setPreference(PREF_CONNECT_TIMEOUT, 120000); // 2 minutes + setPreference(PREF_CONNECT_WAIT_INTERVAL, 250); // 0.25 seconds + setPreference(PREF_CONNECT_RETRY_ATTEMPTS, -1); // Retry till timeout + + // session + + // response to requests + setPreference(PREF_SOCKET_TIMEOUT, -1); // no timeout by default + setPreference(PREF_RESPONSE_TIMEOUT, 750); // 0.75s + setPreference(PREF_CONTEXT_RESPONSE_TIMEOUT, 1000); // 1s + setPreference(PREF_GETVAR_RESPONSE_TIMEOUT, 1500); // 1.5s + setPreference(PREF_SETVAR_RESPONSE_TIMEOUT, 5000); // 5s + setPreference(PREF_SWFSWD_LOAD_TIMEOUT, 5000); // 5s + + // wait for a suspend to occur after a halt + setPreference(PREF_SUSPEND_WAIT, 7000); + + // invoke getters by default + setPreference(PREF_INVOKE_GETTERS, 1); + + // hierarchical variables view + setPreference(PREF_HIERARCHICAL_VARIABLES, 0); + } + + /** + * Set preference + * If an invalid preference is passed, it will be silently ignored. + */ + public void setPreference(String pref, int value) { m_prefs.put(pref, new Integer(value)); } + public void setPreference(String pref, String value){ m_prefs.put(pref, value); } + public Set<String> keySet() { return m_prefs.keySet(); } + public Object getPreferenceAsObject(String pref) { return m_prefs.get(pref); } + + /* + * @see flash.tools.debugger.SessionManager#getPreference(java.lang.String) + */ + public int getPreference(String pref) + { + int val = 0; + Integer i = (Integer)m_prefs.get(pref); + if (i == null) + throw new NullPointerException(); + val = i.intValue(); + return val; + } + + /* + * @see flash.tools.debugger.SessionManager#startListening() + */ + public void startListening() throws IOException + { + if (m_serverSocket == null) + m_serverSocket = new ServerSocket(DProtocol.DEBUG_PORT); + } + + /* + * @see flash.tools.debugger.SessionManager#stopListening() + */ + public void stopListening() throws IOException + { + if (m_serverSocket != null) + { + m_serverSocket.close(); + m_serverSocket = null; + } + } + + /* + * @see flash.tools.debugger.SessionManager#isListening() + */ + public boolean isListening() + { + return (m_serverSocket == null) ? false : true; + } + + private class LaunchInfo + { + private String m_uri; + + public LaunchInfo(String uri) + { + m_uri = uri; + } + + public boolean isAbout() + { + return m_uri.startsWith("about:"); //$NON-NLS-1$ + } + + public boolean isHttpOrAbout() + { + return m_uri.startsWith("http:") || m_uri.startsWith("https:") || isAbout(); //$NON-NLS-1$ //$NON-NLS-2$ + } + + public boolean isWebPage() + { + return isHttpOrAbout() || m_uri.endsWith(".htm") || m_uri.endsWith(".html"); //$NON-NLS-1$ //$NON-NLS-2$ + } + + public boolean isWebBrowserNativeLaunch() + { + return isWebPage() && (m_debuggerCallbacks.getHttpExe() != null); + } + + public boolean isPlayerNativeLaunch() + { + return m_uri.length() > 0 && !isWebPage() && (m_debuggerCallbacks.getPlayerExe() != null); + } + + public boolean isAIRLaunch() + { + return m_uri.startsWith("file:") && (m_uri.endsWith("-app.xml") || m_uri.endsWith("application.xml")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + } + + private enum OS { + Mac, + Windows, + Unix + } + + private OS getOS() + { + String osName = System.getProperty("os.name").toLowerCase(); //$NON-NLS-1$ + if (osName.startsWith("mac os x")) //$NON-NLS-1$ + { + return OS.Mac; + } + else if (osName.startsWith("windows")) //$NON-NLS-1$ + { + return OS.Windows; + } + else + { + return OS.Unix; + } + } + + /* + * @see flash.tools.debugger.SessionManager#launch(java.lang.String, flash.tools.debugger.AIRLaunchInfo, boolean, flash.tools.debugger.IProgress) + */ + public Session launch(String uri, AIRLaunchInfo airLaunchInfo, boolean forDebugging, IProgress waitReporter, ILaunchNotification launchNotification) throws IOException + { + String[] launchCommand = getLaunchCommand(uri, airLaunchInfo,forDebugging); + + // create the process and attach a thread to watch it during our accept phase + Process proc = m_debuggerCallbacks.launchDebugTarget(launchCommand); + + ProcessListener processListener = startProcessListener(airLaunchInfo,forDebugging, launchNotification, launchCommand, proc,false); + PlayerSession session = null; + + if (forDebugging) + { + session = waitForConnection(uri, airLaunchInfo, waitReporter, proc, processListener); + } + + return session; + } + + private PlayerSession waitForConnection(String uri, + AIRLaunchInfo airLaunchInfo, IProgress waitReporter, Process proc, + ProcessListener pl) throws IOException { + /* now wait for a connection */ + PlayerSession session = (PlayerSession)accept(pl, waitReporter); + session.setProcess(proc); + session.setLaunchUrl(uri); + session.setAIRLaunchInfo(airLaunchInfo); + return session; + } + + /** + * Tweaks the launch URI if necessary, e.g. may append "?debug=true" + */ + private String tweakNativeLaunchUri(String uri, boolean forDebugging, + LaunchInfo launchInfo) throws IOException, FileNotFoundException + { + // first let's see if it's an HTTP URL or not + if (launchInfo.isHttpOrAbout()) + { + boolean modify = (getPreference(PREF_URI_MODIFICATION) != 0); + + if (modify && forDebugging && !launchInfo.isAbout()) + { + // escape spaces if we have any + uri = URLHelper.escapeSpace(uri); + + // be sure that ?debug=true is included in query string + URLHelper urlHelper = new URLHelper(uri); + Map<String, String> params = urlHelper.getParameterMap(); + params.put("debug", "true"); //$NON-NLS-1$ //$NON-NLS-2$ + urlHelper.setParameterMap(params); + + uri = urlHelper.getURL(); + } + } + else + { + // ok, its not an http: type request therefore we should be able to see + // it on the file system, right? If not then it's probably not valid + File f = null; + if (uri.startsWith("file:")) //$NON-NLS-1$ + { + try + { + f = new File(new URI(uri)); + } + catch (URISyntaxException e) + { + IOException ioe = new IOException(e.getMessage()); + ioe.initCause(e); + throw ioe; + } + } + else + { + f = new File(uri); + } + + if (f != null && f.exists()) { + // Do not use getCanonicalPath() -- see FB-24595 + uri = f.getAbsolutePath(); + } else { + throw new FileNotFoundException(uri); + } + } + + return uri; + } + + /** + * Gets the arguments needed for launching a swf that needs to run + * in a web browser or the standalone player. + */ + private String[] getFlashLaunchArgs(String uri, LaunchInfo launchInfo) throws FileNotFoundException + { + String[] launchCommand; + + OS os = getOS(); + + /** + * Various ways to launch this stupid thing. If we have the exe + * values for the player, then we can launch it directly, monitor + * it and kill it when we die; otherwise we launch it through + * a command shell (cmd.exe, open, or bash) and our Process object + * dies right away since it spawned another process to run the + * Player within. + */ + if (os == OS.Mac) + { + if (launchInfo.isWebBrowserNativeLaunch()) + { + File httpExe = m_debuggerCallbacks.getHttpExe(); + String[] customParams = m_debuggerCallbacks.getBrowserParameters(uri); + if (customParams == null) { + launchCommand = new String[] { "/usr/bin/open", "-a", httpExe.toString(), uri }; //$NON-NLS-1$ //$NON-NLS-2$ + } + else { + final int prependLen = 4; + launchCommand = new String[customParams.length + prependLen ]; + launchCommand[0] = "/usr/bin/open"; //$NON-NLS-1$ + launchCommand[1] = "-a"; //$NON-NLS-1$ + launchCommand[2] = httpExe.toString(); + launchCommand[3] = "--args"; //$NON-NLS-1$ + for ( int i = 0; i < customParams.length; i++) { + launchCommand[i + prependLen] = customParams[i]; + } + } + } + else if (launchInfo.isPlayerNativeLaunch()) + { + File playerExe = m_debuggerCallbacks.getPlayerExe(); + launchCommand = new String[] { "/usr/bin/open", "-a", playerExe.toString(), uri }; //$NON-NLS-1$ //$NON-NLS-2$ + } + else + { + launchCommand = new String[] { "/usr/bin/open", uri }; //$NON-NLS-1$ + } + } + else // Windows or *nix + { + if (launchInfo.isWebBrowserNativeLaunch()) + { + File httpExe = m_debuggerCallbacks.getHttpExe(); + String[] customParams = m_debuggerCallbacks.getBrowserParameters(uri); + if (customParams == null) { + if (os == OS.Windows) + launchCommand = getWindowsBrowserLaunchArgs(httpExe, uri); + else + launchCommand = new String[] { httpExe.toString(), uri }; + } + else { + final int prependLen = 1; + launchCommand = new String[customParams.length + prependLen]; + launchCommand[0] = httpExe.toString(); + for ( int i = 0; i < customParams.length; i++) { + launchCommand[i + prependLen] = customParams[i]; + } + } + } + else if (launchInfo.isPlayerNativeLaunch()) + { + File playerExe = m_debuggerCallbacks.getPlayerExe(); + launchCommand = new String[] { playerExe.toString(), uri }; + } + else + { + if (os == OS.Windows) + { + // We must quote all ampersands in the URL; if we don't, then + // cmd.exe will interpret the ampersand as a command separator. + uri = uri.replaceAll("&", "\"&\""); //$NON-NLS-1$ //$NON-NLS-2$ + + launchCommand = new String[] { "cmd", "/c", "start", uri }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + else + { + String exeName; + if (launchInfo.isWebPage()) + exeName = m_debuggerCallbacks.getHttpExeName(); + else + exeName = m_debuggerCallbacks.getPlayerExeName(); + throw new FileNotFoundException(exeName); + } + } + } + return launchCommand; + } + + + + /** + * Gets the arguments needed for launching a web browser on Windows. + */ + private String[] getWindowsBrowserLaunchArgs(File httpExe, String uri) + { + if (httpExe.getName().equalsIgnoreCase("chrome.exe")) //$NON-NLS-1$ + { + // FB-16779: Adding "--disable-hang-monitor" to prevent Chrome + // from warning us that a plug-inappears to be hung; it does + // that when the user hits a breakpoint. + return new String[] { httpExe.toString(), "--disable-hang-monitor", uri }; //$NON-NLS-1$ + } + else if (httpExe.getName().equalsIgnoreCase("iexplore.exe")) //$NON-NLS-1$ + { + boolean isIE8 = false; + + try + { + int[] ieVersion = m_debuggerCallbacks.getAppVersion(httpExe); + if (ieVersion != null) + isIE8 = (ieVersion[0] >= 8); + } catch (IOException e) { + // ignore + } + + if (isIE8) + { + // FB-22107: Tell IE to keep using the new process we are + // launching, rather than merging the new process into the + // old one. This allows us to terminate the new IE + // debugging session. + return new String[] { httpExe.toString(), "-noframemerging", uri }; //$NON-NLS-1$ + } + } + + return new String[] { httpExe.toString(), uri }; + } + + /** + * Gets the arguments needed for launching a swf that needs to run + * in AIR. + */ + private String[] getAIRLaunchArgs(String uri, AIRLaunchInfo airLaunchInfo) + throws IOException + { + List<String> cmdList = new LinkedList<String>(); + + cmdList.add(airLaunchInfo.airDebugLauncher.getPath()); + + if (airLaunchInfo.airRuntimeDir != null) + { + cmdList.add("-runtime"); //$NON-NLS-1$ + cmdList.add(airLaunchInfo.airRuntimeDir.getPath()); + } + + if (airLaunchInfo.airSecurityPolicy != null) + { + cmdList.add("-security-policy"); //$NON-NLS-1$ + cmdList.add(airLaunchInfo.airSecurityPolicy.getPath()); + } + + if (airLaunchInfo.airPublisherID != null && airLaunchInfo.airPublisherID.length() > 0) + { + cmdList.add("-pubid"); //$NON-NLS-1$ + cmdList.add(airLaunchInfo.airPublisherID); + } + + if (airLaunchInfo.profile != null && airLaunchInfo.profile.length() > 0) + { + cmdList.add("-profile"); //$NON-NLS-1$ + cmdList.add(airLaunchInfo.profile); + } + + if (airLaunchInfo.screenSize != null && airLaunchInfo.screenSize.length() > 0) + { + cmdList.add("-screensize"); //$NON-NLS-1$ + cmdList.add(airLaunchInfo.screenSize); + } + + if (airLaunchInfo.dpi > 0) + { + //TODO: this is apparently only going to be used in AIR 2.5. + //Figure out permanent solution when AIR 3.0 comes along. + cmdList.add("-XscreenDPI"); //$NON-NLS-1$ + cmdList.add(String.valueOf(airLaunchInfo.dpi)); + } + + if (airLaunchInfo.versionPlatform != null && airLaunchInfo.versionPlatform.length() > 0) + { + cmdList.add("-XversionPlatform"); //$NON-NLS-1$ + cmdList.add(airLaunchInfo.versionPlatform); + } + + if (airLaunchInfo.extDir != null && airLaunchInfo.extDir.length() > 0) { + cmdList.add("-extdir"); //$NON-NLS-1$ + cmdList.add(airLaunchInfo.extDir); + } + + if (airLaunchInfo.deviceExtDir != null && airLaunchInfo.deviceExtDir.length() > 0) { + cmdList.add("-XdeviceExtDir"); //$NON-NLS-1$ + cmdList.add(airLaunchInfo.deviceExtDir); + } + + // If it's a "file:" URL, then pass the actual filename; otherwise, use the URL + // ok, its not an http: type request therefore we should be able to see + // it on the file system, right? If not then it's probably not valid + File f = null; + if (uri.startsWith("file:")) //$NON-NLS-1$ + { + try + { + f = new File(new URI(uri)); + cmdList.add(f.getPath()); + } + catch (URISyntaxException e) + { + IOException ioe = new IOException(e.getMessage()); + ioe.initCause(e); + throw ioe; + } + } + else + { + cmdList.add(uri); + } + + if (airLaunchInfo.applicationContentRootDir != null) + { + cmdList.add(airLaunchInfo.applicationContentRootDir.getAbsolutePath()); + } + + List<String> args = null; + if (airLaunchInfo.applicationArgumentsArray != null) + { + args = Arrays.asList(airLaunchInfo.applicationArgumentsArray); + } + else if (airLaunchInfo.applicationArguments != null) + { + args = splitArgs(airLaunchInfo.applicationArguments); + } + + if (args != null && args.size() > 0) + { + cmdList.add("--"); //$NON-NLS-1$ + cmdList.addAll(args); + } + + return cmdList.toArray(new String[cmdList.size()]); + } + + /** + * This is annoying: We must duplicate the operating system's behavior + * with regard to splitting arguments. + * + * @param arguments A single string of arguments that are intended to + * be passed to an AIR application. The tricky part is that some + * of the arguments may be quoted, and if they are, then the quoting + * will be in a way that is specific to the current platform. For + * example, on Windows, strings are quoted with the double-quote character + * ("); on Mac and Unix, strings can be quoted with either double-quote + * or single-quote. + * @return The equivalent + */ + private List<String> splitArgs(String arguments) + { + List<String> retval = new ArrayList<String>(); + + arguments = arguments.trim(); + + // Windows quotes only with double-quote; Mac and Unix also allow single-quote. + boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("win"); //$NON-NLS-1$ //$NON-NLS-2$ + boolean isMacOrUnix = !isWindows; + + int i=0; + while (i<arguments.length()) { + char ch = arguments.charAt(i); + if (ch == ' ' || ch == '\t') { + // keep looping + i++; + } else if (ch == '"' || (isMacOrUnix && ch == '\'')) { + char quote = ch; + int nextQuote = arguments.indexOf(quote, i+1); + if (nextQuote == -1) { + retval.add(arguments.substring(i+1)); + return retval; + } else { + retval.add(arguments.substring(i+1, nextQuote)); + i = nextQuote+1; + } + } else { + int startPos = i; + while (i<arguments.length()) { + ch = arguments.charAt(i); + if (ch == ' ' || ch == '\t') { + break; + } + i++; + } + retval.add(arguments.substring(startPos, i)); + } + } + + return retval; + } + + /* + * @see flash.tools.debugger.SessionManager#playerForUri(java.lang.String, flash.tools.debugger.AIRLaunchInfo) + */ + public Player playerForUri(String url, AIRLaunchInfo airLaunchInfo) + { + LaunchInfo launchInfo = new LaunchInfo(url); + + if (airLaunchInfo != null) + { + return new AIRPlayer(airLaunchInfo.airDebugLauncher); + } + else if (launchInfo.isAIRLaunch()) + { + return new AIRPlayer(null); + } + else + { + // Find the Netscape plugin + if (getOS() == OS.Mac) + { + if (!launchInfo.isWebBrowserNativeLaunch()) + { + File playerExe = m_debuggerCallbacks.getPlayerExe(); + return new StandalonePlayer(playerExe); + } + File flashPlugin = new File("/Library/Internet Plug-Ins/Flash Player.plugin"); //$NON-NLS-1$ + return new NetscapePluginPlayer(m_debuggerCallbacks.getHttpExe(), flashPlugin); + } + else + { + if (launchInfo.isWebBrowserNativeLaunch()) + { + File httpExe = m_debuggerCallbacks.getHttpExe(); + if (httpExe.getName().equalsIgnoreCase("iexplore.exe")) //$NON-NLS-1$ + { + // IE on Windows: Find the ActiveX control + String activeXFile = null; + final String registryKey = "HKEY_CLASSES_ROOT\\CLSID\\{D27CDB6E-AE6D-11cf-96B8-444553540000}\\InprocServer32"; //$NON-NLS-1$ + //check if this is a 64-bit machine + boolean is64Bit = (System.getenv("ProgramFiles(x86)") != null); //$NON-NLS-1$ + try + { + if (is64Bit) { + //now we have to ensure that we only query the registry + //that is 32 or 64-bit depending upon whether we are + //launching 32 or 64-bit IE. + if (httpExe.getCanonicalPath().contains("(x86)")) { //$NON-NLS-1$ + activeXFile = m_debuggerCallbacks.queryWindowsRegistry(registryKey, null, 1); + } + else { + activeXFile = m_debuggerCallbacks.queryWindowsRegistry(registryKey, null, 2); + } + } + else { + activeXFile = m_debuggerCallbacks.queryWindowsRegistry(registryKey, null, 1); + } + + } + catch (IOException e) + { + // ignore + } + if (activeXFile == null) + return null; // we couldn't find the player + File file = new File(activeXFile); + return new ActiveXPlayer(httpExe, file); + } + else + { + // Find the Netscape plugin + File browserDir = httpExe.getParentFile(); + + // Opera puts plugins under "program\plugins" rather than under "plugins" + if (httpExe.getName().equalsIgnoreCase("opera.exe")) //$NON-NLS-1$ + browserDir = new File(browserDir, "program"); //$NON-NLS-1$ + + File pluginsDir = new File(browserDir, "plugins"); //$NON-NLS-1$ + File flashPlugin = new File(pluginsDir, "NPSWF32.dll"); // WARNING, Windows-specific //$NON-NLS-1$ + + // Bug FB-4691: The player is now installed via a registry key, not + // in the "plugins" directory. + // + // Although Mozilla does not document this, the actual behavior of + // the browser seems to be that it looks first in the "plugins" directory, + // and then, if the file is not found there, it looks in the registry. + // So, we mimic that behavior. + if (!flashPlugin.exists()) + { + File pathFromRegistry = getWindowsMozillaPlayerPathFromRegistry(); + + if (pathFromRegistry != null) + flashPlugin = pathFromRegistry; + } + + return new NetscapePluginPlayer(httpExe, flashPlugin); + } + } + else if (launchInfo.isPlayerNativeLaunch()) + { + File playerExe = m_debuggerCallbacks.getPlayerExe(); + return new StandalonePlayer(playerExe); + } + } + } + + return null; + } + + /** + * Look in the Windows registry for the Mozilla version of the Flash player. + */ + private File getWindowsMozillaPlayerPathFromRegistry() + { + final String KEY = "\\SOFTWARE\\MozillaPlugins\\@adobe.com/FlashPlayer"; //$NON-NLS-1$ + final String PATH = "Path"; //$NON-NLS-1$ + + // According to + // + // http://developer.mozilla.org/en/docs/Plugins:_The_first_install_problem + // + // the MozillaPlugins key can be written to either HKEY_CURRENT_USER or + // HKEY_LOCAL_MACHINE. Unfortunately, as of this writing, Firefox + // (version 2.0.0.2) doesn't actually work that way -- it only checks + // HKEY_LOCAL_MACHINE, but not HKEY_CURRENT_USER. + // + // But in hopeful anticipation of a fix for that, we are going to check both + // locations. On current builds, that won't do any harm, because the + // current Flash Player installer only writes to HKEY_LOCAL_MACHINE. In the + // future, if Mozilla gets fixed and then the Flash player installer gets + // updated, then our code will already work correctly. + // + // Another quirk: In my opinion, it would be better for Mozilla to look first + // in HKEY_CURRENT_USER, and then in HKEY_LOCAL_MACHINE. However, according to + // + // http://developer.mozilla.org/en/docs/Installing_plugins_to_Gecko_embedding_browsers_on_Windows + // + // they don't agree with that -- they want HKEY_LOCAL_MACHINE first. + String[] roots = { "HKEY_LOCAL_MACHINE", "HKEY_CURRENT_USER" }; //$NON-NLS-1$ //$NON-NLS-2$ + for (int i=0; i<roots.length; ++i) + { + try + { + String path = m_debuggerCallbacks.queryWindowsRegistry(roots[i] + KEY, PATH, 1); + if (path != null) + return new File(path); + } + catch (IOException e) + { + // ignore + } + } + + return null; + } + + /* + * @see flash.tools.debugger.SessionManager#supportsLaunch() + */ + public boolean supportsLaunch() + { + return true; + } + + /* + * @see flash.tools.debugger.SessionManager#accept(flash.tools.debugger.IProgress) + */ + public Session accept(IProgress waitReporter) throws IOException + { + return accept(null, waitReporter); + } + + /** + * A private variation on <code>accept()</code> that also has an argument + * indicating that the process we are waiting for has terminated. + * + * @param pl + * Optional process listener. If non-null, this is used to detect + * if a process that was launched has terminated unexpectedly. + * For example, if launch() launches adl, but adl exits, then we + * don't want to continue to wait for a socket connection. + */ + private Session accept(ProcessListener pl, IProgress waitReporter) throws IOException + { + // get timeout + int timeout = getPreference(PREF_ACCEPT_TIMEOUT); + int totalTimeout = timeout; + int iterateOn = 100; + + PlayerSession session = null; + try + { + m_serverSocket.setSoTimeout(iterateOn); + + // Wait 100ms per iteration. We have to do that so that we can report how long + // we have been waiting. + Socket s = null; + while (s == null && !airAppTerminated(pl)) + { + try + { + s = m_serverSocket.accept(); + } + catch(IOException ste) + { + timeout -= iterateOn; + if (timeout < 0 || m_serverSocket == null || m_serverSocket.isClosed()) + throw ste; // we reached the timeout, or someome called stopListening() + } + + // Tell the progress monitor we've waited a little while longer, + // so that the Eclipse progress bar can keep chugging along + if (waitReporter != null) + waitReporter.setProgress(totalTimeout - timeout, totalTimeout); + } + + if (s == null && airAppTerminated(pl)) + { + throw pl.createLaunchFailureException(); + } + + /* create a new session around this socket */ + session = PlayerSession.createFromSocketWithOptions(s, m_debuggerCallbacks, this); + + // transfer preferences + session.setPreferences(m_prefs); + } + catch(NullPointerException npe) + { + throw new BindException(getLocalizationManager().getLocalizedTextString("serverSocketNotListening")); //$NON-NLS-1$ + } + + return session; + } + + /** + * Returns true if the passed-in process listener is for an AIR application + * that has terminated. This is used by accept() in order to detect that it + * should give up listening on the socket. + * + * The reason we can't do this for Flash player-based apps is that unlike + * AIR apps, the process that we launched sometimes acts as just sort of a + * "launcher" process that terminates quickly, and the actual Flash player + * is in some other process. For example, on Mac, we often invoke the "open" + * program to open a web browser; and on Windows, if you launch firefox.exe + * but it detects that there is already a running instance of firefox.exe, + * the new instance will just pass a message to the old instance, and then + * the new instance will terminate. + * + * @param pl + * a process listener, or <code>null</code> + * @return true if pl refers to an AIR app that has terminated. + */ + private boolean airAppTerminated(ProcessListener pl) + { + if (pl != null) + { + if (pl.isAIRApp()) + { + if (pl.isProcessDead()) + { + return true; + } + } + } + + return false; + } + + /* + * @see flash.tools.debugger.SessionManager#getDebuggerCallbacks() + */ + public IDebuggerCallbacks getDebuggerCallbacks() + { + return m_debuggerCallbacks; + } + + /* + * @see flash.tools.debugger.SessionManager#setDebuggerCallbacks(flash.tools.debugger.IDebuggerCallbacks) + */ + public void setDebuggerCallbacks(IDebuggerCallbacks debuggerCallbacks) + { + m_debuggerCallbacks = debuggerCallbacks; + } + + /** + * A private variation on <code>connect()</code> that also has an argument + * indicating that the process we are waiting for has terminated. + * + * @param pl + * Optional process listener. If non-null, this is used to detect + * if a process that was launched has terminated unexpectedly. + * For example, if launch() launches adl, but adl exits, then we + * don't want to continue to wait for a socket connection. + */ + public Session connect(int port, IProgress waitReporter) throws IOException + { + final int waitTime = getPreference(PREF_CONNECT_WAIT_INTERVAL); + final int maxRetryAttempts = getPreference(PREF_CONNECT_RETRY_ATTEMPTS); + final int totalTimeout = getPreference(PREF_CONNECT_TIMEOUT); + final long timeForConnectStart = System.currentTimeMillis(); + + long elapsedTime = 0; + int retryAttempts = -1; + PlayerSession session = null; + Socket s = null; + + m_cancelConnect = false; + + // Try to see if a connect happens till totalTimeout + // If the connection was refused in between, retry + // again after waitTime until totalTimeout is elapsed. + // Retry mechanism is disabled if PREF_CONNECT_RETRY_ATTEMPTS + // is 0. + while (s == null) + { + try + { + InetSocketAddress localAddress = new InetSocketAddress(InetAddress.getByName(null), port); + s = new Socket(); + //save the socket for canceling connect + m_connectSocket = s; + //connect to loopback address at the specified port + s.connect(localAddress, totalTimeout); + } + catch(IOException ste) + { + if (ste instanceof SocketTimeoutException) { + //if we timed out, abort connect + abortConnect(ste); + } + + safeCloseSocket(s); + + s = null; + retryAttempts++; + + //if we should not retry, checkConnectTimeout + //throws an exception + elapsedTime = checkConnectTimeout(waitTime, maxRetryAttempts, + totalTimeout, retryAttempts, timeForConnectStart, ste); + } + + // Tell the progress monitor we've waited a little while longer, + // so that the Eclipse progress bar can keep chugging along + if (waitReporter != null) + waitReporter.setProgress((int)elapsedTime, totalTimeout); + + if (s != null) { + /** If we connected, make sure that we get some response + * back after sending the handshake. This is required because + * of the way port forwarding works. A connect will be successful + * if port forwarding is set up, but we won't get any response + * unless the application is actually listening. + */ + /* create a new session around this socket */ + session = PlayerSession.createFromSocketWithOptions(s, m_debuggerCallbacks, this); + // transfer preferences + session.setPreferences(m_prefs); + try { + session.bind(); + } + catch (VersionException ex) { + session.unbind(); + safeCloseSocket(s); + + s = null; + retryAttempts++; + + /** The VersionException here is considered as an IOException + * because we do not know if there was even a valid application + * listening on the port. Once the port is forwarded, connect + * succeeds and we get a VersionException even if player is not + * listening on that port. + */ + elapsedTime = checkConnectTimeout(waitTime, maxRetryAttempts, + totalTimeout, retryAttempts, timeForConnectStart, + new IOException(ex.getLocalizedMessage())); + } + } + } + m_connectSocket = null; + + return session; + } + + /** + * @param waitTime + * @param maxRetryAttempts + * @param totalTimeout + * @param retryAttempts + * @param startTime + * @param caughtException + * @return + * @throws IOException + */ + private long checkConnectTimeout(final int waitTime, + final int maxRetryAttempts, final int totalTimeout, + int retryAttempts, final long startTime, IOException caughtException) + throws IOException { + long elapsedTime; + long endTime = System.currentTimeMillis(); + elapsedTime = endTime - startTime; + + // check if we should retry + boolean retryFinished = (maxRetryAttempts != -1 && retryAttempts >= maxRetryAttempts); + + // check if we timed out or somebody called stopConnecting() + if (retryFinished || + elapsedTime > totalTimeout || + m_cancelConnect ) { + abortConnect(caughtException); + } + + //wait a bit before retrying + try { + Thread.sleep(waitTime); + } catch (InterruptedException e) { + abortConnect(caughtException); + } + + //check cancel before resuming + if (m_cancelConnect ) { + abortConnect(caughtException); + } + return elapsedTime; + } + + /** + * @param ste + * @throws IOException + */ + private void abortConnect(IOException ste) throws IOException { + m_connectSocket = null; + m_cancelConnect = false; + throw ste; + } + + /** + * @param s + */ + private void safeCloseSocket(Socket s) { + //clean up the socket + if (s != null && !s.isClosed()) { + try { + s.close(); + } + catch (IOException closeException) { + //ignore + } + } + } + + /* + * @see flash.tools.debugger.SessionManager#stopConnecting() + */ + public void stopConnecting() throws IOException + { + if (!m_cancelConnect) { + m_cancelConnect = true; + if (m_connectSocket != null) + { + m_connectSocket.close(); + m_connectSocket = null; + } + } + } + + /* + * @see flash.tools.debugger.SessionManager#isConnecting() + */ + public boolean isConnecting() + { + return (m_connectSocket == null) ? false : true; + } + + /** + * Returns the localization manager. Use this for all localized strings. + */ + public static LocalizationManager getLocalizationManager() + { + return m_localizationManager; + } + + @Override + public Process launchForRun(String uri, AIRLaunchInfo airLaunchInfo, + IProgress waitReporter, ILaunchNotification launchNotification) + throws IOException { + String[] launchCommand = getLaunchCommand(uri, airLaunchInfo, false); + + // create the process and attach a thread to watch it during our accept phase + Process proc = m_debuggerCallbacks.launchDebugTarget(launchCommand); + //forDebugging = false + // If launching an AIR app, and forDebugging=false (meaning we are just running it, + // not debugging it), start a background thread that will call the launchNotification + // when the launch is complete. + startProcessListener(airLaunchInfo, false,launchNotification, + launchCommand, proc,true); + + return proc; + } + + private ProcessListener startProcessListener(AIRLaunchInfo airLaunchInfo, boolean forDebugging, + ILaunchNotification launchNotification, String[] launchCommand, + Process proc, boolean isRunLaunch) { + + ProcessListener processListener = new ProcessListener(launchCommand, proc, launchNotification, forDebugging, airLaunchInfo != null); // BUG FB-9874: launchNotifier added + processListener.setIsRunLaunch(isRunLaunch); + + // If launching an AIR app, and forDebugging=false (meaning we are just running it, + // not debugging it), start a background thread that will call the launchNotification + // when the launch is complete. + if (!forDebugging && airLaunchInfo != null && launchNotification != null) + processListener.startLaunchNotifier(); + + return processListener; + } + + private String[] getLaunchCommand(String uri, AIRLaunchInfo airLaunchInfo, boolean forDebugging) + throws IOException, FileNotFoundException { + + String[] launchCommand; + + uri = uri.trim(); + + if (airLaunchInfo == null) + { + LaunchInfo launchInfo = new LaunchInfo(uri); + + uri = tweakNativeLaunchUri(uri, forDebugging, launchInfo); + + launchCommand = getFlashLaunchArgs(uri, launchInfo); + } + else // else, AIR + { + launchCommand = getAIRLaunchArgs(uri, airLaunchInfo); + } + return launchCommand; + } + + @Override + public Process launchForRun(String uri, AIRLaunchInfo airLaunchInfo, IProgress waitReporter, ILaunchNotification launchNotification, + ILauncher launcher) throws IOException { + + String[] launchCommand = getLaunchCommandForLauncher(uri, airLaunchInfo,false); + + // create the process and attach a thread to watch it during our accept phase + Process proc = m_debuggerCallbacks.launchDebugTarget(launchCommand,launcher); + //forDebugging = false + // If launching an AIR app, and forDebugging=false (meaning we are just running it, + // not debugging it), start a background thread that will call the launchNotification + // when the launch is complete. + startProcessListener(airLaunchInfo, false,launchNotification, + launchCommand, proc, true);; + + return proc; + } + + private String[] getLaunchCommandForLauncher(String uri, AIRLaunchInfo airLaunchInfo,boolean forDebugging) + throws IOException, FileNotFoundException { + String[] launchCommand; + if (airLaunchInfo == null) + { + LaunchInfo launchInfo = new LaunchInfo(uri); + + uri = tweakNativeLaunchUri(uri, forDebugging, launchInfo); + + launchCommand = new String[]{uri}; + } + else // else, AIR + { + launchCommand = getAIRLaunchArgs(uri, airLaunchInfo); + } + return launchCommand; + } + + @Override + public Session launch(String uri, AIRLaunchInfo airLaunchInfo, boolean forDebugging, IProgress waitReporter, + ILaunchNotification launchNotification, ILauncher launcher) throws IOException { + + String[] launchCommand = getLaunchCommandForLauncher(uri, airLaunchInfo,forDebugging); + + // create the process and attach a thread to watch it during our accept phase + Process proc = m_debuggerCallbacks.launchDebugTarget(launchCommand, launcher); + + ProcessListener processListener = startProcessListener(airLaunchInfo,forDebugging, launchNotification, launchCommand, proc,false); + PlayerSession session = null; + + if (forDebugging) + { + session = waitForConnection(uri, airLaunchInfo, waitReporter, proc, processListener); + session.setLauncher(launcher); + } + + return session; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/ProcessListener.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/ProcessListener.java b/debugger/src/main/java/flash/tools/debugger/concrete/ProcessListener.java new file mode 100644 index 0000000..5334aff --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/concrete/ProcessListener.java @@ -0,0 +1,206 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.concrete; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.StringWriter; + +import flash.tools.debugger.AlreadyActiveApplicationException; +import flash.tools.debugger.CommandLineException; +import flash.tools.debugger.ILaunchNotification; + +/** + * Listens to several things about a process: captures its stdout/stderr messages, + * detects when the process exits, and captures its exit code. + * <p> + * When a process exits, the ProcessListener can send out a notification. If + * you want that to happen, call startLaunchNotifier(). + */ +public class ProcessListener +{ + private Process m_process; + private ILaunchNotification m_launchNotification; + private boolean m_isDebugging; + private boolean m_isAIRapp; + private final String[] m_launchCommand; + private StringWriter m_processMessages; + + /** + * A background thread that will wait until the process terminates, and then + * call the launch listener. + */ + private Thread m_launchNotifierThread = new Thread("DJAPI ProcessListener") //$NON-NLS-1$ + { + @Override + public void run() + { + try + { + m_process.waitFor(); + + IOException e = null; + if (getProcessExitValue() != 0) + e = createLaunchFailureException(); + m_launchNotification.notify(e); + } + catch (InterruptedException e) + { + // this will happen if anyone calls Thread.interrupt() + } + } + }; + private boolean m_isRunLaunch; + + /** + * Starts listening to stdout and stderr of the launched process. The caller + * can later call getProcessMessages() to capture that output. + */ + public ProcessListener(String[] launchCommand, Process process, ILaunchNotification launchNotification, boolean forDebugging, boolean isAIRapp) + { + m_launchCommand = launchCommand; + m_process = process; + m_launchNotification = launchNotification; + m_isDebugging = forDebugging; + m_isAIRapp = isAIRapp; + m_processMessages = new StringWriter(); + startMessageListener(); + } + + private void startMessageListener() + { + new StreamListener(new InputStreamReader(m_process.getInputStream()), m_processMessages).start(); + new StreamListener(new InputStreamReader(m_process.getErrorStream()), m_processMessages).start(); + try + { + OutputStream stm = m_process.getOutputStream(); + if (stm != null) + stm.close(); + } + catch (IOException e) + { + /* not serious; ignore */ + } + } + + /** + * Creates a background thread that will call the launch notifier when the + * process terminates. + */ + public void startLaunchNotifier() + { + if (m_launchNotification == null) + throw new NullPointerException(); + + m_launchNotifierThread.setDaemon(true); + m_launchNotifierThread.start(); + } + + /** + * Returns the command args that were used to launch the process. + */ + public String[] getLaunchCommand() + { + return m_launchCommand; + } + + public boolean isAIRApp() + { + return m_isAIRapp; + } + + public boolean isProcessDead() + { + // If the process is still alive, then exitValue() will throw an exception: + try { + m_process.exitValue(); + return true; + } catch (IllegalThreadStateException e) { + return false; + } + } + + public int getProcessExitValue() throws IllegalThreadStateException + { + return m_process.exitValue(); + } + + /** + * Returns all messages that were sent to stdout and stderr by the process, + * combined into one string. + */ + public String getProcessMessages() + { + return m_processMessages.toString(); + } + + /** + * Creates an exception indicating that the process terminated with some sort + * of error. The returned exception may be an AlreadyActiveApplicationException + * or a CommandLineException. + */ + public IOException createLaunchFailureException() + { + IOException e = null; + String detailMessage; + + if (m_isDebugging) + { + detailMessage = PlayerSessionManager.getLocalizationManager().getLocalizedTextString( + "processTerminatedWithoutDebuggerConnection"); //$NON-NLS-1$ + } + else + { + detailMessage = PlayerSessionManager.getLocalizationManager().getLocalizedTextString( + "processTerminatedUnexpectedly"); //$NON-NLS-1$ + } + + // You can only call this function if the process has terminated + if (!isProcessDead()) + { + throw new IllegalThreadStateException(); + } + + /* + * When adding auto-terminate for run launch, we notice that on clicking the + * terminate button, the process exits with exitValue = 1 (due to unexpected + * termination). We just ignore this error message. + * Since we anyways now allow exitValue = 1(previously for app already running) + * for run launch, we shall skip displaying the message. + */ + + int exitValue = getProcessExitValue(); + + if (m_isAIRapp && exitValue == 1) //ADL Exit Code: Successful invocation of an already running AIR application. ADL exits immediately. + { + if(!m_isRunLaunch) { + e = new AlreadyActiveApplicationException(detailMessage, m_isDebugging); + } + } + else + { + e = new CommandLineException(detailMessage, getLaunchCommand(), getProcessMessages(), exitValue); + } + + return e; + } + + public void setIsRunLaunch(boolean forRunLaunching) { + m_isRunLaunch = forRunLaunching; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/ScriptText.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/ScriptText.java b/debugger/src/main/java/flash/tools/debugger/concrete/ScriptText.java new file mode 100644 index 0000000..a1cb4d2 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/concrete/ScriptText.java @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.concrete; + +/** + * Contains the text contents of a script and is able + * to map line numbers to specific regions of the script (i.e. string) + */ +public class ScriptText +{ + private final String m_text; + private int[] m_lineMap; // a 2-d array [2i] = startIndex and [2i+1] = endIndex for line i + + public ScriptText(String text) + { + m_text = text; + } + + /* return a string containing the line number requested */ + public String getLine(int lineNum) + { + determineLines(); + + int index = lineNum-1; + if (index < 0) + ; // throw + + /* look into our mapping array */ + int start = m_lineMap[2*index]; + int end = m_lineMap[(2*index)+1]; + + String s = m_text.substring(start, end); + return s; + } + + /* line count in module */ + public int getLineCount() + { + determineLines(); + return m_lineMap.length/2; + } + + /** + * Build mapping tables based on the line count of + * the given source string. + * + * These tables allow us to compute starting and + * ending locations of each line of the source file. + * + * The assumption using this technique is that most + * lines of the source files will never be accessed + * thus we only incur the overhead of 8 bytes + * (start & end) per line, plus the actual string + * contents each line a line is requested. + * + * Thus we need 8 * num_files * num_lines_per_file bytes + * for all these maps. + * + * For example, say each file is 1000 lines and we have + * 400 source files; We would consume 3.2MB. With + * each request we would allocate an additional 20+ + * bytes for the string (assuming a 20B avg line length). + * + * Allocating each line individually we would consume + * 1000 * 400 * 20 = 8MB. + * + * It is debatable whether this scheme is more efficient + * than actually builing an array of Strings to contain + * the lines, but gut feel says it is ;) + */ + private synchronized void determineLines() + { + // determineLines() is done on demand in order to avoid wasting time + // doing this for every file; so check if we've already done it + if (m_lineMap != null) + return; + + int count = lineCountFor(m_text) + 1; // add 1 to the line count to handle newline on last line + + // allocated our maps (really a 2-d array where [i] = startAt & [i+1] = endAt ) + m_lineMap = new int[(2*count)+1]; + + int i = 0; + int lineNum = 0; + int startAt = 0; + int endAt = 0; + int length = m_text.length(); + char c = '\0'; + while(i < length) + { + /* end of line */ + c = m_text.charAt(i++); + if (c == '\n' || c == '\r') + { + m_lineMap[2*lineNum] = startAt; + m_lineMap[(2*lineNum)+1] = endAt; + lineNum++; + + /* do we need to chew a CR LF combo */ + if (c == '\r' && i < length && m_text.charAt(i) == '\n') + i++; + + startAt = i; + endAt = i; + } + else + endAt++; + } + + /* need to add the last line? */ + if (startAt != endAt) + { + /* add the last line if not empty */ + m_lineMap[2*lineNum] = startAt; + m_lineMap[(2*lineNum)+1] = endAt; + } + } + + /** + * Count the number of lines within this string. + */ + public static int lineCountFor(String s) + { + int i = 0; + int lineNum = 0; + int length = s.length(); + char c = '\0'; + while(i < length) + { + /* end of line */ + c = s.charAt(i++); + if (c == '\n' || c == '\r') + { + lineNum++; + + /* do we need to chew a CR LF combo */ + if (c == '\r' && i < length && s.charAt(i) == '\n') + i++; + } + } + return lineNum; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/StandalonePlayer.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/StandalonePlayer.java b/debugger/src/main/java/flash/tools/debugger/concrete/StandalonePlayer.java new file mode 100644 index 0000000..aa5f423 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/concrete/StandalonePlayer.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.concrete; + +import java.io.File; + +/** + * @author mmorearty + */ +public class StandalonePlayer extends AbstractPlayer +{ + /** + * @param path + */ + public StandalonePlayer(File path) + { + super(null, path); + } + + /* + * @see flash.tools.debugger.Player#getType() + */ + public int getType() + { + return STANDALONE; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/StreamListener.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/StreamListener.java b/debugger/src/main/java/flash/tools/debugger/concrete/StreamListener.java new file mode 100644 index 0000000..bc21ea5 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/concrete/StreamListener.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.concrete; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; + +/** + * Reads a stream, and sends the contents somewhere. + * @author mmoreart + */ +public class StreamListener extends Thread { + Reader fIn; + Writer fOut; + + /** + * Creates a StreamListener which will copy everything from + * 'in' to 'out'. + * @param in the stream to read + * @param out the stream to write to, or 'null' to discard input + */ + public StreamListener(Reader in, Writer out) + { + super("DJAPI StreamListener"); //$NON-NLS-1$ + setDaemon(true); + fIn = in; + fOut = out; + } + + @Override + public void run() + { + char[] buf = new char[4096]; + int count; + + try { + for (;;) { + count = fIn.read(buf); + if (count == -1) + return; // thread is done + if (fOut != null) + { + try { + fOut.write(buf, 0, count); + } catch (IOException e) { + // the write failed (unlikely), but we still + // want to keep reading + } + } + } + } catch (IOException e) { + // do nothing -- we're done + } + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/BreakEvent.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/BreakEvent.java b/debugger/src/main/java/flash/tools/debugger/events/BreakEvent.java new file mode 100644 index 0000000..7a88fc0 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/BreakEvent.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +import flash.tools.debugger.Isolate; + +/** + * Break event is received when the player halts execution + */ +public class BreakEvent extends DebugEvent +{ + /** unique identifier for the source file where the Player has suspened. */ + public int fileId; + + /** line number in the source file where the Player has suspended. */ + public int line; + + public int isolateId; + + public BreakEvent(int fId, int l) + { + fileId = fId; + line = l; + isolateId = Isolate.DEFAULT_ID; + } + + public BreakEvent(int fId, int l, int isolate) + { + this(fId, l); + isolateId = isolate; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/ConsoleErrorFault.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/ConsoleErrorFault.java b/debugger/src/main/java/flash/tools/debugger/events/ConsoleErrorFault.java new file mode 100644 index 0000000..bc86d76 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/ConsoleErrorFault.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +/** + * Signals that an ActionScript error has caused a fault + */ +public class ConsoleErrorFault extends FaultEvent +{ + public final static String name = "console_error"; //$NON-NLS-1$ + + public ConsoleErrorFault(String s, int isolateId) { super(s, isolateId); } + + @Override + public String name() { return name; } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/DebugEvent.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/DebugEvent.java b/debugger/src/main/java/flash/tools/debugger/events/DebugEvent.java new file mode 100644 index 0000000..6374ca7 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/DebugEvent.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +/** + * The top of the event hierarchy for debug events. All debug events are of this type + */ +public abstract class DebugEvent +{ + public String information; + + public DebugEvent() { information = ""; } //$NON-NLS-1$ + public DebugEvent(String info) { information = info; } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/DivideByZeroFault.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/DivideByZeroFault.java b/debugger/src/main/java/flash/tools/debugger/events/DivideByZeroFault.java new file mode 100644 index 0000000..3b1830a --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/DivideByZeroFault.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +/** + * Signals that a divide by zero fault has occurred + */ +public class DivideByZeroFault extends FaultEvent +{ + public DivideByZeroFault(int isolateId) { + super(isolateId); + } + + public final static String name = "zero_divide"; //$NON-NLS-1$ + + @Override + public String name() { return name; } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/ExceptionFault.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/ExceptionFault.java b/debugger/src/main/java/flash/tools/debugger/events/ExceptionFault.java new file mode 100644 index 0000000..2ac3457 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/ExceptionFault.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +import flash.tools.debugger.Value; + +/** + * Signals that a user exception has been thrown. + */ +public class ExceptionFault extends FaultEvent +{ + public final static String name = "exception"; //$NON-NLS-1$ + private final boolean m_willExceptionBeCaught; + private final Value m_thrownValue; + + public ExceptionFault(String message, boolean willExceptionBeCaught, Value thrownValue, int isolateId) + { + super(message, isolateId); + m_willExceptionBeCaught = willExceptionBeCaught; + m_thrownValue = thrownValue; + } + + @Override + public String name() + { + return name; + } + + /** + * Returns true if there is a "catch" block that is going to catch + * this exception, false if not. + */ + public boolean willExceptionBeCaught() + { + return m_willExceptionBeCaught; + } + + /** + * The value that was thrown; may be null, because there are times when we + * cannot determine the value that was thrown. + */ + public Value getThrownValue() + { + return m_thrownValue; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/FaultEvent.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/FaultEvent.java b/debugger/src/main/java/flash/tools/debugger/events/FaultEvent.java new file mode 100644 index 0000000..0996618 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/FaultEvent.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +import flash.tools.debugger.Isolate; + +/** + * An event type that signals a problem situation within the Player. + * Under normal conditions the Player will suspend execution, resulting + * in a following BreakEvent to be fired. However, if this occurs + * while a getter or setter is executing, then the player will *not* + * suspend execution. + */ +public abstract class FaultEvent extends DebugEvent +{ + private String stackTrace = ""; //$NON-NLS-1$ + public int isolateId = Isolate.DEFAULT_ID; + + + public FaultEvent(String info, int isolateId) + { + super(getFirstLine(info)); + this.isolateId = isolateId; + int newline = info.indexOf('\n'); + if (newline != -1) + stackTrace = info.substring(newline+1); + } + +// public FaultEvent() +// { +// super(); +// } + + public FaultEvent(int isolateId) + { + super(); + this.isolateId = isolateId; + } + + public abstract String name(); + + private static String getFirstLine(String s) { + int newline = s.indexOf('\n'); + if (newline == -1) + return s; + else + return s.substring(0, newline); + } + + /** + * Returns the callstack in exactly the format that it came back + * from the player. That is, as a single string of the following + * form: + * + * <pre> + * at functionName()[filename:lineNumber] + * at functionName()[filename:lineNumber] + * ... + * </pre> + * + * Each line has a leading tab character. + * + * @return callstack, or an empty string; never <code>null</code> + */ + public String stackTrace() + { + return stackTrace; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/FileListModifiedEvent.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/FileListModifiedEvent.java b/debugger/src/main/java/flash/tools/debugger/events/FileListModifiedEvent.java new file mode 100644 index 0000000..a6d4eb2 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/FileListModifiedEvent.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +/** + * Notification that the file list has been + * modified since the last query was performed, + * that is, since the last call of Session.getFileList + * @deprecated As of Version 2. + * @see SwfLoadedEvent + */ +public class FileListModifiedEvent extends DebugEvent +{ +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/FunctionMetaDataAvailableEvent.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/FunctionMetaDataAvailableEvent.java b/debugger/src/main/java/flash/tools/debugger/events/FunctionMetaDataAvailableEvent.java new file mode 100644 index 0000000..d3dafab --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/FunctionMetaDataAvailableEvent.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +/** + * Notification that function information for + * all SoruceFiles is now available for access. + * + * Prior to this notification the following + * calls to SourceFile will return null or 0 values: + * + * public String getFunctionNameForLine(int lineNum); + * public int getLineForFunctionName(String name); + * public String[] getFunctionNames(); + * + * This is due to the fact the function data is processed + * by a background thread and may take many hundreds of + * milliseconds to complete. + * @deprecated As of Version 2. No replacement + */ +public class FunctionMetaDataAvailableEvent extends DebugEvent +{ +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/InvalidTargetFault.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/InvalidTargetFault.java b/debugger/src/main/java/flash/tools/debugger/events/InvalidTargetFault.java new file mode 100644 index 0000000..5159e22 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/InvalidTargetFault.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +/** + * Signals that a bad target name was provided while executing + * a ActionSetTarget instruction. + */ +public class InvalidTargetFault extends FaultEvent +{ + public final static String name = "invalid_target"; //$NON-NLS-1$ + + public InvalidTargetFault(String target, int isolateId) { super(target, isolateId); } + + @Override + public String name() { return name; } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/InvalidURLFault.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/InvalidURLFault.java b/debugger/src/main/java/flash/tools/debugger/events/InvalidURLFault.java new file mode 100644 index 0000000..56f09f1 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/InvalidURLFault.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +/** + * Signals that a request to open a URL failed. + */ +public class InvalidURLFault extends FaultEvent +{ + public final static String name = "invalid_url"; //$NON-NLS-1$ + + public InvalidURLFault(String url, int isolateId) { super(url, isolateId); } + + @Override + public String name() { return name; } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/InvalidWithFault.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/InvalidWithFault.java b/debugger/src/main/java/flash/tools/debugger/events/InvalidWithFault.java new file mode 100644 index 0000000..64474de --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/InvalidWithFault.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +/** + * Signals that a ActionWith instruction could not be executed becuase + * the target of the operation is not an object. + */ +public class InvalidWithFault extends FaultEvent +{ + public InvalidWithFault(int isolateId) { + super(isolateId); + } + + public final static String name = "invalid_with"; //$NON-NLS-1$ + + @Override + public String name() { return name; } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/IsolateCreateEvent.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/IsolateCreateEvent.java b/debugger/src/main/java/flash/tools/debugger/events/IsolateCreateEvent.java new file mode 100644 index 0000000..bd9e328 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/IsolateCreateEvent.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +import flash.tools.debugger.Isolate; + +/** + * IsolateCreateEvent is received when the player + * creates a worker. + * @author anirudhs + */ +public class IsolateCreateEvent extends DebugEvent { + + /* The isolate that was created */ + public Isolate isolate; + + public IsolateCreateEvent() { + isolate = null; + } + + public IsolateCreateEvent(Isolate t) { + isolate = t; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/IsolateExitEvent.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/IsolateExitEvent.java b/debugger/src/main/java/flash/tools/debugger/events/IsolateExitEvent.java new file mode 100644 index 0000000..dd910ff --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/IsolateExitEvent.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +import flash.tools.debugger.Isolate; + +/** + * IsolateExitEvent is received when the player stops + * a worker. + * @author anirudhs + */ +public class IsolateExitEvent extends DebugEvent { + + /* The isolate that exited */ + public Isolate isolate; + + public IsolateExitEvent() { + isolate = null; + } + + public IsolateExitEvent(Isolate t) { + isolate = t; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/ProtoLimitFault.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/ProtoLimitFault.java b/debugger/src/main/java/flash/tools/debugger/events/ProtoLimitFault.java new file mode 100644 index 0000000..4e26547 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/ProtoLimitFault.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +/** + * Signals that a search up a prototype chain has reached + * a depth limit. + */ +public class ProtoLimitFault extends FaultEvent +{ + public ProtoLimitFault(int isolateId) { + super(isolateId); + } + + public final static String name = "proto_limit"; //$NON-NLS-1$ + + @Override + public String name() { return name; } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/RecursionLimitFault.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/RecursionLimitFault.java b/debugger/src/main/java/flash/tools/debugger/events/RecursionLimitFault.java new file mode 100644 index 0000000..683e13d --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/RecursionLimitFault.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +/** + * Signals that a recursion limit has been reached + */ +public class RecursionLimitFault extends FaultEvent +{ + public RecursionLimitFault(int isolateId) { + super(isolateId); + } + + public final static String name = "recursion_limit"; //$NON-NLS-1$ + + @Override + public String name() { return name; } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/ScriptTimeoutFault.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/ScriptTimeoutFault.java b/debugger/src/main/java/flash/tools/debugger/events/ScriptTimeoutFault.java new file mode 100644 index 0000000..0ed2fb7 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/ScriptTimeoutFault.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +/** + * Signals that the player has spent far too long in a piece of ActionScript + */ +public class ScriptTimeoutFault extends FaultEvent +{ + public ScriptTimeoutFault(int isolateId) { + super(isolateId); + } + + public final static String name = "script_timeout"; //$NON-NLS-1$ + + @Override + public String name() { return name; } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/events/StackUnderFlowFault.java ---------------------------------------------------------------------- diff --git a/debugger/src/main/java/flash/tools/debugger/events/StackUnderFlowFault.java b/debugger/src/main/java/flash/tools/debugger/events/StackUnderFlowFault.java new file mode 100644 index 0000000..ce83e12 --- /dev/null +++ b/debugger/src/main/java/flash/tools/debugger/events/StackUnderFlowFault.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 flash.tools.debugger.events; + +/** + * Signals that a stack underflow has occurred. + */ +public class StackUnderFlowFault extends FaultEvent +{ + public StackUnderFlowFault(int isolateId) { + super(isolateId); + } + + public final static String name = "stack_underflow"; //$NON-NLS-1$ + + @Override + public String name() { return name; } +}