Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/dsf
diff options
context:
space:
mode:
authorKen Ryall2010-04-19 21:05:28 +0000
committerKen Ryall2010-04-19 21:05:28 +0000
commitf71f3c7fc602e88c001db227ed0f9b8f9fd1cb4c (patch)
tree3c36b26212ae2739c0b07e916624633ba2a6388c /dsf
parent9bcfc4f06268b9637ae57305d42c7a0eed1bf0e1 (diff)
downloadorg.eclipse.cdt-f71f3c7fc602e88c001db227ed0f9b8f9fd1cb4c.tar.gz
org.eclipse.cdt-f71f3c7fc602e88c001db227ed0f9b8f9fd1cb4c.tar.xz
org.eclipse.cdt-f71f3c7fc602e88c001db227ed0f9b8f9fd1cb4c.zip
Bug 274872 - Repeated '<unknown>' editor
Diffstat (limited to 'dsf')
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/CSourceNotFoundDescriptionFactory.java156
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/internal/ui/DsfUIPlugin.java5
2 files changed, 161 insertions, 0 deletions
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/CSourceNotFoundDescriptionFactory.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/CSourceNotFoundDescriptionFactory.java
new file mode 100644
index 00000000000..a3dbecf4338
--- /dev/null
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/CSourceNotFoundDescriptionFactory.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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:
+ * Nokia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.debug.internal.ui;
+
+import java.util.HashMap;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.internal.core.sourcelookup.ICSourceNotFoundDescription;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.debug.service.IStack;
+import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
+import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMData;
+import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.ILaunchVMConstants;
+import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.MessagesForLaunchVM;
+import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
+import org.eclipse.cdt.dsf.service.DsfServicesTracker;
+import org.eclipse.cdt.dsf.service.DsfSession;
+import org.eclipse.core.runtime.IAdapterFactory;
+
+import com.ibm.icu.text.MessageFormat;
+
+/**
+ * This factory provides an instance of ICSourceNotFoundDescription that
+ * can generate a description of a IFrameDMContext.
+ *
+ */
+public class CSourceNotFoundDescriptionFactory implements IAdapterFactory {
+
+ @SuppressWarnings("rawtypes")
+ public Object getAdapter(Object adaptableObject, Class adapterType) {
+ if (adapterType.equals(ICSourceNotFoundDescription.class) &&
+ adaptableObject instanceof IFrameDMContext)
+ {
+ final IFrameDMContext frameDMC = (IFrameDMContext) adaptableObject;
+ return new ICSourceNotFoundDescription() {
+
+ public String getDescription() {
+ Query<IStack.IFrameDMData> query = new Query<IStack.IFrameDMData>() {
+ @Override
+ protected void execute(DataRequestMonitor<IStack.IFrameDMData> rm) {
+ DsfServicesTracker tracker =
+ new DsfServicesTracker(DsfUIPlugin.getBundleContext(), frameDMC.getSessionId());
+
+ IStack stack = tracker.getService(IStack.class);
+ if (stack != null) {
+ stack.getFrameData(frameDMC, rm);
+ } else {
+ rm.setData(null);
+ rm.done();
+ }
+ tracker.dispose();
+ }
+ };
+ DsfSession.getSession(frameDMC.getSessionId()).getExecutor().execute(query);
+ try {
+ IFrameDMData dmData = query.get();
+ return getFrameDescription(dmData);
+ } catch (Exception e) {
+ return frameDMC.toString();
+ }
+ }};
+ }
+ return null;
+ }
+
+ @SuppressWarnings("rawtypes")
+ public Class[] getAdapterList() {
+ return new Class[] { ICSourceNotFoundDescription.class };
+ }
+
+ /** Creates a brief description of stack frame data.
+ * Based on code in StackFrameVMNode.
+ * @param frame
+ * @return the frame description
+ */
+ private static String getFrameDescription(IStack.IFrameDMData frame)
+ {
+ String formatString = ""; //$NON-NLS-1$
+ String[] propertyNames = null;
+ HashMap<String, Object> properties = new HashMap<String, Object>();
+ fillFrameDataProperties(properties, frame);
+
+ Integer line = (Integer)properties.get(ILaunchVMConstants.PROP_FRAME_LINE);
+ String file = (String)properties.get(ILaunchVMConstants.PROP_FRAME_FILE);
+ String function = (String)properties.get(ILaunchVMConstants.PROP_FRAME_FUNCTION);
+ String module = (String)properties.get(ILaunchVMConstants.PROP_FRAME_MODULE);
+ if (line != null && line >= 0 && file != null && file.length() > 0)
+ {
+ formatString = MessagesForLaunchVM.StackFramesVMNode_No_columns__text_format;
+ propertyNames = new String[] {
+ ILaunchVMConstants.PROP_FRAME_ADDRESS,
+ ILaunchVMConstants.PROP_FRAME_FUNCTION,
+ ILaunchVMConstants.PROP_FRAME_FILE,
+ ILaunchVMConstants.PROP_FRAME_LINE,
+ ILaunchVMConstants.PROP_FRAME_COLUMN,
+ ILaunchVMConstants.PROP_FRAME_MODULE};
+ }
+ else if (function != null && function.length() > 0 && module != null && module.length() > 0)
+ {
+ formatString = MessagesForLaunchVM.StackFramesVMNode_No_columns__No_line__text_format;
+ propertyNames = new String[] {
+ ILaunchVMConstants.PROP_FRAME_ADDRESS,
+ ILaunchVMConstants.PROP_FRAME_FUNCTION,
+ ILaunchVMConstants.PROP_FRAME_MODULE};
+ }
+ else if (module != null && module.length() > 0)
+ {
+ formatString = MessagesForLaunchVM.StackFramesVMNode_No_columns__No_function__text_format;
+ propertyNames = new String[] {
+ ILaunchVMConstants.PROP_FRAME_ADDRESS,
+ ILaunchVMConstants.PROP_FRAME_MODULE};
+ }
+ else if (function != null && function.length() > 0)
+ {
+ formatString = MessagesForLaunchVM.StackFramesVMNode_No_columns__No_module__text_format;
+ propertyNames = new String[] {
+ ILaunchVMConstants.PROP_FRAME_ADDRESS,
+ ILaunchVMConstants.PROP_FRAME_FUNCTION};
+ }
+ else
+ {
+ formatString = MessagesForLaunchVM.StackFramesVMNode_No_columns__Address_only__text_format;
+ propertyNames = new String[] {
+ ILaunchVMConstants.PROP_FRAME_ADDRESS};
+ }
+
+ Object[] propertyValues = new Object[propertyNames.length];
+ for (int i = 0; i < propertyNames.length; i++) {
+ propertyValues[i] = properties.get(propertyNames[i]);
+ }
+
+ return new MessageFormat(formatString).format(propertyValues, new StringBuffer(), null).toString();
+ }
+
+ private static void fillFrameDataProperties(java.util.Map<String,Object> properties, IFrameDMData data) {
+ IAddress address = data.getAddress();
+ if (address != null) {
+ properties.put(ILaunchVMConstants.PROP_FRAME_ADDRESS, "0x" + address.toString(16)); //$NON-NLS-1$
+ }
+ properties.put(ILaunchVMConstants.PROP_FRAME_FILE, data.getFile());
+ properties.put(ILaunchVMConstants.PROP_FRAME_FUNCTION, data.getFunction());
+ properties.put(ILaunchVMConstants.PROP_FRAME_LINE, data.getLine());
+ properties.put(ILaunchVMConstants.PROP_FRAME_COLUMN, data.getColumn());
+ properties.put(ILaunchVMConstants.PROP_FRAME_MODULE, data.getModule());
+ }
+
+}
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/internal/ui/DsfUIPlugin.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/internal/ui/DsfUIPlugin.java
index 58e7fa37723..8716b0be978 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/internal/ui/DsfUIPlugin.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/internal/ui/DsfUIPlugin.java
@@ -11,8 +11,10 @@
package org.eclipse.cdt.dsf.internal.ui;
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
+import org.eclipse.cdt.dsf.debug.internal.ui.CSourceNotFoundDescriptionFactory;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.DisassemblyBackendDsfFactory;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.SourceDocumentProvider;
+import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.cdt.dsf.debug.ui.DsfDebugUITools;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
import org.eclipse.core.runtime.IStatus;
@@ -62,6 +64,9 @@ public class DsfUIPlugin extends AbstractUIPlugin {
// Register the DSF backend for our disassembly view (the CDT debug UI
// plugin registers the CDI one)
Platform.getAdapterManager().registerAdapters(new DisassemblyBackendDsfFactory(), IDMVMContext.class);
+ // Register the factory that provides descriptions of stack frames
+ // to the CSourceNotFoundEditor.
+ Platform.getAdapterManager().registerAdapters(new CSourceNotFoundDescriptionFactory(), IFrameDMContext.class);
DsfDebugUITools.enableActivity("org.eclipse.cdt.debug.ui.cdtActivity", true); //$NON-NLS-1$
}

Back to the top