debuggercdi/com.nokia.cdt.debug.common/src/com/nokia/cdt/debug/common/internal/source/lookup/SourceMappingUtils.java
changeset 1096 96e5879cd42d
child 2039 250d6109c006
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debuggercdi/com.nokia.cdt.debug.common/src/com/nokia/cdt/debug/common/internal/source/lookup/SourceMappingUtils.java	Thu Mar 11 13:45:01 2010 -0600
@@ -0,0 +1,85 @@
+package com.nokia.cdt.debug.common.internal.source.lookup;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.model.ISourceLocator;
+import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+
+
+public class SourceMappingUtils {
+
+	/** Name kept for legacy launch config settings purposes */
+	private static final String EPOCROOT_SETTING = "com.nokia.cdt.debug.cw.symbian.Epoc_Root" ; //$NON-NLS-1$
+
+	/**
+	 * Add the source mapping for the workign copy of the launch config. Clients should ensure to call doSave() after this call.
+	 * @param configuration
+	 * @throws CoreException
+	 */
+	public static void addSourceMappingToLaunch(ILaunchConfigurationWorkingCopy configuration) throws CoreException {
+		String memento = null;
+		String type = null;
+
+		memento = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, (String) null);
+		type = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, (String) null);
+		if (type == null) {
+			type = configuration.getType().getSourceLocatorId();
+		}
+		ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
+		ISourceLocator locator = launchManager.newSourceLocator(type);
+		if (locator instanceof AbstractSourceLookupDirector) {
+			AbstractSourceLookupDirector director = (AbstractSourceLookupDirector) locator;
+			if (memento == null) {
+				director.initializeDefaults(configuration);
+			} else {
+				director.initializeFromMemento(memento, configuration);
+			}
+
+			addSourceMappingToDirector(director, configuration);
+			
+			configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, director.getMemento());
+			configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, director.getId());
+		}
+	}
+	
+	private static void addSourceMappingToDirector(AbstractSourceLookupDirector director, ILaunchConfiguration configuration) throws CoreException {
+
+		ArrayList containerList = new ArrayList(Arrays.asList(director.getSourceContainers()));
+
+		boolean hasSymbianContainer = false;
+
+		SymbianSourceContainer symbianContainer = null;
+		
+		for (Iterator iter = containerList.iterator(); iter.hasNext() && !hasSymbianContainer;) {
+			ISourceContainer container = (ISourceContainer) iter.next();
+			if (container instanceof SymbianSourceContainer)
+			{
+				hasSymbianContainer = true;
+			}
+		}
+
+		if (!hasSymbianContainer) {
+			
+			String epocRootPath = configuration.getAttribute( EPOCROOT_SETTING, (String)null );
+			if (epocRootPath != null)
+			{
+				symbianContainer = new SymbianSourceContainer(new Path(epocRootPath));
+				symbianContainer.init(director);
+				containerList.add(symbianContainer);
+			}
+		}
+		
+		director.setSourceContainers((ISourceContainer[]) containerList.toArray(new ISourceContainer[containerList.size()]));
+	}
+	
+	
+}