mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
GP-2076 domain object event refactor
This commit is contained in:
parent
daca354c47
commit
856aa904aa
143 changed files with 3621 additions and 3652 deletions
|
@ -124,7 +124,7 @@ public class DomainObjectEventQueues {
|
|||
this.eventsEnabled = eventsEnabled;
|
||||
if (eventsEnabled) {
|
||||
DomainObjectChangeRecord restored =
|
||||
new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED);
|
||||
new DomainObjectChangeRecord(DomainObjectEvent.RESTORED);
|
||||
eventQueue.fireEvent(restored);
|
||||
for (PrivateQueue privateQueue : privateEventQueues.values()) {
|
||||
privateQueue.fireEvent(restored);
|
||||
|
|
|
@ -54,9 +54,9 @@ public class DBTraceObjectBreakpointSpec
|
|||
this.object = object;
|
||||
TargetObjectSchema schema = object.getTargetSchema();
|
||||
synchronized (KEYS_BY_SCHEMA) {
|
||||
keys = KEYS_BY_SCHEMA.computeIfAbsent(schema, s -> Set.of(
|
||||
schema.checkAliasedAttribute(TargetBreakpointSpec.KINDS_ATTRIBUTE_NAME),
|
||||
schema.checkAliasedAttribute(TargetTogglable.ENABLED_ATTRIBUTE_NAME)));
|
||||
keys = KEYS_BY_SCHEMA.computeIfAbsent(schema,
|
||||
s -> Set.of(schema.checkAliasedAttribute(TargetBreakpointSpec.KINDS_ATTRIBUTE_NAME),
|
||||
schema.checkAliasedAttribute(TargetTogglable.ENABLED_ATTRIBUTE_NAME)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -234,14 +234,16 @@ public class DBTraceObjectBreakpointSpec
|
|||
@Override
|
||||
public Collection<? extends TraceObjectBreakpointLocation> getLocations() {
|
||||
try (LockHold hold = object.getTrace().lockRead()) {
|
||||
return object.querySuccessorsInterface(getLifespan(),
|
||||
TraceObjectBreakpointLocation.class, true).collect(Collectors.toSet());
|
||||
return object
|
||||
.querySuccessorsInterface(getLifespan(), TraceObjectBreakpointLocation.class,
|
||||
true)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TraceChangeRecord<?, ?> translateEvent(TraceChangeRecord<?, ?> rec) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.VALUE_CREATED.getType()) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.VALUE_CREATED.getEventType()) {
|
||||
TraceChangeRecord<TraceObjectValue, Void> cast =
|
||||
TraceObjectChangeType.VALUE_CREATED.cast(rec);
|
||||
TraceObjectValue affected = cast.getAffectedObject();
|
||||
|
|
|
@ -43,8 +43,7 @@ import ghidra.program.model.reloc.RelocationTable;
|
|||
import ghidra.program.model.symbol.*;
|
||||
import ghidra.program.model.util.AddressSetPropertyMap;
|
||||
import ghidra.program.model.util.PropertyMapManager;
|
||||
import ghidra.program.util.ChangeManager;
|
||||
import ghidra.program.util.ProgramChangeRecord;
|
||||
import ghidra.program.util.*;
|
||||
import ghidra.trace.database.*;
|
||||
import ghidra.trace.database.listing.DBTraceCodeSpace;
|
||||
import ghidra.trace.database.listing.DBTraceDefinedUnitsView;
|
||||
|
@ -86,12 +85,12 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
protected class EventTranslator extends TypedEventDispatcher
|
||||
implements DBTraceDirectChangeListener {
|
||||
public EventTranslator() {
|
||||
listenForUntyped(DomainObject.DO_OBJECT_SAVED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObject.DO_DOMAIN_FILE_CHANGED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RENAMED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, this::objectRestored);
|
||||
listenForUntyped(DomainObject.DO_OBJECT_CLOSED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObject.DO_OBJECT_ERROR, this::eventPassthrough);
|
||||
listenForUntyped(DomainObjectEvent.SAVED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObjectEvent.FILE_CHANGED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObjectEvent.RENAMED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, this::objectRestored);
|
||||
listenForUntyped(DomainObjectEvent.CLOSED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObjectEvent.ERROR, this::eventPassthrough);
|
||||
|
||||
listenFor(TraceBookmarkChangeType.TYPE_ADDED, this::bookmarkTypeAdded);
|
||||
listenFor(TraceBookmarkChangeType.ADDED, this::bookmarkAdded);
|
||||
|
@ -175,8 +174,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
}
|
||||
|
||||
private void bookmarkTypeAdded(TraceBookmarkType type) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_BOOKMARK_TYPE_ADDED, null,
|
||||
null, type, null, null));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.BOOKMARK_TYPE_ADDED, null, null,
|
||||
type, null, null));
|
||||
}
|
||||
|
||||
private void bookmarkAdded(TraceAddressSpace space, TraceBookmark bm) {
|
||||
|
@ -188,8 +187,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
}
|
||||
|
||||
protected void fireBookmarkAdded(DomainObjectEventQueues queues, TraceBookmark bm) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_BOOKMARK_ADDED,
|
||||
bm.getAddress(), bm.getAddress(), bm, null, null));
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.BOOKMARK_ADDED, bm.getAddress(),
|
||||
bm.getAddress(), bm, null, null));
|
||||
}
|
||||
|
||||
private void bookmarkChanged(TraceAddressSpace space, TraceBookmark bm) {
|
||||
|
@ -201,8 +200,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
}
|
||||
|
||||
protected void fireBookmarkChanged(DomainObjectEventQueues queues, TraceBookmark bm) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_BOOKMARK_CHANGED,
|
||||
bm.getAddress(), bm.getAddress(), bm, null, null));
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.BOOKMARK_CHANGED, bm.getAddress(),
|
||||
bm.getAddress(), bm, null, null));
|
||||
}
|
||||
|
||||
private void bookmarkLifespanChanged(TraceAddressSpace space, TraceBookmark bm,
|
||||
|
@ -230,30 +229,30 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
}
|
||||
|
||||
protected void fireBookmarkRemoved(DomainObjectEventQueues queues, TraceBookmark bm) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_BOOKMARK_REMOVED,
|
||||
bm.getAddress(), bm.getAddress(), bm, null, null));
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.BOOKMARK_REMOVED, bm.getAddress(),
|
||||
bm.getAddress(), bm, null, null));
|
||||
}
|
||||
|
||||
private void categoryAdded(long id, Category oldIsNull, Category added) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_CATEGORY_ADDED, null, null,
|
||||
null, oldIsNull, added));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_CATEGORY_ADDED, null,
|
||||
null, null, oldIsNull, added));
|
||||
}
|
||||
|
||||
private void categoryMoved(long id, CategoryPath oldPath, CategoryPath newPath) {
|
||||
Category category = getDataTypeManager().getCategory(id);
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_CATEGORY_MOVED, null, null,
|
||||
null, oldPath, category));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_CATEGORY_MOVED, null,
|
||||
null, null, oldPath, category));
|
||||
}
|
||||
|
||||
private void categoryRenamed(long id, String oldName, String newName) {
|
||||
Category category = getDataTypeManager().getCategory(id);
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_CATEGORY_RENAMED, null,
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_CATEGORY_RENAMED, null,
|
||||
null, null, oldName, category));
|
||||
}
|
||||
|
||||
private void categoryDeleted(long id, CategoryPath deleted, CategoryPath newIsNull) {
|
||||
Category parent = getDataTypeManager().getCategory(deleted.getParent());
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_CATEGORY_REMOVED, null,
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_CATEGORY_REMOVED, null,
|
||||
null, null, parent, deleted.getName()));
|
||||
}
|
||||
|
||||
|
@ -271,7 +270,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
|
||||
protected void fireCodeAdded(DomainObjectEventQueues queues, Address min, Address max) {
|
||||
queues.fireEvent(
|
||||
new ProgramChangeRecord(ChangeManager.DOCR_CODE_ADDED, min, max, null, null, null));
|
||||
new ProgramChangeRecord(ProgramEvent.CODE_ADDED, min, max, null, null, null));
|
||||
}
|
||||
|
||||
private void codeLifespanChanged(TraceAddressSpace space, TraceCodeUnit unit,
|
||||
|
@ -302,8 +301,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
|
||||
protected void fireCodeRemoved(DomainObjectEventQueues queues, Address min, Address max,
|
||||
TraceCodeUnit removed) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_CODE_REMOVED, min, max,
|
||||
null, removed, null));
|
||||
queues.fireEvent(
|
||||
new ProgramChangeRecord(ProgramEvent.CODE_REMOVED, min, max, null, removed, null));
|
||||
}
|
||||
|
||||
private void codeFragmentChanged(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
|
@ -312,7 +311,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_CODE_MOVED, null, null,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.FRAGMENT_CHANGED, null, null,
|
||||
null, range.getX1(), range.getX2()));
|
||||
}
|
||||
|
||||
|
@ -323,8 +322,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_REPLACED,
|
||||
range.getX1(), range.getX2(), null, null, null));
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_REPLACED, range.getX1(),
|
||||
range.getX2(), null, null, null));
|
||||
}
|
||||
|
||||
private void codeDataTypeSettingsChanged(TraceAddressSpace space,
|
||||
|
@ -334,49 +333,44 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
return;
|
||||
}
|
||||
// Yes, x1 twice
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_SETTING_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_SETTING_CHANGED,
|
||||
range.getX1(), range.getX1(), null, null, null));
|
||||
}
|
||||
|
||||
private void commentChanged(int docrType, TraceAddressSpace space,
|
||||
private void commentChanged(int commentType, TraceAddressSpace space,
|
||||
TraceAddressSnapRange range, String oldValue, String newValue) {
|
||||
DomainObjectEventQueues queues = isVisible(space, range);
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(docrType, range.getX1(), range.getX2(), null,
|
||||
oldValue, newValue));
|
||||
queues.fireEvent(
|
||||
new CommentChangeRecord(commentType, range.getX1(), oldValue, newValue));
|
||||
}
|
||||
|
||||
private void commentEolChanged(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
String oldValue, String newValue) {
|
||||
commentChanged(ChangeManager.DOCR_EOL_COMMENT_CHANGED, space, range, oldValue,
|
||||
newValue);
|
||||
commentChanged(CodeUnit.EOL_COMMENT, space, range, oldValue, newValue);
|
||||
}
|
||||
|
||||
private void commentPlateChanged(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
String oldValue, String newValue) {
|
||||
commentChanged(ChangeManager.DOCR_PLATE_COMMENT_CHANGED, space, range, oldValue,
|
||||
newValue);
|
||||
commentChanged(CodeUnit.PLATE_COMMENT, space, range, oldValue, newValue);
|
||||
}
|
||||
|
||||
private void commentPostChanged(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
String oldValue, String newValue) {
|
||||
commentChanged(ChangeManager.DOCR_POST_COMMENT_CHANGED, space, range, oldValue,
|
||||
newValue);
|
||||
commentChanged(CodeUnit.POST_COMMENT, space, range, oldValue, newValue);
|
||||
}
|
||||
|
||||
private void commentPreChanged(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
String oldValue, String newValue) {
|
||||
commentChanged(ChangeManager.DOCR_PRE_COMMENT_CHANGED, space, range, oldValue,
|
||||
newValue);
|
||||
commentChanged(CodeUnit.PRE_COMMENT, space, range, oldValue, newValue);
|
||||
}
|
||||
|
||||
private void commentRepeatableChanged(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
String oldValue, String newValue) {
|
||||
// TODO: The "repeatable" semantics are not implemented, yet.
|
||||
commentChanged(ChangeManager.DOCR_REPEATABLE_COMMENT_CHANGED, space, range, oldValue,
|
||||
newValue);
|
||||
commentChanged(CodeUnit.REPEATABLE_COMMENT, space, range, oldValue, newValue);
|
||||
}
|
||||
|
||||
private void compositeDataAdded(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
|
@ -385,7 +379,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_COMPOSITE_ADDED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.COMPOSITE_ADDED,
|
||||
added.getMinAddress(), added.getMaxAddress(), null, null, added));
|
||||
}
|
||||
|
||||
|
@ -398,11 +392,11 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
boolean inOld = isCodeVisible(data, oldSpan);
|
||||
boolean inNew = isCodeVisible(data, newSpan);
|
||||
if (inOld && !inNew) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_COMPOSITE_REMOVED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.COMPOSITE_REMOVED,
|
||||
data.getMinAddress(), data.getMaxAddress(), null, data, null));
|
||||
}
|
||||
if (!inOld && inNew) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_COMPOSITE_ADDED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.COMPOSITE_ADDED,
|
||||
data.getMinAddress(), data.getMaxAddress(), null, null, data));
|
||||
}
|
||||
}
|
||||
|
@ -414,42 +408,42 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
return;
|
||||
}
|
||||
// TODO: ProgramDB doesn't send this.... Should I?
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_COMPOSITE_REMOVED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.COMPOSITE_REMOVED,
|
||||
removed.getMinAddress(), removed.getMaxAddress(), null, removed, null));
|
||||
}
|
||||
|
||||
private void dataTypeAdded(long id, DataType oldIsNull, DataType added) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_ADDED, null,
|
||||
null, null, oldIsNull, added));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_ADDED, null, null,
|
||||
null, oldIsNull, added));
|
||||
}
|
||||
|
||||
private void dataTypeChanged(long id, DataType oldIsNull, DataType changed) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_CHANGED, null,
|
||||
null, null, oldIsNull, changed));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_CHANGED, null, null,
|
||||
null, oldIsNull, changed));
|
||||
}
|
||||
|
||||
private void dataTypeReplaced(long id, DataTypePath oldPath, DataTypePath newPath) {
|
||||
DataType newType = getDataTypeManager().getDataType(id);
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_REPLACED, null,
|
||||
null, null, newPath, newType));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_REPLACED, null, null,
|
||||
null, newPath, newType));
|
||||
}
|
||||
|
||||
private void dataTypeMoved(long id, DataTypePath oldPath, DataTypePath newPath) {
|
||||
Category oldCategory = getDataTypeManager().getCategory(oldPath.getCategoryPath());
|
||||
DataType dataType = getDataTypeManager().getDataType(id);
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_MOVED, null,
|
||||
null, null, oldCategory, dataType));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_MOVED, null, null,
|
||||
null, oldCategory, dataType));
|
||||
}
|
||||
|
||||
private void dataTypeRenamed(long id, String oldName, String newName) {
|
||||
DataType dataType = getDataTypeManager().getDataType(id);
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_RENAMED, null,
|
||||
null, null, oldName, dataType));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_RENAMED, null, null,
|
||||
null, oldName, dataType));
|
||||
}
|
||||
|
||||
private void dataTypeDeleted(long id, DataTypePath oldPath, DataTypePath newIsNull) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_REMOVED, null,
|
||||
null, null, oldPath, newIsNull));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_REMOVED, null, null,
|
||||
null, oldPath, newIsNull));
|
||||
}
|
||||
|
||||
private void instructionFlowOverrideChanged(TraceAddressSpace space,
|
||||
|
@ -458,7 +452,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_FLOWOVERRIDE_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.FLOW_OVERRIDE_CHANGED,
|
||||
instruction.getMinAddress(), instruction.getMinAddress(), null, null, null));
|
||||
}
|
||||
|
||||
|
@ -468,7 +462,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_FALLTHROUGH_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.FALLTHROUGH_CHANGED,
|
||||
instruction.getMinAddress(), instruction.getMinAddress(), null, null, null));
|
||||
}
|
||||
|
||||
|
@ -478,7 +472,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_LENGTH_OVERRIDE_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.LENGTH_OVERRIDE_CHANGED,
|
||||
instruction.getMinAddress(), instruction.getMinAddress(), null, null, null));
|
||||
}
|
||||
|
||||
|
@ -493,7 +487,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
|
||||
protected void fireMemoryBytesChanged(DomainObjectEventQueues queues,
|
||||
TraceAddressSnapRange range) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_MEMORY_BYTES_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.MEMORY_BYTES_CHANGED,
|
||||
range.getX1(), range.getX2(), null, null, null));
|
||||
}
|
||||
|
||||
|
@ -502,21 +496,21 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
return;
|
||||
}
|
||||
// NOTE: Register view regions are fixed
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_MEMORY_BLOCK_ADDED,
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ProgramEvent.MEMORY_BLOCK_ADDED,
|
||||
region.getMinAddress(), region.getMaxAddress(), null, null, null));
|
||||
// NOTE: MemoryMapDB does this, too. Otherwise, CodeBrowserPlugin does not hear.
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
|
||||
private void memoryRegionChanged(TraceAddressSpace space, TraceMemoryRegion region) {
|
||||
if (!isRegionVisible(region)) {
|
||||
return;
|
||||
}
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_MEMORY_BLOCK_CHANGED,
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ProgramEvent.MEMORY_BLOCK_CHANGED,
|
||||
region.getMinAddress(), region.getMaxAddress(), null, null, null));
|
||||
// TODO: Perhaps a bit heavy-handed here. MemoryMapDB does not do this, too.
|
||||
// TODO: Probably want a separate RANGE_CHANGED or MOVED event
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
|
||||
private void memoryRegionLifespanChanged(TraceAddressSpace space, TraceMemoryRegion region,
|
||||
|
@ -524,19 +518,16 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
boolean inOld = isRegionVisible(region, oldSpan);
|
||||
boolean inNew = isRegionVisible(region, newSpan);
|
||||
if (inOld && !inNew) {
|
||||
eventQueues
|
||||
.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_MEMORY_BLOCK_REMOVED,
|
||||
region.getMinAddress(), region.getMaxAddress(), null, null, null));
|
||||
// NOTE: MemoryMapDB does this, too. Otherwise, CodeBrowserPlugin does not hear.
|
||||
eventQueues
|
||||
.fireEvent(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
}
|
||||
if (!inOld && inNew) {
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_MEMORY_BLOCK_ADDED,
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ProgramEvent.MEMORY_BLOCK_REMOVED,
|
||||
region.getMinAddress(), region.getMaxAddress(), null, null, null));
|
||||
// NOTE: MemoryMapDB does this, too. Otherwise, CodeBrowserPlugin does not hear.
|
||||
eventQueues
|
||||
.fireEvent(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
if (!inOld && inNew) {
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ProgramEvent.MEMORY_BLOCK_ADDED,
|
||||
region.getMinAddress(), region.getMaxAddress(), null, null, null));
|
||||
// NOTE: MemoryMapDB does this, too. Otherwise, CodeBrowserPlugin does not hear.
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -547,20 +538,20 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
if (!isRegionVisible(region)) {
|
||||
return;
|
||||
}
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_MEMORY_BLOCK_REMOVED,
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ProgramEvent.MEMORY_BLOCK_REMOVED,
|
||||
region.getMinAddress(), region.getMaxAddress(), null, null, null));
|
||||
// NOTE: MemoryMapDB does this, too. Otherwise, CodeBrowserPlugin does not hear.
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
|
||||
private void sourceArchiveAdded(UniversalID id) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_SOURCE_ARCHIVE_ADDED, null,
|
||||
null, id, null, null));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.SOURCE_ARCHIVE_ADDED, null, null,
|
||||
id, null, null));
|
||||
}
|
||||
|
||||
private void sourceArchiveChanged(UniversalID id) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_SOURCE_ARCHIVE_CHANGED,
|
||||
null, null, id, null, null));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.SOURCE_ARCHIVE_CHANGED, null,
|
||||
null, id, null, null));
|
||||
}
|
||||
|
||||
private void symbolAdded(TraceAddressSpace space, TraceSymbol symbol) {
|
||||
|
@ -572,8 +563,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
}
|
||||
|
||||
public void fireSymbolAdded(DomainObjectEventQueues queues, TraceSymbol symbol) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_ADDED,
|
||||
symbol.getAddress(), symbol.getAddress(), null, null, symbol));
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_ADDED, symbol.getAddress(),
|
||||
symbol.getAddress(), null, null, symbol));
|
||||
}
|
||||
|
||||
private void symbolSourceChanged(TraceAddressSpace space, TraceSymbol symbol) {
|
||||
|
@ -581,7 +572,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_SOURCE_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_SOURCE_CHANGED,
|
||||
symbol.getAddress(), symbol.getAddress(), symbol, null, null));
|
||||
}
|
||||
|
||||
|
@ -597,7 +588,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
oldPrimary = null;
|
||||
}
|
||||
assert oldQueues == newQueues || oldQueues == null;
|
||||
newQueues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_SET_AS_PRIMARY,
|
||||
newQueues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_PRIMARY_STATE_CHANGED,
|
||||
symbol.getAddress(), symbol.getAddress(), null, oldPrimary, newPrimary));
|
||||
}
|
||||
|
||||
|
@ -607,7 +598,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_RENAMED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_RENAMED,
|
||||
symbol.getAddress(), symbol.getAddress(), symbol, oldName, newName));
|
||||
}
|
||||
|
||||
|
@ -617,7 +608,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_SCOPE_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_SCOPE_CHANGED,
|
||||
symbol.getAddress(), symbol.getAddress(), symbol, oldParent, newParent));
|
||||
}
|
||||
|
||||
|
@ -628,7 +619,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
return;
|
||||
}
|
||||
// Strange. This is fired as if by the reference rather than the symbol
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_ASSOCIATION_ADDED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_ASSOCIATION_ADDED,
|
||||
newRef.getFromAddress(), newRef.getFromAddress(), newRef, null, symbol));
|
||||
}
|
||||
|
||||
|
@ -639,7 +630,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
return;
|
||||
}
|
||||
// Ditto as ADDED
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_ASSOCIATION_REMOVED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_ASSOCIATION_REMOVED,
|
||||
oldRef.getFromAddress(), oldRef.getFromAddress(), oldRef, symbol, null));
|
||||
}
|
||||
|
||||
|
@ -649,7 +640,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_ADDRESS_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_ADDRESS_CHANGED,
|
||||
oldAddress, oldAddress, symbol, oldAddress, newAddress));
|
||||
}
|
||||
|
||||
|
@ -679,7 +670,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
|
||||
protected void fireSymbolRemoved(DomainObjectEventQueues queues, TraceSymbol symbol) {
|
||||
queues.fireEvent(
|
||||
new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_REMOVED, symbol.getAddress(),
|
||||
new ProgramChangeRecord(ProgramEvent.SYMBOL_REMOVED, symbol.getAddress(),
|
||||
symbol.getAddress(), symbol, symbol.getName(), symbol.getID()));
|
||||
}
|
||||
}
|
||||
|
@ -780,7 +771,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
}
|
||||
|
||||
protected void viewportChanged() {
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
|
||||
protected void fireEventAllViews(DomainObjectChangeRecord ev) {
|
||||
|
@ -795,7 +786,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
* Fires object-restored event on this view and all associated register views.
|
||||
*/
|
||||
protected void fireObjectRestored() {
|
||||
fireEventAllViews(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
fireEventAllViews(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -17,9 +17,10 @@ package ghidra.trace.database.stack;
|
|||
|
||||
import java.util.*;
|
||||
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.TargetStackFrame;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
import ghidra.framework.model.EventType;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.listing.CodeUnit;
|
||||
import ghidra.trace.database.target.DBTraceObject;
|
||||
|
@ -52,8 +53,8 @@ public class DBTraceObjectStackFrame implements TraceObjectStackFrame, DBTraceOb
|
|||
|
||||
TargetObjectSchema schema = object.getTargetSchema();
|
||||
synchronized (KEYS_BY_SCHEMA) {
|
||||
keys = KEYS_BY_SCHEMA.computeIfAbsent(schema, s -> Set.of(
|
||||
schema.checkAliasedAttribute(TargetStackFrame.PC_ATTRIBUTE_NAME)));
|
||||
keys = KEYS_BY_SCHEMA.computeIfAbsent(schema,
|
||||
s -> Set.of(schema.checkAliasedAttribute(TargetStackFrame.PC_ATTRIBUTE_NAME)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,8 +89,8 @@ public class DBTraceObjectStackFrame implements TraceObjectStackFrame, DBTraceOb
|
|||
|
||||
@Override
|
||||
public Address getProgramCounter(long snap) {
|
||||
return TraceObjectInterfaceUtils.getValue(object, snap,
|
||||
TargetStackFrame.PC_ATTRIBUTE_NAME, Address.class, null);
|
||||
return TraceObjectInterfaceUtils.getValue(object, snap, TargetStackFrame.PC_ATTRIBUTE_NAME,
|
||||
Address.class, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -128,8 +129,7 @@ public class DBTraceObjectStackFrame implements TraceObjectStackFrame, DBTraceOb
|
|||
public void setComment(long snap, String comment) {
|
||||
/* See rant in getComment */
|
||||
try (LockHold hold = object.getTrace().lockWrite()) {
|
||||
TraceObjectValue pcAttr =
|
||||
object.getValue(snap, TargetStackFrame.PC_ATTRIBUTE_NAME);
|
||||
TraceObjectValue pcAttr = object.getValue(snap, TargetStackFrame.PC_ATTRIBUTE_NAME);
|
||||
object.getTrace()
|
||||
.getCommentAdapter()
|
||||
.setComment(pcAttr.getLifespan(), (Address) pcAttr.getValue(),
|
||||
|
@ -166,7 +166,7 @@ public class DBTraceObjectStackFrame implements TraceObjectStackFrame, DBTraceOb
|
|||
}
|
||||
|
||||
protected long snapFor(TraceChangeRecord<?, ?> rec) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.VALUE_CREATED.getType()) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.VALUE_CREATED.getEventType()) {
|
||||
return TraceObjectChangeType.VALUE_CREATED.cast(rec).getAffectedObject().getMinSnap();
|
||||
}
|
||||
return computeMinSnap();
|
||||
|
@ -179,18 +179,18 @@ public class DBTraceObjectStackFrame implements TraceObjectStackFrame, DBTraceOb
|
|||
|
||||
@Override
|
||||
public TraceChangeRecord<?, ?> translateEvent(TraceChangeRecord<?, ?> rec) {
|
||||
int type = rec.getEventType();
|
||||
if (type == TraceObjectChangeType.LIFE_CHANGED.getType()) {
|
||||
EventType type = rec.getEventType();
|
||||
if (type == TraceObjectChangeType.LIFE_CHANGED.getEventType()) {
|
||||
LifeSet newLife = object.getLife();
|
||||
if (!newLife.isEmpty()) {
|
||||
life = newLife;
|
||||
}
|
||||
return createChangeRecord();
|
||||
}
|
||||
else if (type == TraceObjectChangeType.VALUE_CREATED.getType() && changeApplies(rec)) {
|
||||
else if (type == TraceObjectChangeType.VALUE_CREATED.getEventType() && changeApplies(rec)) {
|
||||
return createChangeRecord();
|
||||
}
|
||||
else if (type == TraceObjectChangeType.DELETED.getType()) {
|
||||
else if (type == TraceObjectChangeType.DELETED.getEventType()) {
|
||||
if (life.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -115,7 +115,7 @@ public interface DBTraceObjectInterface extends TraceObjectInterface, TraceUniqu
|
|||
}
|
||||
|
||||
public TraceChangeRecord<?, ?> translate(TraceChangeRecord<?, ?> rec) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.LIFE_CHANGED.getType()) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.LIFE_CHANGED.getEventType()) {
|
||||
if (object.isDeleted()) {
|
||||
return null;
|
||||
}
|
||||
|
@ -137,7 +137,7 @@ public interface DBTraceObjectInterface extends TraceObjectInterface, TraceUniqu
|
|||
throw new AssertionError("Life changed from empty to empty?");
|
||||
}
|
||||
}
|
||||
if (rec.getEventType() == TraceObjectChangeType.VALUE_CREATED.getType()) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.VALUE_CREATED.getEventType()) {
|
||||
if (object.isDeleted()) {
|
||||
return null;
|
||||
}
|
||||
|
@ -160,7 +160,7 @@ public interface DBTraceObjectInterface extends TraceObjectInterface, TraceUniqu
|
|||
cast.getNewValue());
|
||||
return new TraceChangeRecord<>(type, getSpace(life), iface, null, null);
|
||||
}
|
||||
if (rec.getEventType() == TraceObjectChangeType.DELETED.getType()) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.DELETED.getEventType()) {
|
||||
return translateDeleted(life);
|
||||
}
|
||||
return null;
|
||||
|
|
|
@ -74,8 +74,7 @@ public interface Trace extends DataTypeManagerDomainObject {
|
|||
return trace != null && trace.getObjectManager().getRootSchema() == null;
|
||||
}
|
||||
|
||||
public static final class TraceObjectChangeType<T, U>
|
||||
extends DefaultTraceChangeType<T, U> {
|
||||
public static final class TraceObjectChangeType<T, U> extends DefaultTraceChangeType<T, U> {
|
||||
/**
|
||||
* An object was created, but not yet inserted.
|
||||
*
|
||||
|
|
|
@ -22,9 +22,9 @@ public class TraceDomainObjectListener extends TypedEventDispatcher
|
|||
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
if (restoredHandler != null && ev.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (restoredHandler != null && ev.contains(DomainObjectEvent.RESTORED)) {
|
||||
for (DomainObjectChangeRecord rec : ev) {
|
||||
if (rec.getEventType() == DomainObject.DO_OBJECT_RESTORED) {
|
||||
if (rec.getEventType() == DomainObjectEvent.RESTORED) {
|
||||
restoredHandler.accept(rec);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -19,8 +19,7 @@ import java.util.HashMap;
|
|||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectChangeRecord;
|
||||
import ghidra.framework.model.*;
|
||||
import ghidra.trace.util.*;
|
||||
|
||||
public class TypedEventDispatcher {
|
||||
|
@ -103,7 +102,7 @@ public class TypedEventDispatcher {
|
|||
}
|
||||
|
||||
private Map<TraceChangeType<?, ?>, EventRecordHandler<?, ?>> typedMap = new HashMap<>();
|
||||
private Map<Integer, Consumer<DomainObjectChangeRecord>> untypedMap = new HashMap<>();
|
||||
private Map<EventType, Consumer<DomainObjectChangeRecord>> untypedMap = new HashMap<>();
|
||||
protected Consumer<DomainObjectChangeRecord> restoredHandler = null;
|
||||
|
||||
protected <T, U> void listenFor(TraceChangeType<T, U> type, EventRecordHandler<T, U> handler) {
|
||||
|
@ -156,8 +155,8 @@ public class TypedEventDispatcher {
|
|||
typedMap.put(type, handler);
|
||||
}
|
||||
|
||||
protected void listenForUntyped(int type, Consumer<DomainObjectChangeRecord> handler) {
|
||||
if (type == DomainObject.DO_OBJECT_RESTORED) {
|
||||
protected void listenForUntyped(EventType type, Consumer<DomainObjectChangeRecord> handler) {
|
||||
if (type == DomainObjectEvent.RESTORED) {
|
||||
restoredHandler = handler;
|
||||
}
|
||||
else {
|
||||
|
@ -168,7 +167,7 @@ public class TypedEventDispatcher {
|
|||
public void handleChangeRecord(DomainObjectChangeRecord rec) {
|
||||
//String typeName = DefaultTraceChangeType.getName(rec.getEventType());
|
||||
//CountsByType.compute(typeName, (k, v) -> v == null ? 1 : v + 1);
|
||||
if (rec.getEventType() == DomainObject.DO_OBJECT_RESTORED && restoredHandler != null) {
|
||||
if (rec.getEventType() == DomainObjectEvent.RESTORED && restoredHandler != null) {
|
||||
restoredHandler.accept(rec);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -28,10 +28,8 @@ import ghidra.framework.model.DomainObjectChangeRecord;
|
|||
* @param <U> the type of the object's attribute that changed
|
||||
*/
|
||||
public class DefaultTraceChangeType<T, U> implements TraceChangeType<T, U> {
|
||||
private static int nextType = 0x3ACE; // Stay far away from manually-assigned types
|
||||
// But not too far, since it makes the bit set for events gigantic.
|
||||
|
||||
private static final Map<Integer, String> TYPE_NAMES = new HashMap<>();
|
||||
private static final Map<TraceEventType, String> TYPE_NAMES = new HashMap<>();
|
||||
private static final Set<Field> FIELD_BACKLOG = new HashSet<>();
|
||||
|
||||
private static void procType(Field f, TraceChangeType<?, ?> type) {
|
||||
|
@ -42,7 +40,7 @@ public class DefaultTraceChangeType<T, U> implements TraceChangeType<T, U> {
|
|||
if (kind.endsWith("ChangeType")) {
|
||||
kind = kind.substring(0, kind.length() - "ChangeType".length());
|
||||
}
|
||||
TYPE_NAMES.put(type.getType(), kind + "." + f.getName());
|
||||
TYPE_NAMES.put(type.getEventType(), kind + "." + f.getName());
|
||||
}
|
||||
|
||||
private static <C extends TraceChangeType<?, ?>> void procField(Field f, Class<C> cls,
|
||||
|
@ -96,26 +94,17 @@ public class DefaultTraceChangeType<T, U> implements TraceChangeType<T, U> {
|
|||
return "TYPE_0x" + Integer.toHexString(type);
|
||||
}
|
||||
|
||||
private static int nextType() {
|
||||
return nextType++;
|
||||
}
|
||||
|
||||
private final int type;
|
||||
private final TraceEventType eventType;
|
||||
|
||||
public DefaultTraceChangeType() {
|
||||
this.type = nextType();
|
||||
this.eventType = new TraceEventType(getClass().getSimpleName());
|
||||
|
||||
scanTypeNames(getClass());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSubType() {
|
||||
return 0;
|
||||
public TraceEventType getEventType() {
|
||||
return eventType;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
|
|
|
@ -27,7 +27,7 @@ public class TraceChangeRecord<T, U> extends DomainObjectChangeRecord {
|
|||
|
||||
public TraceChangeRecord(TraceChangeType<T, U> type, TraceAddressSpace space, T affectedObject,
|
||||
U oldValue, U newValue) {
|
||||
super(type.getType(), type.getSubType(), oldValue, newValue);
|
||||
super(type.getEventType(), oldValue, newValue);
|
||||
this.type = type;
|
||||
this.space = space;
|
||||
this.affectedObject = affectedObject;
|
||||
|
@ -36,7 +36,7 @@ public class TraceChangeRecord<T, U> extends DomainObjectChangeRecord {
|
|||
|
||||
public TraceChangeRecord(TraceChangeType<T, U> type, TraceAddressSpace space, T affectedObject,
|
||||
U newValue) {
|
||||
super(type.getType(), type.getSubType(), null, newValue);
|
||||
super(type.getEventType(), null, newValue);
|
||||
this.type = type;
|
||||
this.space = space;
|
||||
this.affectedObject = affectedObject;
|
||||
|
@ -45,7 +45,7 @@ public class TraceChangeRecord<T, U> extends DomainObjectChangeRecord {
|
|||
|
||||
public TraceChangeRecord(TraceChangeType<T, U> type, TraceAddressSpace space,
|
||||
T affectedObject) {
|
||||
super(type.getType(), type.getSubType(), null, null);
|
||||
super(type.getEventType(), null, null);
|
||||
this.type = type;
|
||||
this.space = space;
|
||||
this.affectedObject = affectedObject;
|
||||
|
@ -53,7 +53,7 @@ public class TraceChangeRecord<T, U> extends DomainObjectChangeRecord {
|
|||
}
|
||||
|
||||
public TraceChangeRecord(TraceChangeType<T, U> type, TraceAddressSpace space) {
|
||||
super(type.getType(), type.getSubType(), null, null);
|
||||
super(type.getEventType(), null, null);
|
||||
this.type = type;
|
||||
this.space = space;
|
||||
this.affectedObject = null;
|
||||
|
|
|
@ -16,7 +16,5 @@
|
|||
package ghidra.trace.util;
|
||||
|
||||
public interface TraceChangeType<T, U> {
|
||||
int getType();
|
||||
|
||||
int getSubType();
|
||||
TraceEventType getEventType();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
/* ###
|
||||
* IP: GHIDRA
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package ghidra.trace.util;
|
||||
|
||||
import ghidra.framework.model.DomainObjectEventIdGenerator;
|
||||
import ghidra.framework.model.EventType;
|
||||
|
||||
/**
|
||||
* EventTypes for trace events. This implementation exists because trace event types are not
|
||||
* currently structured as enums. This current implementation will not give a very good toString as
|
||||
* its actual event name is unknown, so it uses its event category class + its actual assigned
|
||||
* numerical id.
|
||||
*/
|
||||
public class TraceEventType implements EventType {
|
||||
|
||||
private final int id = DomainObjectEventIdGenerator.next();
|
||||
private String name;
|
||||
|
||||
TraceEventType(String name) {
|
||||
this.name = name + "(" + id + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return name;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue