Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryBlockContentAdapter.java')
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryBlockContentAdapter.java503
1 files changed, 0 insertions, 503 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryBlockContentAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryBlockContentAdapter.java
deleted file mode 100644
index 65c221efa..000000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryBlockContentAdapter.java
+++ /dev/null
@@ -1,503 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation 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:
- * IBM Corporation - initial API and implementation
- * WindRiver - Bug 192028 [Memory View] Memory view does not
- * display memory blocks that do not reference IDebugTarget
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.elements.adapters;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTableRendering;
-import org.eclipse.debug.internal.ui.memory.provisional.MemoryViewPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousContentAdapter;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.debug.internal.ui.views.memory.renderings.MemorySegment;
-import org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingContentDescriptor;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-
-public class MemoryBlockContentAdapter extends AsynchronousContentAdapter {
-
- // Cache to allow the content provider to comppute change information
- // Cache is taken by copying the lineCache after a suspend event
- // or change event from the the memory block.
- protected Hashtable contentCache;
-
- public MemoryBlockContentAdapter()
- {
- contentCache = new Hashtable();
- }
-
- protected Object[] getChildren(Object parent, IPresentationContext context)
- throws CoreException {
-
- if (!(parent instanceof IMemoryBlock))
- return new Object[0];
-
- if (!(context instanceof MemoryViewPresentationContext))
- return new Object[0];
-
- MemoryViewPresentationContext memoryViewContext = (MemoryViewPresentationContext)context;
- IMemoryRendering rendering = memoryViewContext.getRendering();
-
- if (!(rendering instanceof AbstractAsyncTableRendering))
- return new Object[0];
-
- try
- {
- return getMemoryFromMemoryBlock(memoryViewContext);
- } catch (DebugException e) {
- throw e;
- }
-
- }
-
- protected boolean hasChildren(Object element, IPresentationContext context)
- throws CoreException {
-
- if (context instanceof MemoryViewPresentationContext)
- {
- if (((MemoryViewPresentationContext)context).getRendering() != null)
- return true;
- }
-
- return false;
- }
-
- protected boolean supportsPartId(String id) {
- return true;
- }
-
-
- private Object[] getMemoryFromMemoryBlock(MemoryViewPresentationContext context) throws DebugException {
- IMemoryBlock memoryBlock = context.getRendering().getMemoryBlock();
- if (memoryBlock instanceof IMemoryBlockExtension)
- {
- return loadContentForExtendedMemoryBlock(context);
- }
-
- return loadContentForSimpleMemoryBlock(context);
-
- }
-
- /**
- * @throws DebugException
- */
- public Object[] loadContentForSimpleMemoryBlock(MemoryViewPresentationContext context) throws DebugException {
- AbstractAsyncTableRendering rendering = getTableRendering(context);
- if (rendering != null)
- {
- IMemoryBlock memoryBlock = rendering.getMemoryBlock();
- long startAddress = memoryBlock.getStartAddress();
- BigInteger address = BigInteger.valueOf(startAddress);
- long length = memoryBlock.getLength();
- long numLines = length / rendering.getBytesPerLine();
- return getMemoryToFitTable(address, numLines, context);
- }
- return EMPTY;
- }
-
- /**
- * @throws DebugException
- */
- public Object[] loadContentForExtendedMemoryBlock(MemoryViewPresentationContext context) throws DebugException {
-
- AbstractAsyncTableRendering rendering = getTableRendering(context);
- if (rendering != null)
- {
- TableRenderingContentDescriptor descriptor = (TableRenderingContentDescriptor)rendering.getAdapter(TableRenderingContentDescriptor.class);
-
- if (descriptor == null)
- return new Object[0];
-
- if (descriptor.getNumLines() <= 0)
- return new Object[0];
-
- // calculate top buffered address
- BigInteger loadAddress = descriptor.getLoadAddress();
- if (loadAddress == null)
- {
- loadAddress = new BigInteger("0"); //$NON-NLS-1$
- }
-
- BigInteger mbStart = descriptor.getStartAddress();
- BigInteger mbEnd = descriptor.getEndAddress();
-
- // check that the load address is within range
- if (loadAddress.compareTo(mbStart) < 0 || loadAddress.compareTo(mbEnd) > 0)
- {
- // default load address to memory block base address
- loadAddress = ((IMemoryBlockExtension)descriptor.getMemoryBlock()).getBigBaseAddress();
- descriptor.setLoadAddress(loadAddress);
- }
-
- // if address is still out of range, throw an exception
- if (loadAddress.compareTo(mbStart) < 0 || loadAddress.compareTo(mbEnd) > 0)
- {
- throw new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.TableRenderingContentProvider_0 + loadAddress.toString(16), null));
- }
-
- int addressableUnitsPerLine = rendering.getAddressableUnitPerLine();
- BigInteger bufferStart = loadAddress.subtract(BigInteger.valueOf(descriptor.getPreBuffer()*addressableUnitsPerLine));
- BigInteger bufferEnd = loadAddress.add(BigInteger.valueOf(descriptor.getPostBuffer()*addressableUnitsPerLine));
- bufferEnd = bufferEnd.add(BigInteger.valueOf(descriptor.getNumLines()*addressableUnitsPerLine));
-
- // TODO: should rely on input to tell us what to load
- // instead of having the content adapter override the setting
- if (descriptor.isDynamicLoad())
- {
- if (bufferStart.compareTo(mbStart) < 0)
- bufferStart = mbStart;
-
- if (bufferEnd.compareTo(mbEnd) > 0)
- {
- bufferEnd = mbEnd;
-
- int numLines = bufferEnd.subtract(bufferStart).divide(BigInteger.valueOf(addressableUnitsPerLine)).intValue();
- if (numLines < descriptor.getNumLines())
- {
- // re-calculate buffer start since we may not have enough lines to popoulate the view
- bufferStart = bufferEnd.subtract(BigInteger.valueOf(descriptor.getNumLines()*addressableUnitsPerLine));
- bufferStart = bufferStart.subtract(BigInteger.valueOf(descriptor.getPreBuffer()*addressableUnitsPerLine));
-
- // if after adjusting buffer start, it goes before the memory block start
- // address, adjust it back
- if (bufferStart.compareTo(mbStart) < 0)
- bufferStart = mbStart;
- }
- }
-
- // buffer end must be greater than buffer start
- if (bufferEnd.compareTo(bufferStart) <= 0)
- throw new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.TableRenderingContentProvider_1, null));
-
- int numLines = bufferEnd.subtract(bufferStart).divide(BigInteger.valueOf(addressableUnitsPerLine)).intValue()+1;
- // get stoarage to fit the memory view tab size
- return getMemoryToFitTable(bufferStart, numLines,context);
- }
- else
- {
- if (bufferStart.compareTo(mbStart) < 0)
- bufferStart = mbStart;
-
- if (bufferEnd.compareTo(mbEnd) > 0)
- {
- bufferStart = mbEnd.subtract(BigInteger.valueOf((descriptor.getNumLines()-1)*addressableUnitsPerLine));
- bufferEnd = mbEnd;
-
- // after adjusting buffer start, check if it's smaller than memory block's start address
- if (bufferStart.compareTo(mbStart) < 0)
- bufferStart = mbStart;
- }
-
- // buffer end must be greater than buffer start
- if (bufferEnd.compareTo(bufferStart) <= 0)
- throw new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.TableRenderingContentProvider_2, null));
-
- int numLines = descriptor.getNumLines();
- int bufferNumLines = bufferEnd.subtract(bufferStart).divide(BigInteger.valueOf(addressableUnitsPerLine)).intValue()+1;
-
- if (bufferNumLines < numLines)
- numLines = bufferNumLines;
-
- // get stoarage to fit the memory view tab size
- return getMemoryToFitTable(bufferStart, numLines, context);
- }
- }
- return EMPTY;
- }
-
- /**
- * Get memory to fit table
- * @param startingAddress
- * @param numberOfLines
- * @param updateDelta
- * @throws DebugException
- */
- public Object[] getMemoryToFitTable(BigInteger startAddress, long numberOfLines, MemoryViewPresentationContext context) throws DebugException
- {
- AbstractAsyncTableRendering tableRendering = getTableRendering(context);
- if (tableRendering == null)
- {
- DebugException e = new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.MemoryViewContentProvider_Unable_to_retrieve_content, null));
- throw e;
- }
-
- TableRenderingContentDescriptor descriptor = (TableRenderingContentDescriptor)tableRendering.getAdapter(TableRenderingContentDescriptor.class);
- if(descriptor == null)
- return new Object[0];
-
- // do not ask for memory from memory block if the debug target
- // is already terminated
- IDebugTarget target = descriptor.getMemoryBlock().getDebugTarget();
-
- // check for null target to not calculate and retrieve memory for standard debug model
- if (target != null && (target.isDisconnected() || target.isTerminated()))
- return new Object[0];
-
- boolean error = false;
- DebugException dbgEvt = null;
-
- String adjustedAddress = startAddress.toString(16);
-
- // align to the closest boundary based on addressable size per line
- if (descriptor.isAlignAddressToBoundary() && descriptor.getMemoryBlock() instanceof IMemoryBlockExtension)
- {
- startAddress = MemoryViewUtil.alignToBoundary(startAddress, tableRendering.getAddressableUnitPerLine());
- }
-
- IMemoryBlockExtension extMemoryBlock = null;
- MemoryByte[] memoryBuffer = null;
-
- long reqNumBytes = 0;
- try
- {
-
- if (descriptor.getMemoryBlock() instanceof IMemoryBlockExtension)
- {
- reqNumBytes = tableRendering.getBytesPerLine() * numberOfLines;
- // get memory from memory block
- extMemoryBlock = (IMemoryBlockExtension) descriptor.getMemoryBlock();
-
- long reqNumberOfUnits = tableRendering.getAddressableUnitPerLine() * numberOfLines;
-
- memoryBuffer = extMemoryBlock.getBytesFromAddress(startAddress, reqNumberOfUnits);
-
- if(memoryBuffer == null)
- {
- DebugException e = new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.MemoryViewContentProvider_Unable_to_retrieve_content, null));
- throw e;
- }
- }
- else
- {
- // get memory from memory block
- byte[] memory = descriptor.getMemoryBlock().getBytes();
-
- if (memory == null)
- {
- DebugException e = new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.MemoryViewContentProvider_Unable_to_retrieve_content, null));
- throw e;
- }
-
- int prefillNumBytes = 0;
-
- // number of bytes need to prefill
- if (!startAddress.toString(16).endsWith("0")) //$NON-NLS-1$
- {
- adjustedAddress = startAddress.toString(16).substring(0, adjustedAddress.length() - 1);
- adjustedAddress += "0"; //$NON-NLS-1$
- BigInteger adjustedStart = new BigInteger(adjustedAddress, 16);
- prefillNumBytes = startAddress.subtract(adjustedStart).intValue();
- startAddress = adjustedStart;
- }
- reqNumBytes = descriptor.getMemoryBlock().getLength() + prefillNumBytes;
-
- // figure out number of dummy bytes to append
- while (reqNumBytes % tableRendering.getBytesPerLine() != 0)
- {
- reqNumBytes ++;
- }
-
- numberOfLines = reqNumBytes / tableRendering.getBytesPerLine();
-
- // create memory byte for IMemoryBlock
- memoryBuffer = new MemoryByte[(int)reqNumBytes];
-
- // prefill buffer to ensure double-word alignment
- for (int i=0; i<prefillNumBytes; i++)
- {
- MemoryByte tmp = new MemoryByte();
- tmp.setValue((byte)0);
- tmp.setWritable(false);
- tmp.setReadable(false);
- tmp.setEndianessKnown(false);
- memoryBuffer[i] = tmp;
- }
-
- // fill buffer with memory returned by debug adapter
- int j = prefillNumBytes; // counter for memoryBuffer
- for (int i=0; i<memory.length; i++)
- {
- MemoryByte tmp = new MemoryByte();
- tmp.setValue(memory[i]);
- tmp.setReadable(true);
- tmp.setWritable(true);
- tmp.setEndianessKnown(false);
- memoryBuffer[j] = tmp;
- j++;
- }
-
- // append to buffer to fill up the entire line
- for (int i=j; i<memoryBuffer.length; i++)
- {
- MemoryByte tmp = new MemoryByte();
- tmp.setValue((byte)0);
- tmp.setWritable(false);
- tmp.setReadable(false);
- tmp.setEndianessKnown(false);
- memoryBuffer[i] = tmp;
- }
- }
- }
- catch (DebugException e)
- {
- memoryBuffer = makeDummyContent(numberOfLines, tableRendering.getBytesPerLine());
-
- // finish creating the content provider before throwing an event
- error = true;
- dbgEvt = e;
- }
- catch (Throwable e)
- {
- // catch all errors from this process just to be safe
- memoryBuffer = makeDummyContent(numberOfLines, tableRendering.getBytesPerLine());
-
- // finish creating the content provider before throwing an event
- error = true;
- dbgEvt = new DebugException(DebugUIPlugin.newErrorStatus(e.getMessage(), e));
- }
-
- // if debug adapter did not return enough memory, create dummy memory
- if (memoryBuffer.length < reqNumBytes)
- {
- ArrayList newBuffer = new ArrayList();
-
- for (int i=0; i<memoryBuffer.length; i++)
- {
- newBuffer.add(memoryBuffer[i]);
- }
-
- for (int i=memoryBuffer.length; i<reqNumBytes; i++)
- {
- MemoryByte mb = new MemoryByte();
- mb.setReadable(false);
- mb.setWritable(false);
- mb.setEndianessKnown(false);
- newBuffer.add(mb);
- }
-
- memoryBuffer = (MemoryByte[])newBuffer.toArray(new MemoryByte[newBuffer.size()]);
-
- }
-
- boolean manageDelta = true;
-
- // If change information is not managed by the memory block
- // The view tab will manage it and calculate delta information
- // for its content cache.
- if (descriptor.getMemoryBlock() instanceof IMemoryBlockExtension)
- {
- manageDelta = !((IMemoryBlockExtension)descriptor.getMemoryBlock()).supportsChangeManagement();
- }
-
- if (error){
- throw dbgEvt;
- }
-
- // put memory information into MemoryViewLine
- return organizeLines(numberOfLines, memoryBuffer, startAddress, manageDelta, context);
-
-
- }
-
- private Object[] organizeLines(long numberOfLines, MemoryByte[] memoryBuffer, BigInteger address, boolean manageDelta, MemoryViewPresentationContext context)
- {
- Vector lineCache = new Vector();
- IMemoryRendering rendering = context.getRendering();
- if (!(rendering instanceof AbstractAsyncTableRendering))
- return lineCache.toArray();
-
- AbstractAsyncTableRendering tableRendering = (AbstractAsyncTableRendering)rendering;
- int addressableUnit = tableRendering.getBytesPerLine()/tableRendering.getAddressableSize();
-
- for (int i = 0; i < numberOfLines; i++)
- {
- int bytesPerLine = tableRendering.getBytesPerLine();
- MemoryByte[] memory = new MemoryByte[bytesPerLine];
-
- // counter for memory, starts from 0 to number of bytes per line
- int k = 0;
- // j is the counter for memArray, memory returned by debug adapter
- for (int j = i * bytesPerLine;
- j < i * bytesPerLine + bytesPerLine;
- j++)
- {
-
- byte changeFlag = memoryBuffer[j].getFlags();
- if (manageDelta)
- {
- // turn off both change and known bits to make sure that
- // the change bits returned by debug adapters do not take
- // any effect
-
- changeFlag |= MemoryByte.HISTORY_KNOWN;
- changeFlag ^= MemoryByte.HISTORY_KNOWN;
-
- changeFlag |= MemoryByte.CHANGED;
- changeFlag ^= MemoryByte.CHANGED;
- }
-
- MemoryByte newByteObj = new MemoryByte(memoryBuffer[j].getValue(), changeFlag);
- memory[k] = newByteObj;
- k++;
- }
-
- MemorySegment newLine = new MemorySegment(address, memory, addressableUnit);
- lineCache.add(newLine);
- address = address.add(BigInteger.valueOf(addressableUnit));
- }
- return lineCache.toArray();
- }
-
- /**
- * @param numberOfLines
- * @return an array of dummy MemoryByte
- */
- private MemoryByte[] makeDummyContent(long numberOfLines, int bytesPerLine) {
- MemoryByte[] memoryBuffer;
- // make up dummy memory, needed for recovery in case the debug adapter
- // is capable of retrieving memory again
-
- int numBytes = (int)(bytesPerLine * numberOfLines);
- memoryBuffer = new MemoryByte[numBytes];
-
- for (int i=0; i<memoryBuffer.length; i++){
- memoryBuffer[i] = new MemoryByte();
- memoryBuffer[i].setValue((byte)0);
- memoryBuffer[i].setWritable(false);
- memoryBuffer[i].setReadable(false);
- memoryBuffer[i].setEndianessKnown(false);
- }
- return memoryBuffer;
- }
-
- protected AbstractAsyncTableRendering getTableRendering(MemoryViewPresentationContext context)
- {
- IMemoryRendering memRendering = context.getRendering();
- if (memRendering != null && memRendering instanceof AbstractAsyncTableRendering)
- {
- return (AbstractAsyncTableRendering)memRendering;
- }
- return null;
- }
-}

Back to the top