/******************************************************************************* * Copyright (c) 2000, 2005 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; import java.util.ArrayList; import org.eclipse.cdt.debug.core.CDIDebugModel; import org.eclipse.cdt.debug.core.cdi.CDIException; import org.eclipse.cdt.debug.core.cdi.model.ICDISignal; import org.eclipse.cdt.debug.core.model.ICSignal; import org.eclipse.cdt.debug.internal.core.model.CDebugTarget; import org.eclipse.cdt.debug.internal.core.model.CSignal; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugException; /** * Manages the collection of signals on a debug target. */ public class CSignalManager implements IAdaptable { /** * The debug target associated with this manager. */ private CDebugTarget fDebugTarget; /** * The list of signals. */ private ICSignal[] fSignals = null; /** * The dispose flag. */ private boolean fIsDisposed = false; /** * Constructor for CSignalManager. */ public CSignalManager( CDebugTarget target ) { fDebugTarget = target; } /* (non-Javadoc) * @see org.eclipse.cdt.debug.core.ICSignalManager#getSignals() */ public ICSignal[] getSignals() throws DebugException { if ( !isDisposed() && fSignals == null ) { try { ICDISignal[] cdiSignals = getDebugTarget().getCDITarget().getSignals(); ArrayList list = new ArrayList( cdiSignals.length ); for( int i = 0; i < cdiSignals.length; ++i ) { list.add( new CSignal( getDebugTarget(), cdiSignals[i] ) ); } fSignals = (ICSignal[])list.toArray( new ICSignal[list.size()] ); } catch( CDIException e ) { throwDebugException( e.getMessage(), DebugException.TARGET_REQUEST_FAILED, e ); } } return (fSignals != null) ? fSignals : new ICSignal[0]; } /* (non-Javadoc) * @see org.eclipse.cdt.debug.internal.core.CUpdateManager#dispose() */ public void dispose() { if ( fSignals != null ) for( int i = 0; i < fSignals.length; ++i ) { ((CSignal)fSignals[i]).dispose(); } fSignals = null; fIsDisposed = true; } /* (non-Javadoc) * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) */ public Object getAdapter( Class adapter ) { if ( adapter.equals( CSignalManager.class ) ) { return this; } if ( adapter.equals( CDebugTarget.class ) ) { return getDebugTarget(); } return null; } public void signalChanged( ICDISignal cdiSignal ) { CSignal signal = find( cdiSignal ); if ( signal != null ) { signal.fireChangeEvent( DebugEvent.STATE ); } } private CSignal find( ICDISignal cdiSignal ) { try { ICSignal[] signals = getSignals(); for( int i = 0; i < signals.length; ++i ) if ( signals[i].getName().equals( cdiSignal.getName() ) ) return (CSignal)signals[i]; } catch( DebugException e ) { } return null; } protected boolean isDisposed() { return fIsDisposed; } /** * Throws a debug exception with the given message, error code, and underlying exception. */ protected void throwDebugException( String message, int code, Throwable exception ) throws DebugException { throw new DebugException( new Status( IStatus.ERROR, CDIDebugModel.getPluginIdentifier(), code, message, exception ) ); } protected CDebugTarget getDebugTarget() { return fDebugTarget; } }