/*
 * (c) Copyright QNX Software Systems Ltd. 2002.
 * All Rights Reserved.
 */
package org.eclipse.cdt.debug.mi.core.cdi.event;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.cdt.debug.core.cdi.event.ICDIMemoryChangedEvent;
import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
import org.eclipse.cdt.debug.mi.core.cdi.Session;
import org.eclipse.cdt.debug.mi.core.cdi.model.MemoryBlock;
import org.eclipse.cdt.debug.mi.core.event.MIMemoryChangedEvent;

/**
 */
public class MemoryChangedEvent implements ICDIMemoryChangedEvent {

	Session session;
	MemoryBlock source;
	MIMemoryChangedEvent miMem;

	public MemoryChangedEvent(Session s, MemoryBlock block, MIMemoryChangedEvent mem) {
		session = s;
		source = block;
		miMem = mem;
	}

	/**
	 * @see org.eclipse.cdt.debug.core.cdi.event.ICDIEvent#getAddresses()
	 */
	public Long[] getAddresses() {
	 	/* But only returns the address that are in the block.  */
		Long[] longs = miMem.getAddresses();
		List aList = new ArrayList(longs.length);
		for (int i = 0; i < longs.length; i++) {
			if (source.contains(longs[i])) {
				aList.add(longs[i]);
			}
		}
		return (Long[])aList.toArray(new Long[0]);
	}

	/**
	 * @see org.eclipse.cdt.debug.core.cdi.event.ICDIEvent#getSource()
	 */
	public ICDIObject getSource() {
		return source;
	}

}
