/******************************************************************************* * Copyright (c) 2004, 2006 QNX Software Systems 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: * QNX Software Systems - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.debug.internal.core.sourcelookup; import org.eclipse.cdt.debug.core.model.ICStackFrame; import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation; import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator; import org.eclipse.cdt.debug.internal.core.model.CDebugTarget; import org.eclipse.cdt.debug.internal.core.model.Disassembly; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.model.IPersistableSourceLocator; import org.eclipse.debug.core.model.ISourceLocator; import org.eclipse.debug.core.model.IStackFrame; /** * Locates sources for a C/C++ debug session. */ public class CSourceManager implements ICSourceLocator, IPersistableSourceLocator, IAdaptable { private ISourceLocator fSourceLocator = null; private ILaunch fLaunch = null; private CDebugTarget fDebugTarget = null; /** * Constructor for CSourceManager. */ public CSourceManager(ISourceLocator sourceLocator) { setSourceLocator(sourceLocator); } /* * (non-Javadoc) * * @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator#getLineNumber(IStackFrameInfo) */ public int getLineNumber(IStackFrame frame) { if (getCSourceLocator() != null) { return getCSourceLocator().getLineNumber(frame); } if (frame instanceof ICStackFrame) { return ((ICStackFrame)frame).getFrameLineNumber(); } return 0; } /* * (non-Javadoc) * @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator#getSourceLocations() */ public ICSourceLocation[] getSourceLocations() { return (getCSourceLocator() != null) ? getCSourceLocator().getSourceLocations() : new ICSourceLocation[0]; } /* * (non-Javadoc) * @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator#setSourceLocations(ICSourceLocation[]) */ public void setSourceLocations(ICSourceLocation[] locations) { if (getCSourceLocator() != null) { getCSourceLocator().setSourceLocations(locations); CDebugTarget target = getDebugTarget(); if (target != null) { Disassembly d = null; try { d = (Disassembly)target.getDisassembly(); } catch (DebugException e) { } if (d != null) { d.reset(); } } } } /* * (non-Javadoc) * @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator#contains(IResource) */ public boolean contains(IResource resource) { return (getCSourceLocator() != null) ? getCSourceLocator().contains(resource) : false; } /* * (non-Javadoc) * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class) */ public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) { if (adapter.equals(CSourceManager.class)) return this; if (adapter.equals(ICSourceLocator.class)) return this; if (adapter.equals(IPersistableSourceLocator.class)) return this; if (adapter.equals(IResourceChangeListener.class) && fSourceLocator instanceof IResourceChangeListener) return fSourceLocator; return null; } /* * (non-Javadoc) * @see org.eclipse.debug.core.model.ISourceLocator#getSourceElement(IStackFrame) */ public Object getSourceElement(IStackFrame stackFrame) { Object result = null; if (getSourceLocator() != null) result = getSourceLocator().getSourceElement(stackFrame); return result; } protected ICSourceLocator getCSourceLocator() { if (getSourceLocator() instanceof ICSourceLocator) return (ICSourceLocator)getSourceLocator(); return null; } protected ISourceLocator getSourceLocator() { if (fSourceLocator != null) return fSourceLocator; else if (fLaunch != null) return fLaunch.getSourceLocator(); return null; } private void setSourceLocator(ISourceLocator sl) { fSourceLocator = sl; } /* * (non-Javadoc) * @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator#findSourceElement(String) */ public Object findSourceElement(String fileName) { if (getCSourceLocator() != null) { return getCSourceLocator().findSourceElement(fileName); } return null; } /* * (non-Javadoc) * @see org.eclipse.debug.core.model.IPersistableSourceLocator#getMemento() */ public String getMemento() throws CoreException { if (getPersistableSourceLocator() != null) return getPersistableSourceLocator().getMemento(); return null; } /* * (non-Javadoc) * @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeDefaults(org.eclipse.debug.core.ILaunchConfiguration) */ public void initializeDefaults(ILaunchConfiguration configuration) throws CoreException { if (getPersistableSourceLocator() != null) getPersistableSourceLocator().initializeDefaults(configuration); } /* * (non-Javadoc) * @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeFromMemento(java.lang.String) */ public void initializeFromMemento(String memento) throws CoreException { if (getPersistableSourceLocator() != null) getPersistableSourceLocator().initializeFromMemento(memento); } private IPersistableSourceLocator getPersistableSourceLocator() { if (fSourceLocator instanceof IPersistableSourceLocator) return (IPersistableSourceLocator)fSourceLocator; return null; } /* * (non-Javadoc) * @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator#getProject() */ public IProject getProject() { return (getCSourceLocator() != null) ? getCSourceLocator().getProject() : null; } public void setDebugTarget(CDebugTarget target) { fDebugTarget = target; } protected CDebugTarget getDebugTarget() { return fDebugTarget; } /* * (non-Javadoc) * @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator#setSearchForDuplicateFiles(boolean) */ public void setSearchForDuplicateFiles(boolean search) { if (getCSourceLocator() != null) getCSourceLocator().setSearchForDuplicateFiles(search); } /* * (non-Javadoc) * @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator#searchForDuplicateFiles() */ public boolean searchForDuplicateFiles() { return getCSourceLocator() != null && getCSourceLocator().searchForDuplicateFiles(); } }