/******************************************************************************* * Copyright (c) 2004, 2007 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.model; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import org.eclipse.cdt.debug.core.CDIDebugModel; import org.eclipse.cdt.debug.core.cdi.model.ICDIObject; import org.eclipse.cdt.debug.core.cdi.model.ICDISharedLibrary; import org.eclipse.cdt.debug.core.model.ICDebugTarget; import org.eclipse.cdt.debug.core.model.ICModule; import org.eclipse.cdt.debug.core.model.IModuleRetrieval; import org.eclipse.cdt.debug.internal.core.ICDebugInternalConstants; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.PlatformObject; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugException; /** * Manages the modules loaded on this debug target. */ public class CModuleManager extends PlatformObject implements IModuleRetrieval { /** * The debug target associated with this manager. */ private CDebugTarget fDebugTarget; /** * The collection of the shared libraries loaded on this target. */ private ArrayList fModules; /** * Constructor for CModuleManager. */ public CModuleManager( CDebugTarget target ) { fDebugTarget = target; fModules = new ArrayList( 5 ); } public boolean hasModules() throws DebugException { return !fModules.isEmpty(); } public ICModule[] getModules() throws DebugException { return (ICModule[])fModules.toArray( new ICModule[fModules.size()] ); } public void loadSymbolsForAllModules() throws DebugException { MultiStatus ms = new MultiStatus( CDIDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, CoreModelMessages.getString( "CModuleManager.0" ), null ); //$NON-NLS-1$ Iterator it = fModules.iterator(); while( it.hasNext() ) { ICModule module = (ICModule)it.next(); try { module.loadSymbols(); } catch( DebugException e ) { ms.add( new Status( IStatus.ERROR, CDIDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, e.getMessage(), e ) ); } } if ( !ms.isOK() ) { throw new DebugException( ms ); } } public void loadSymbols( ICModule[] modules ) throws DebugException { MultiStatus ms = new MultiStatus( CDIDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, CoreModelMessages.getString( "CModuleManager.1" ), null ); //$NON-NLS-1$ for ( int i = 0; i < modules.length; ++i ) { try { modules[i].loadSymbols(); } catch( DebugException e ) { ms.add( new Status( IStatus.ERROR, CDIDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, e.getMessage(), e ) ); } } if ( !ms.isOK() ) { throw new DebugException( ms ); } } public void dispose() { Iterator it = fModules.iterator(); while( it.hasNext() ) { ((CModule)it.next()).dispose(); } fModules.clear(); } protected CDebugTarget getDebugTarget() { return fDebugTarget; } protected void addModules( ICModule[] modules ) { fModules.addAll( Arrays.asList( modules ) ); } protected void removeModules( ICModule[] modules ) { fModules.removeAll( Arrays.asList( modules ) ); } public void sharedLibraryLoaded( ICDISharedLibrary cdiLibrary ) { CModule library = null; synchronized( fModules ) { if ( find( cdiLibrary ) == null ) { library = CModule.createSharedLibrary( getDebugTarget(), cdiLibrary ); fModules.add( library ); } } if ( library != null ) library.fireCreationEvent(); } public void sharedLibraryUnloaded( ICDISharedLibrary cdiLibrary ) { CModule library = null; synchronized( fModules ) { library = find( cdiLibrary ); if ( library != null ) { fModules.remove( library ); } } if ( library != null ) { library.dispose(); library.fireTerminateEvent(); } } public void symbolsLoaded( ICDIObject cdiObject ) { CModule module = find( cdiObject ); if ( module != null ) { module.fireChangeEvent( DebugEvent.STATE ); } } private CModule find( ICDIObject cdiObject ) { Iterator it = fModules.iterator(); while( it.hasNext() ) { CModule module = (CModule)it.next(); if ( module.equals( cdiObject ) ) return module; } return null; } /* (non-Javadoc) * @see org.eclipse.core.runtime.PlatformObject#getAdapter(java.lang.Class) */ public Object getAdapter( Class adapter ) { if ( adapter.equals( ICDebugTarget.class ) ) return getDebugTarget(); return super.getAdapter( adapter ); } }