diff --git a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/build.properties b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/build.properties index 786b1df9364..0041ca9f849 100644 --- a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/build.properties +++ b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/build.properties @@ -1,6 +1,7 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ + plugin.properties,\ .,\ plugin.xml,\ - about.html + about.html \ No newline at end of file diff --git a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/plugin.properties b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/plugin.properties new file mode 100644 index 00000000000..1ce59a6a290 --- /dev/null +++ b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/plugin.properties @@ -0,0 +1,2 @@ +ExportMemoryAction.label=Export +ImportMemoryAction.label=Import \ No newline at end of file diff --git a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/plugin.xml b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/plugin.xml index ff1f06d09a5..60c1b8911b4 100644 --- a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/plugin.xml +++ b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/plugin.xml @@ -27,4 +27,31 @@ + + + + + + + diff --git a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/actions/ExportMemoryAction.java b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/actions/ExportMemoryAction.java new file mode 100644 index 00000000000..f2f58d6ffd6 --- /dev/null +++ b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/actions/ExportMemoryAction.java @@ -0,0 +1,202 @@ +/******************************************************************************* + * Copyright (c) 2007 Wind River Systems, Inc. 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: + * Ted R Williams (Wind River Systems, Inc.) - initial implementation + *******************************************************************************/ + +package org.eclipse.dd.debug.memory.renderings.actions; + +import java.io.File; +import java.io.FileWriter; +import java.math.BigInteger; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +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.DebugUIPlugin; +import org.eclipse.debug.internal.ui.views.memory.MemoryView; +import org.eclipse.debug.internal.ui.views.memory.MemoryViewIdRegistry; +import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.debug.ui.memory.IMemoryRendering; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IViewActionDelegate; +import org.eclipse.ui.IViewPart; + +/** + * Action for exporting memory. + */ +public class ExportMemoryAction implements IViewActionDelegate { + + private MemoryView fView; + + public void init(IViewPart view) { + if (view instanceof MemoryView) + fView = (MemoryView) view; + } + + public void run(IAction action) { + + String secondaryId = MemoryViewIdRegistry + .getUniqueSecondaryId(IDebugUIConstants.ID_MEMORY_VIEW); + + ISelection selection = fView.getSite().getSelectionProvider() + .getSelection(); + if (selection instanceof IStructuredSelection) { + IStructuredSelection strucSel = (IStructuredSelection) selection; + + // return if current selection is empty + if (strucSel.isEmpty()) + return; + + Object obj = strucSel.getFirstElement(); + + if (obj == null) + return; + + IMemoryBlock memBlock = null; + + if (obj instanceof IMemoryRendering) { + memBlock = ((IMemoryRendering) obj).getMemoryBlock(); + } else if (obj instanceof IMemoryBlock) { + memBlock = (IMemoryBlock) obj; + } + + Shell shell = DebugUIPlugin.getShell(); + ExportMemoryDialog dialog = new ExportMemoryDialog(shell, memBlock); + dialog.open(); + + Object results[] = dialog.getResult(); + + if(results != null && results.length == 5) + { + String format = (String) results[0]; + BigInteger start = (BigInteger) results[1]; + BigInteger end = (BigInteger) results[2]; + File file = (File) results[4]; + + if("S-Record".equals(format)) + { + exportSRecord(file, start, end, (IMemoryBlockExtension) memBlock); // FIXME + } + } + } + + } + + private void exportSRecord(final File outputFile, final BigInteger startAddress, final BigInteger endAddress, final IMemoryBlockExtension memblock) + { + Job job = new Job("Memory Export to S-Record File"){ //$NON-NLS-1$ + public IStatus run(IProgressMonitor monitor) { + + try + { + try + { + // FIXME 4 byte default + + BigInteger DATA_PER_RECORD = BigInteger.valueOf(16); + + BigInteger transferAddress = startAddress; + + FileWriter writer = new FileWriter(outputFile); + + BigInteger jobs = endAddress.subtract(transferAddress).divide(DATA_PER_RECORD); + BigInteger factor = BigInteger.ONE; + if(jobs.compareTo(BigInteger.valueOf(0x7FFFFFFF)) > 0) + { + factor = jobs.divide(BigInteger.valueOf(0x7FFFFFFF)); + jobs = jobs.divide(factor); + } + + monitor.beginTask("Transferring Data", jobs.intValue()); + + BigInteger jobCount = BigInteger.ZERO; + while(transferAddress.compareTo(endAddress) < 0) + { + BigInteger length = DATA_PER_RECORD; + if(endAddress.subtract(transferAddress).compareTo(length) < 0) + length = endAddress.subtract(transferAddress); + + writer.write("S3"); // FIXME 4 byte address + + StringBuffer buf = new StringBuffer(); + + BigInteger sRecordLength = BigInteger.valueOf(4); // address size + sRecordLength = sRecordLength.add(length); + sRecordLength = sRecordLength.add(BigInteger.ONE); // checksum + + String transferAddressString = transferAddress.toString(16); + + String lengthString = sRecordLength.toString(16); + if(lengthString.length() == 1) + buf.append("0"); + buf.append(lengthString); + for(int i = 0; i < 8 - transferAddressString.length(); i++) + buf.append("0"); + buf.append(transferAddressString); + + // data + + MemoryByte bytes[] = memblock.getBytesFromAddress(transferAddress, + length.longValue() / memblock.getAddressableSize()); + for(MemoryByte b : bytes) + { + String bString = BigInteger.valueOf(0xFF & b.getValue()).toString(16); + if(bString.length() == 1) + buf.append("0"); + buf.append(bString); + } + + BigInteger checksum = BigInteger.ZERO; + + for(int i = 0; i < buf.length(); i+=2) + { + BigInteger value = new BigInteger(buf.substring(i, i+1), 16); + checksum = checksum.add(value); + } + + buf.append(BigInteger.valueOf(0xFF - checksum.byteValue()).and( + BigInteger.valueOf(0xFF)).toString(16)); + + writer.write(buf.toString().toUpperCase()); + writer.write("\n"); + + transferAddress = transferAddress.add(length); + + jobCount = jobCount.add(BigInteger.ONE); + if(jobCount.compareTo(factor) == 0) + { + jobCount = BigInteger.ZERO; + monitor.worked(1); + } + } + + writer.close(); + monitor.done(); + } + catch(Exception e) { e.printStackTrace();} + } + catch(Exception e) {e.printStackTrace();} + return Status.OK_STATUS; + }}; + job.setUser(true); + job.schedule(); + } + + public void selectionChanged(IAction action, ISelection selection) { + + } + +} diff --git a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/actions/ExportMemoryDialog.java b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/actions/ExportMemoryDialog.java new file mode 100644 index 00000000000..f11b1eb6b41 --- /dev/null +++ b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/actions/ExportMemoryDialog.java @@ -0,0 +1,389 @@ +package org.eclipse.dd.debug.memory.renderings.actions; + +import java.io.File; +import java.math.BigInteger; + +import org.eclipse.debug.core.model.IMemoryBlock; +import org.eclipse.debug.core.model.IMemoryBlockExtension; +import org.eclipse.debug.internal.ui.DebugUIPlugin; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.events.VerifyEvent; +import org.eclipse.swt.events.VerifyListener; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.dialogs.SelectionDialog; + +public class ExportMemoryDialog extends SelectionDialog +{ + + private Combo formatCombo; + + private IMemoryBlock fMemoryBlock; + + private Text startText; + private Text endText; + private Text lengthText; + private Text fileText; + + public ExportMemoryDialog(Shell parent, IMemoryBlock memoryBlock) + { + super(parent); + super.setTitle("Export Memory"); + setShellStyle(getShellStyle() | SWT.RESIZE); + + fMemoryBlock = memoryBlock; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) + */ + protected void createButtonsForButtonBar(Composite parent) { + super.createButtonsForButtonBar(parent); + validate(); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.dialogs.SelectionDialog#getResult() + */ + public Object[] getResult() { + + Object[] results = super.getResult(); + + if (results != null) + { + return results; + } + return new Object[0]; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#cancelPressed() + */ + protected void cancelPressed() { + + setResult(null); + + super.cancelPressed(); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#okPressed() + */ + protected void okPressed() { + setSelectionResult(new Object[]{ getFormat(), getStartAddress(), getEndAddress(), getLength(), getFile() }); + + super.okPressed(); + } + + public String getFormat() + { + return formatCombo.getItem(formatCombo.getSelectionIndex()); + } + + public BigInteger getEndAddress() + { + String text = endText.getText(); + boolean hex = text.startsWith("0x"); + BigInteger endAddress = new BigInteger(hex ? text.substring(2) : text, + hex ? 16 : 10); + + return endAddress; + } + + public BigInteger getStartAddress() + { + String text = startText.getText(); + boolean hex = text.startsWith("0x"); + BigInteger startAddress = new BigInteger(hex ? text.substring(2) : text, + hex ? 16 : 10); + + return startAddress; + } + + public BigInteger getLength() + { + String text = lengthText.getText(); + boolean hex = text.startsWith("0x"); + BigInteger lengthAddress = new BigInteger(hex ? text.substring(2) : text, + hex ? 16 : 10); + + return lengthAddress; + } + + public File getFile() + { + return new File(fileText.getText()); + } + + private void validate() + { + boolean isValid = true; + + try + { + getEndAddress(); + + getStartAddress(); + + BigInteger length = getLength(); + + if(length.compareTo(BigInteger.ZERO) <= 0) + isValid = false; + + if(!getFile().getParentFile().exists()) + isValid = false; + } + catch(Exception e) + { + isValid = false; + } + + getButton(IDialogConstants.OK_ID).setEnabled(isValid); + + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) + */ + protected Control createDialogArea(Composite parent) { + + PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, DebugUIPlugin.getUniqueIdentifier() + ".AddMemoryRenderingDialog_context"); //$NON-NLS-1$ // FIXME + Composite composite = new Composite(parent, SWT.NONE); + FormLayout formLayout = new FormLayout(); + formLayout.spacing = 5; + formLayout.marginWidth = formLayout.marginHeight = 9; + composite.setLayout(formLayout); + + // format + + Label textLabel = new Label(composite, SWT.NONE); + textLabel.setText("Format: "); + + formatCombo = new Combo(composite, SWT.BORDER | SWT.READ_ONLY); + + FormData data = new FormData(); + data.top = new FormAttachment(formatCombo, 0, SWT.CENTER); + textLabel.setLayoutData(data); + + data = new FormData(); + data.left = new FormAttachment(textLabel); + formatCombo.setLayoutData(data); + formatCombo.setItems( new String[] { "S-Record" }); // TODO offer extension point + formatCombo.select(0); + + // start address + + Label startLabel = new Label(composite, SWT.NONE); + startLabel.setText("Start address: "); + data = new FormData(); + data.top = new FormAttachment(formatCombo); + startLabel.setLayoutData(data); + + startText = new Text(composite, SWT.NONE); + data = new FormData(); + data.top = new FormAttachment(formatCombo); + data.left = new FormAttachment(startLabel); + data.width = 100; + startText.setLayoutData(data); + + // end address + + Label endLabel = new Label(composite, SWT.NONE); + endLabel.setText("End address: "); + data = new FormData(); + data.top = new FormAttachment(startText, 0, SWT.CENTER); + data.left = new FormAttachment(startText); + endLabel.setLayoutData(data); + + endText = new Text(composite, SWT.NONE); + data = new FormData(); + data.top = new FormAttachment(startText, 0, SWT.CENTER); + data.left = new FormAttachment(endLabel); + data.width = 100; + endText.setLayoutData(data); + + // length + + Label lengthLabel = new Label(composite, SWT.NONE); + lengthLabel.setText("Length: "); + data = new FormData(); + data.top = new FormAttachment(startText, 0, SWT.CENTER); + data.left = new FormAttachment(endText); + lengthLabel.setLayoutData(data); + + lengthText = new Text(composite, SWT.NONE); + data = new FormData(); + data.top = new FormAttachment(startText, 0, SWT.CENTER); + data.left = new FormAttachment(lengthLabel); + data.width = 100; + lengthText.setLayoutData(data); + + // file + + Label fileLabel = new Label(composite, SWT.NONE); + fileText = new Text(composite, SWT.NONE); + Button fileButton = new Button(composite, SWT.PUSH); + + fileLabel.setText("File name: "); + data = new FormData(); + data.top = new FormAttachment(fileButton, 0, SWT.CENTER); + fileLabel.setLayoutData(data); + + data = new FormData(); + data.top = new FormAttachment(fileButton, 0, SWT.CENTER); + data.left = new FormAttachment(fileLabel); + data.width = 300; + fileText.setLayoutData(data); + + fileButton.setText("Browse..."); + data = new FormData(); + data.top = new FormAttachment(lengthText); + data.left = new FormAttachment(fileText); + fileButton.setLayoutData(data); + + try + { + BigInteger startAddress = null; + if(fMemoryBlock instanceof IMemoryBlockExtension) + startAddress = ((IMemoryBlockExtension) fMemoryBlock) + .getBigBaseAddress(); // FIXME use selection/caret address? + else + startAddress = BigInteger.valueOf(fMemoryBlock.getStartAddress()); + + startText.setText("0x" + startAddress.toString(16)); + endText.setText("0x" + startAddress.toString(16)); + lengthText.setText("0"); + } + catch(Exception e) + { + e.printStackTrace(); + // TODO + } + + fileButton.addSelectionListener(new SelectionListener() { + + public void widgetDefaultSelected(SelectionEvent e) { + // TODO Auto-generated method stub + + } + + public void widgetSelected(SelectionEvent e) { + FileDialog dialog = new FileDialog(ExportMemoryDialog.this.getShell(), SWT.SAVE); + dialog.setText("Choose memory export file"); + dialog.setFilterExtensions(new String[] { "*.*" } ); + dialog.setFilterNames(new String[] { "All Files (*.*)" } ); + dialog.setFileName(fileText.getText()); + dialog.open(); + + if(dialog.getFileName() != null) + { + fileText.setText(dialog.getFilterPath() + File.separator + dialog.getFileName()); + } + + validate(); + } + + }); + + startText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + boolean valid = true; + try + { + getStartAddress(); + } + catch(Exception ex) + { + valid = false; + } + + startText.setForeground(valid ? Display.getDefault().getSystemColor(SWT.COLOR_BLACK) : + Display.getDefault().getSystemColor(SWT.COLOR_RED)); + + // + + BigInteger endAddress = getEndAddress(); + BigInteger startAddress = getStartAddress(); + + lengthText.setText(endAddress.subtract(startAddress).toString()); + + validate(); + } + + }); + + endText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + try + { + getEndAddress(); + endText.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK)); + + BigInteger endAddress = getEndAddress(); + BigInteger startAddress = getStartAddress(); + + String lengthString = endAddress.subtract(startAddress).toString(); + + if(!lengthText.getText().equals(lengthString)) + lengthText.setText(lengthString); + } + catch(Exception ex) + { + endText.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED)); + } + + validate(); + } + + }); + + lengthText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + try + { + BigInteger length = getLength(); + lengthText.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK)); + BigInteger startAddress = getStartAddress(); + String endString = "0x" + startAddress.add(length).toString(16); + if(!endText.getText().equals(endString)) + endText.setText(endString); + } + catch(Exception ex) + { + lengthText.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED)); + } + + validate(); + } + + }); + + fileText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + validate(); + } + }); + + return composite; + } + + +} diff --git a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/actions/ImportMemoryAction.java b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/actions/ImportMemoryAction.java new file mode 100644 index 00000000000..7475c234e91 --- /dev/null +++ b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/actions/ImportMemoryAction.java @@ -0,0 +1,194 @@ +/******************************************************************************* + * Copyright (c) 2007 Wind River Systems, Inc. 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: + * Ted R Williams (Wind River Systems, Inc.) - initial implementation + *******************************************************************************/ + +package org.eclipse.dd.debug.memory.renderings.actions; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.math.BigInteger; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +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.DebugUIPlugin; +import org.eclipse.debug.internal.ui.views.memory.MemoryView; +import org.eclipse.debug.internal.ui.views.memory.MemoryViewIdRegistry; +import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.debug.ui.memory.IMemoryRendering; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IViewActionDelegate; +import org.eclipse.ui.IViewPart; + +/** + * Action for downloading memory. + */ +public class ImportMemoryAction implements IViewActionDelegate { + + + private MemoryView fView; + + public void init(IViewPart view) { + if (view instanceof MemoryView) + fView = (MemoryView) view; + } + + public void run(IAction action) { + + String secondaryId = MemoryViewIdRegistry + .getUniqueSecondaryId(IDebugUIConstants.ID_MEMORY_VIEW); + + ISelection selection = fView.getSite().getSelectionProvider() + .getSelection(); + if (selection instanceof IStructuredSelection) { + IStructuredSelection strucSel = (IStructuredSelection) selection; + + // return if current selection is empty + if (strucSel.isEmpty()) + return; + + Object obj = strucSel.getFirstElement(); + + if (obj == null) + return; + + IMemoryBlock memBlock = null; + + if (obj instanceof IMemoryRendering) { + memBlock = ((IMemoryRendering) obj).getMemoryBlock(); + } else if (obj instanceof IMemoryBlock) { + memBlock = (IMemoryBlock) obj; + } + + Shell shell = DebugUIPlugin.getShell(); + ImportMemoryDialog dialog = new ImportMemoryDialog(shell, memBlock); + dialog.open(); + + Object results[] = dialog.getResult(); + + if(results != null && results.length == 4) + { + String format = (String) results[0]; + Boolean useCustomAddress = (Boolean) results[1]; + BigInteger start = (BigInteger) results[2]; + File file = (File) results[3]; + + if("S-Record".equals(format)) + { + downloadSRecord(file, start, useCustomAddress.booleanValue(), (IMemoryBlockExtension) memBlock); // FIXME + } + } + } + + } + + private void downloadSRecord(final File inputFile, final BigInteger startAddress, final boolean useCustomAddress, final IMemoryBlockExtension memblock) + { + Job job = new Job("Memory Download from S-Record File"){ //$NON-NLS-1$ + public IStatus run(IProgressMonitor monitor) { + + try + { + try + { + // FIXME 4 byte default + + final int CHECKSUM_LENGTH = 1; + + BigInteger offset = null; + if(!useCustomAddress) + offset = BigInteger.ZERO; + + BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile))); + + BigInteger jobs = BigInteger.valueOf(inputFile.length()); + BigInteger factor = BigInteger.ONE; + if(jobs.compareTo(BigInteger.valueOf(0x7FFFFFFF)) > 0) + { + factor = jobs.divide(BigInteger.valueOf(0x7FFFFFFF)); + jobs = jobs.divide(factor); + } + + monitor.beginTask("Transferring Data", jobs.intValue()); + + BigInteger jobCount = BigInteger.ZERO; + String line = reader.readLine(); + while(line != null) + { + String recordType = line.substring(0, 2); + int recordCount = Integer.parseInt(line.substring(2, 4), 16); + int bytesRead = 4 + recordCount; + int position = 4; + int addressSize = 0; + + BigInteger recordAddress = null; + + if("S3".equals(recordType)) + addressSize = 4; + else if("S1".equals(recordType)) + addressSize = 2; + else if("S2".equals(recordType)) + addressSize = 3; + + recordAddress = new BigInteger(line.substring(position, position + addressSize * 2), 16); + recordCount -= addressSize; + position += addressSize * 2; + + if(offset == null) + offset = startAddress.subtract(recordAddress); + + recordAddress = recordAddress.add(offset); + + byte data[] = new byte[recordCount - CHECKSUM_LENGTH]; + for(int i = 0; i < data.length; i++) + { + data[i] = new BigInteger(line.substring(position++, position++ + 1), 16).byteValue(); + } + + // FIXME error on incorrect checksum + + memblock.setValue(recordAddress.subtract(memblock.getBigBaseAddress()), data); + + jobCount = jobCount.add(BigInteger.valueOf(bytesRead)); + while(jobCount.compareTo(factor) >= 0) + { + jobCount = jobCount.subtract(factor); + monitor.worked(1); + } + + line = reader.readLine(); + } + + reader.close(); + monitor.done(); + } + catch(Exception e) { e.printStackTrace();} + } + catch(Exception e) {e.printStackTrace();} + return Status.OK_STATUS; + }}; + job.setUser(true); + job.schedule(); + } + + public void selectionChanged(IAction action, ISelection selection) { + + } + +} diff --git a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/actions/ImportMemoryDialog.java b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/actions/ImportMemoryDialog.java new file mode 100644 index 00000000000..19cbd33ac79 --- /dev/null +++ b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/actions/ImportMemoryDialog.java @@ -0,0 +1,283 @@ +package org.eclipse.dd.debug.memory.renderings.actions; + +import java.io.File; +import java.math.BigInteger; + +import javax.swing.ButtonGroup; + +import org.eclipse.debug.core.model.IMemoryBlock; +import org.eclipse.debug.core.model.IMemoryBlockExtension; +import org.eclipse.debug.internal.ui.DebugUIPlugin; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.dialogs.SelectionDialog; + +public class ImportMemoryDialog extends SelectionDialog +{ + + private Combo formatCombo; + + private IMemoryBlock fMemoryBlock; + + private Text startText; + private Text fileText; + + private Button comboRestoreToThisAddress; + private Button comboRestoreToFileAddress; + + public ImportMemoryDialog(Shell parent, IMemoryBlock memoryBlock) + { + super(parent); + super.setTitle("Download to Memory"); + setShellStyle(getShellStyle() | SWT.RESIZE); + + fMemoryBlock = memoryBlock; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) + */ + protected void createButtonsForButtonBar(Composite parent) { + super.createButtonsForButtonBar(parent); + validate(); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.dialogs.SelectionDialog#getResult() + */ + public Object[] getResult() { + + Object[] results = super.getResult(); + + if (results != null) + { + return results; + } + return new Object[0]; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#cancelPressed() + */ + protected void cancelPressed() { + + setResult(null); + + super.cancelPressed(); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#okPressed() + */ + protected void okPressed() { + setSelectionResult(new Object[]{ getFormat(), new Boolean(comboRestoreToThisAddress.getSelection()), + getStartAddress(), getFile() }); + + super.okPressed(); + } + + public String getFormat() + { + return formatCombo.getItem(formatCombo.getSelectionIndex()); + } + + public BigInteger getStartAddress() + { + String text = startText.getText(); + boolean hex = text.startsWith("0x"); + BigInteger startAddress = new BigInteger(hex ? text.substring(2) : text, + hex ? 16 : 10); + + return startAddress; + } + + public File getFile() + { + return new File(fileText.getText()); + } + + private void validate() + { + boolean isValid = true; + + try + { + getStartAddress(); + } + catch(Exception e) + { + isValid = false; + } + + getButton(IDialogConstants.OK_ID).setEnabled(isValid); + + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) + */ + protected Control createDialogArea(Composite parent) { + + PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, DebugUIPlugin.getUniqueIdentifier() + ".AddMemoryRenderingDialog_context"); //$NON-NLS-1$ // FIXME + Composite composite = new Composite(parent, SWT.NONE); + FormLayout formLayout = new FormLayout(); + formLayout.spacing = 5; + formLayout.marginWidth = formLayout.marginHeight = 9; + composite.setLayout(formLayout); + + // format + + Label textLabel = new Label(composite, SWT.NONE); + textLabel.setText("Format: "); + + formatCombo = new Combo(composite, SWT.BORDER | SWT.READ_ONLY); + + FormData data = new FormData(); + data.top = new FormAttachment(formatCombo, 0, SWT.CENTER); + textLabel.setLayoutData(data); + + data = new FormData(); + data.left = new FormAttachment(textLabel); + formatCombo.setLayoutData(data); + formatCombo.setItems( new String[] { "S-Record" }); // TODO offer extension point + formatCombo.select(0); + + // restore to file address + + comboRestoreToFileAddress = new Button(composite, SWT.RADIO); + comboRestoreToFileAddress.setText("Restore to address specified in the file"); + data = new FormData(); + data.top = new FormAttachment(formatCombo); + comboRestoreToFileAddress.setLayoutData(data); + + // restore to this address + + comboRestoreToThisAddress = new Button(composite, SWT.RADIO); + comboRestoreToThisAddress.setText("Restore to this address: "); + data = new FormData(); + data.top = new FormAttachment(comboRestoreToFileAddress); + comboRestoreToThisAddress.setLayoutData(data); + + startText = new Text(composite, SWT.NONE); + data = new FormData(); + data.top = new FormAttachment(comboRestoreToFileAddress); + data.left = new FormAttachment(comboRestoreToThisAddress); + data.width = 100; + startText.setLayoutData(data); + + // file + + Label fileLabel = new Label(composite, SWT.NONE); + fileText = new Text(composite, SWT.NONE); + Button fileButton = new Button(composite, SWT.PUSH); + + fileLabel.setText("File name: "); + data = new FormData(); + data.top = new FormAttachment(fileButton, 0, SWT.CENTER); + fileLabel.setLayoutData(data); + + data = new FormData(); + data.top = new FormAttachment(fileButton, 0, SWT.CENTER); + data.left = new FormAttachment(fileLabel); + data.width = 300; + fileText.setLayoutData(data); + + fileButton.setText("Browse..."); + data = new FormData(); + data.top = new FormAttachment(startText); + data.left = new FormAttachment(fileText); + fileButton.setLayoutData(data); + + try + { + BigInteger startAddress = null; + if(fMemoryBlock instanceof IMemoryBlockExtension) + startAddress = ((IMemoryBlockExtension) fMemoryBlock) + .getBigBaseAddress(); // FIXME use selection/caret address? + else + startAddress = BigInteger.valueOf(fMemoryBlock.getStartAddress()); + + startText.setText("0x" + startAddress.toString(16)); + } + catch(Exception e) + { + e.printStackTrace(); + // TODO + } + + fileButton.addSelectionListener(new SelectionListener() { + + public void widgetDefaultSelected(SelectionEvent e) { + // TODO Auto-generated method stub + + } + + public void widgetSelected(SelectionEvent e) { + FileDialog dialog = new FileDialog(ImportMemoryDialog.this.getShell(), SWT.SAVE); + dialog.setText("Choose memory export file"); + dialog.setFilterExtensions(new String[] { "*.*" } ); + dialog.setFilterNames(new String[] { "All Files (*.*)" } ); + dialog.setFileName(fileText.getText()); + dialog.open(); + + if(dialog.getFileName() != null) + { + fileText.setText(dialog.getFilterPath() + File.separator + dialog.getFileName()); + } + + validate(); + } + + }); + + startText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + boolean valid = true; + try + { + getStartAddress(); + } + catch(Exception ex) + { + valid = false; + } + + startText.setForeground(valid ? Display.getDefault().getSystemColor(SWT.COLOR_BLACK) : + Display.getDefault().getSystemColor(SWT.COLOR_RED)); + + // + + BigInteger startAddress = getStartAddress(); + + validate(); + } + + }); + fileText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + validate(); + } + }); + + return composite; + } + + +}