diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.xml b/debug/org.eclipse.cdt.debug.ui/plugin.xml index fa6769bbf67..0188aa81f49 100644 --- a/debug/org.eclipse.cdt.debug.ui/plugin.xml +++ b/debug/org.eclipse.cdt.debug.ui/plugin.xml @@ -128,17 +128,17 @@ diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/InvalidLaunchableAdapterFactory.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/InvalidLaunchableAdapterFactory.java new file mode 100644 index 00000000000..10ff510a19f --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/InvalidLaunchableAdapterFactory.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * Copyright (c) 2013 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial implementation + *******************************************************************************/ +package org.eclipse.cdt.debug.internal.ui.launch; + +import java.util.ArrayList; + +import org.eclipse.cdt.debug.ui.CDebugUIPlugin; +import org.eclipse.core.runtime.IAdapterFactory; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.debug.ui.actions.ILaunchable; + +/** + * This is an invalid Adapter factory which insures that there are no false + * usages of this class when defining ILaunchable contexts. Please reference + * the ILaunchable interface and Bugzilla : 396822. + */ +public class InvalidLaunchableAdapterFactory implements IAdapterFactory { + + private static final Class[] TYPES = { ILaunchable.class }; + + private static ArrayList currentTraces = new ArrayList(); + + /* + * (non-Javadoc) + * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class) + */ + @Override + @SuppressWarnings("rawtypes") + public Object getAdapter(Object adaptableObject, Class adapterType) { + /* + * Calculate the trace to see if we already have seen this one. We only + * want to report new instances of the violation. + */ + String trace = getStackTrace(); + + if ( ! currentTraces.contains( trace ) ) { + /* + * Note we have seen this one for the first time. + */ + currentTraces.add( trace ); + + /* + * Generate a message for this in the log file. + */ + String msg = LaunchMessages.getString("Launch.ILaunchable.Interface.Error"); //$NON-NLS-1$ + + CDebugUIPlugin.log( new Status( IStatus.INFO, CDebugUIPlugin.PLUGIN_ID, 0, msg, new Throwable( "" ) ) ); //$NON-NLS-1$ + } + + /* + * We do not actually provide an adapter factory for this. + */ + return null; + } + + /* + * Constructs the stack trace for comparison to see if we have seen this exact trace before. + * We only report each unique instance once. + */ + private String getStackTrace() { + String trace = ""; //$NON-NLS-1$ + for (StackTraceElement elem : new Throwable().getStackTrace()) { + trace += elem.getClassName() + elem.getMethodName() + elem.getFileName() + elem.getLineNumber(); + } + return trace; + } + + /* + * Indicates that we are adapting ILaunchable. + * + * (non-Javadoc) + * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList() + */ + @Override + @SuppressWarnings("rawtypes") + public Class[] getAdapterList() { + return TYPES; + } +} diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/LaunchMessages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/LaunchMessages.properties index 65d1b918bef..d83a53bd822 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/LaunchMessages.properties +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/LaunchMessages.properties @@ -32,3 +32,6 @@ CApplicationLaunchShortcut.Launch_failed_no_project_selected=Launch failed no pr Launch.common.BinariesColon=Binaries: Launch.common.QualifierColon=Qualifier: + +Launch.ILaunchable.Interface.Error=An attempt to instantiate an adapter factory for ILaunchable. By API specification this is not allowed. Use hasAdapter() to determine existense. + diff --git a/memory/org.eclipse.cdt.debug.ui.memory.transport/plugin.xml b/memory/org.eclipse.cdt.debug.ui.memory.transport/plugin.xml index 10e7c942abb..abb815d87b5 100644 --- a/memory/org.eclipse.cdt.debug.ui.memory.transport/plugin.xml +++ b/memory/org.eclipse.cdt.debug.ui.memory.transport/plugin.xml @@ -7,17 +7,6 @@ name="%extension.name.0" point="org.eclipse.cdt.debug.ui.memory.transport.memoryTransport"> - - - - - + + + + + diff --git a/memory/org.eclipse.cdt.debug.ui.memory.transport/schema/MemoryTransport.exsd b/memory/org.eclipse.cdt.debug.ui.memory.transport/schema/MemoryTransport.exsd index cf963b11f26..ec7304db8f9 100644 --- a/memory/org.eclipse.cdt.debug.ui.memory.transport/schema/MemoryTransport.exsd +++ b/memory/org.eclipse.cdt.debug.ui.memory.transport/schema/MemoryTransport.exsd @@ -77,6 +77,13 @@ + + + + Maximum size of the addressable memory this exporter can support in bits. + + + @@ -109,6 +116,13 @@ + + + + Maximum size of the addressable memory this importer can support in bits. + + + diff --git a/memory/org.eclipse.cdt.debug.ui.memory.transport/src/org/eclipse/cdt/debug/ui/memory/transport/ExportMemoryDialog.java b/memory/org.eclipse.cdt.debug.ui.memory.transport/src/org/eclipse/cdt/debug/ui/memory/transport/ExportMemoryDialog.java index f279b04e2de..af4f639a596 100644 --- a/memory/org.eclipse.cdt.debug.ui.memory.transport/src/org/eclipse/cdt/debug/ui/memory/transport/ExportMemoryDialog.java +++ b/memory/org.eclipse.cdt.debug.ui.memory.transport/src/org/eclipse/cdt/debug/ui/memory/transport/ExportMemoryDialog.java @@ -23,6 +23,7 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IMemoryBlock; +import org.eclipse.debug.core.model.IMemoryBlockExtension; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.swt.SWT; @@ -180,19 +181,46 @@ public class ExportMemoryDialog extends SelectionDialog registry.getExtensionPoint("org.eclipse.cdt.debug.ui.memory.transport.memoryTransport"); //$NON-NLS-1$ IConfigurationElement points[] = extensionPoint.getConfigurationElements(); - + for (int i = 0; i < points.length; i++) { IConfigurationElement element = points[i]; if("exporter".equals(element.getName())) //$NON-NLS-1$ { + String maxSizeStr = element.getAttribute("maxmemorysize"); + if ( maxSizeStr != null ) { + if ( fMemoryBlock instanceof IMemoryBlockExtension ) { + IMemoryBlockExtension memBlock = (IMemoryBlockExtension) fMemoryBlock; + try { + BigInteger endAddress = memBlock.getBigBaseAddress(); + BigInteger length = memBlock.getBigLength(); + if ( length != null && ! length.equals(new BigInteger("-1",10) ) ) { + endAddress = endAddress.add( length ) ; + } + int maxAddressSizeInBits = endAddress.bitLength(); + int maxSupportedAddressSizeInBits = Integer.decode(maxSizeStr); + if ( maxAddressSizeInBits > maxSupportedAddressSizeInBits ) { + continue; + } + } catch (DebugException e1) { + continue; + } + } + else { + int maxSupportedAddressSizeInBits = Integer.decode(maxSizeStr); + if ( maxSupportedAddressSizeInBits < 32 ) { + continue; + } + } + } + try { exporters.addElement((IMemoryExporter) element.createExecutableExtension("class")); //$NON-NLS-1$ } catch(Exception e) { MemoryTransportPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, MemoryTransportPlugin.getUniqueIdentifier(), - DebugException.INTERNAL_ERROR, "Failure", e)); //$NON-NLS-1$ + DebugException.INTERNAL_ERROR, "Failure", e)); //$NON-NLS-1$ } } } diff --git a/memory/org.eclipse.cdt.debug.ui.memory.transport/src/org/eclipse/cdt/debug/ui/memory/transport/ImportMemoryDialog.java b/memory/org.eclipse.cdt.debug.ui.memory.transport/src/org/eclipse/cdt/debug/ui/memory/transport/ImportMemoryDialog.java index 32d12aec9ce..4d91238617e 100644 --- a/memory/org.eclipse.cdt.debug.ui.memory.transport/src/org/eclipse/cdt/debug/ui/memory/transport/ImportMemoryDialog.java +++ b/memory/org.eclipse.cdt.debug.ui.memory.transport/src/org/eclipse/cdt/debug/ui/memory/transport/ImportMemoryDialog.java @@ -25,6 +25,7 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IMemoryBlock; +import org.eclipse.debug.core.model.IMemoryBlockExtension; import org.eclipse.debug.ui.memory.IMemoryRendering; import org.eclipse.debug.ui.memory.IMemoryRenderingContainer; import org.eclipse.debug.ui.memory.IMemoryRenderingSite; @@ -219,6 +220,30 @@ public class ImportMemoryDialog extends SelectionDialog IConfigurationElement element = points[i]; if("importer".equals(element.getName())) //$NON-NLS-1$ { + String maxSizeStr = element.getAttribute("maxmemorysize"); + if ( maxSizeStr != null ) { + if ( fMemoryBlock instanceof IMemoryBlockExtension ) { + IMemoryBlockExtension memBlock = (IMemoryBlockExtension) fMemoryBlock; + try { + int maxAddressSizeInBits = memBlock.getAddressSize() * 8; + int maxSupportedAddressSizeInBits = Integer.decode(maxSizeStr); + if ( maxAddressSizeInBits > maxSupportedAddressSizeInBits ) { + continue; + } + } catch (DebugException e1) { + continue; + } + } + else { + int maxSupportedAddressSizeInBits = Integer.decode(maxSizeStr); + if ( maxSupportedAddressSizeInBits < 32 ) { + continue; + } + } + } + + + try { importers.addElement(element.createExecutableExtension("class")); //$NON-NLS-1$ diff --git a/memory/org.eclipse.cdt.debug.ui.memory.transport/src/org/eclipse/cdt/debug/ui/memory/transport/PlainTextExporter.java b/memory/org.eclipse.cdt.debug.ui.memory.transport/src/org/eclipse/cdt/debug/ui/memory/transport/PlainTextExporter.java index 2ad02b2260c..d5698f91bb1 100644 --- a/memory/org.eclipse.cdt.debug.ui.memory.transport/src/org/eclipse/cdt/debug/ui/memory/transport/PlainTextExporter.java +++ b/memory/org.eclipse.cdt.debug.ui.memory.transport/src/org/eclipse/cdt/debug/ui/memory/transport/PlainTextExporter.java @@ -280,6 +280,21 @@ public class PlainTextExporter implements IMemoryExporter { composite.pack(); + /* + * We need to perform a validation. If we do it immediately we will get an exception + * because things are not totally setup. So we schedule an immediate running of the + * validation. For a very brief time the view logically may show a state which does + * not reflect the true state of affairs. But the validate immediately corrects the + * info. In practice the user never sees the invalid state displayed, because of the + * speed of the draw of the dialog. + */ + Display.getDefault().asyncExec(new Runnable(){ + public void run() + { + validate(); + } + }); + return composite; }