# HG changeset patch # User ryall # Date 1284737851 21600 # Node ID 250d6109c006de0dae6ec9ffb75fe390b8ece594 # Parent dd457404f42ffa43a880d1ac35bdedf05b9a398b Add persistent source mapping for things remapped by the Symbian Source File Remapping. diff -r dd457404f42f -r 250d6109c006 debuggercdi/com.nokia.cdt.debug.common/src/com/nokia/cdt/debug/common/internal/executables/SymbianSourceFileRemapping.java --- a/debuggercdi/com.nokia.cdt.debug.common/src/com/nokia/cdt/debug/common/internal/executables/SymbianSourceFileRemapping.java Fri Sep 17 10:34:07 2010 -0500 +++ b/debuggercdi/com.nokia.cdt.debug.common/src/com/nokia/cdt/debug/common/internal/executables/SymbianSourceFileRemapping.java Fri Sep 17 09:37:31 2010 -0600 @@ -16,19 +16,83 @@ */ package com.nokia.cdt.debug.common.internal.executables; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; + import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.executables.ISourceFileRemapping; +import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer; +import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector; +import org.eclipse.cdt.debug.internal.core.sourcelookup.MapEntrySourceContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector; +import org.eclipse.debug.core.sourcelookup.ISourceContainer; import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage; import com.nokia.cdt.debug.common.internal.source.lookup.SymbianSourceContainer; public class SymbianSourceFileRemapping implements ISourceFileRemapping { + public final String foundMappingsContainerName = "Found Mappings"; //$NON-NLS-1$ + + private Job saveThePrefsJob = new Job(""){ + + @Override + protected IStatus run(IProgressMonitor monitor) { + System.out.println("save prefs"); + CDebugCorePlugin.getDefault().savePluginPreferences(); + return Status.OK_STATUS; + }}; + + @SuppressWarnings("restriction") + private void addSourceMappingToDirector(IPath missingPath, IPath newSourcePath, AbstractSourceLookupDirector director) throws CoreException { + + ArrayList containerList = new ArrayList(Arrays.asList(director.getSourceContainers())); + + boolean hasFoundMappings = false; + + MappingSourceContainer foundMappings = null; + + for (Iterator iter = containerList.iterator(); iter.hasNext() && !hasFoundMappings;) { + ISourceContainer container = (ISourceContainer) iter.next(); + if (container instanceof MappingSourceContainer) + { + hasFoundMappings = container.getName().equals(foundMappingsContainerName); + if (hasFoundMappings) + foundMappings = (MappingSourceContainer) container; + } + } + + if (!hasFoundMappings) { + foundMappings = new MappingSourceContainer(foundMappingsContainerName); + foundMappings.init(director); + containerList.add(foundMappings); + director.setSourceContainers((ISourceContainer[]) containerList.toArray(new ISourceContainer[containerList.size()])); + } + + foundMappings.addMapEntry(new MapEntrySourceContainer(missingPath, newSourcePath)); + } + + @SuppressWarnings("restriction") + private void addSourceMappingToCommon(IPath missingPath, IPath newSourcePath) throws CoreException { + CSourceLookupDirector director = CDebugCorePlugin.getDefault().getCommonSourceLookupDirector(); + addSourceMappingToDirector(missingPath, newSourcePath, director); + // We need to save the prefs to make sure this is persistent. But if we do it immediately + // here it will be slow and redundant if we are being used to remap a large collection + // of source files. So we save the prefs later in a job. + saveThePrefsJob.cancel(); + saveThePrefsJob.schedule(1000); + } + public String remapSourceFile(IPath executable, String filePath) { try { @@ -54,17 +118,22 @@ Object[] foundElements = symbianSourceContainer.findSourceElements(filePath); if (foundElements.length == 1) { + IPath missingPath = new Path(filePath); + IPath foundPath = null; if (foundElements[0] instanceof LocalFileStorage) { LocalFileStorage newLocation = (LocalFileStorage) foundElements[0]; - filePath = newLocation.getFullPath().toOSString(); + foundPath = newLocation.getFullPath(); + filePath = foundPath.toOSString(); } else if (foundElements[0] instanceof IResource) { IResource newResource = (IResource) foundElements[0]; - filePath = newResource.getLocation().toOSString(); + foundPath = newResource.getLocation(); + filePath = foundPath.toOSString(); } + addSourceMappingToCommon(missingPath, foundPath); } } catch (CoreException e) {} diff -r dd457404f42f -r 250d6109c006 debuggercdi/com.nokia.cdt.debug.common/src/com/nokia/cdt/debug/common/internal/source/lookup/SourceMappingUtils.java --- a/debuggercdi/com.nokia.cdt.debug.common/src/com/nokia/cdt/debug/common/internal/source/lookup/SourceMappingUtils.java Fri Sep 17 10:34:07 2010 -0500 +++ b/debuggercdi/com.nokia.cdt.debug.common/src/com/nokia/cdt/debug/common/internal/source/lookup/SourceMappingUtils.java Fri Sep 17 09:37:31 2010 -0600 @@ -4,7 +4,9 @@ import java.util.Arrays; import java.util.Iterator; +import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunchConfiguration; @@ -70,6 +72,16 @@ if (!hasSymbianContainer) { String epocRootPath = configuration.getAttribute( EPOCROOT_SETTING, (String)null ); + if (epocRootPath == null) + { + String exeName = configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, ""); + IPath executable = new Path(exeName); + String[] segs = executable.segments(); + for (int i = 0; i < segs.length; i++) { + if (segs[i].equalsIgnoreCase("epoc32")) + epocRootPath = executable.removeLastSegments(segs.length - i).toOSString(); + } + } if (epocRootPath != null) { symbianContainer = new SymbianSourceContainer(new Path(epocRootPath));