diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/Archive.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/Archive.java index 77a349dbba..bead7b085c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/Archive.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/Archive.java @@ -4,9 +4,9 @@ * 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. @@ -31,7 +31,7 @@ public interface Archive extends DataTypeManagerOwner, Comparable { /** * Gets the name for this data type archive. * This is the name to be presented to the user for this archive. - * @return the name + * @return the name or null if closed */ public String getName(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/ProjectArchive.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/ProjectArchive.java index fc3cb58c1e..3cb1adda5f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/ProjectArchive.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/ProjectArchive.java @@ -4,9 +4,9 @@ * 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. @@ -24,6 +24,7 @@ import generic.theme.GIcon; import ghidra.framework.model.DomainFile; import ghidra.program.model.data.*; import ghidra.program.model.listing.DataTypeArchive; +import ghidra.util.exception.ClosedException; public class ProjectArchive implements DomainFileArchive { @@ -34,7 +35,7 @@ public class ProjectArchive implements DomainFileArchive { private DomainFile sourceDomainFile; private DataTypeManagerChangeListener categoryListener; // hold on to since it is stored in a weak set private DataTypeManagerHandler archiveManager; - private DataTypeManager dataTypeManager; + private StandAloneDataTypeManager dataTypeManager; ProjectArchive(DataTypeManagerHandler archiveManager, DataTypeArchive dataTypeArchive, DomainFile sourceDomainFile) { @@ -53,6 +54,9 @@ public class ProjectArchive implements DomainFileArchive { @Override public String getName() { + if (dataTypeManager == null) { + return null; + } return dataTypeManager.getName(); } @@ -74,6 +78,9 @@ public class ProjectArchive implements DomainFileArchive { @Override public boolean isModifiable() { + if (dataTypeManager == null) { + return false; + } DomainFile df = getDomainObject().getDomainFile(); return df.canSave(); } @@ -90,6 +97,9 @@ public class ProjectArchive implements DomainFileArchive { @Override public boolean isChanged() { + if (dataTypeManager == null) { + return false; + } DomainFile df = dataTypeArchive.getDomainFile(); long lastModifiedTime = df.getLastModifiedTime(); return (lastModifiedTime == 0) || dataTypeArchive.isChanged(); @@ -97,26 +107,35 @@ public class ProjectArchive implements DomainFileArchive { @Override public boolean isSavable() { - return !dataTypeArchive.getDomainFile().isReadOnly() && dataTypeArchive.isChangeable(); + return dataTypeManager != null && !dataTypeArchive.getDomainFile().isReadOnly() && + dataTypeArchive.isChangeable(); } @Override public void save() throws IOException { + if (dataTypeManager == null) { + throw new ClosedException(); + } archiveManager.save(getDomainObject()); } @Override public void close() { - dataTypeManager.close(); - archiveManager.archiveClosed(this); - dataTypeManager = null; + if (dataTypeManager != null) { + dataTypeManager.close(); + archiveManager.archiveClosed(this); + dataTypeManager = null; + } } @Override public void saveAs(Component component) throws IOException { + if (dataTypeManager == null) { + throw new ClosedException(); + } archiveManager.saveAs(dataTypeArchive); sourceDomainFile = dataTypeArchive.getDomainFile(); // update with new domain file - dataTypeArchive.updateID(); + dataTypeManager.updateID(); } @Override diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/DataTypeArchiveDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/DataTypeArchiveDB.java index ed4455b844..79fc46cc49 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/DataTypeArchiveDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/DataTypeArchiveDB.java @@ -570,11 +570,6 @@ public class DataTypeArchiveDB extends DomainObjectAdapterDB implements DataType super.updateMetadata(); } - @Override - public void updateID() { - dataTypeManager.updateID(); - } - @Override protected void domainObjectRestored() { super.domainObjectRestored(); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/DataTypeArchive.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/DataTypeArchive.java index 70c261d5fa..ef347c544f 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/DataTypeArchive.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/DataTypeArchive.java @@ -38,22 +38,18 @@ public interface DataTypeArchive extends DataTypeManagerDomainObject { public static final Date JANUARY_1_1970 = new Date(0); /** - * Gets the associated standalone data type manager. - * @return the data type manager. + * {@return the associated standalone data type manager.} */ @Override public StandAloneDataTypeManager getDataTypeManager(); /** - * Gets the default pointer size as it may be stored within the data type archive. - * @return default pointer size. + * {@return the default pointer size as it may be stored within the data type archive.} */ public int getDefaultPointerSize(); /** - * Returns the creation date of this data type archive. - * existed, then Jan 1, 1970 is returned. - * @return the creation date of this data type archive + * {@return the creation date of this data type archive or Jan 1, 1970 if unknown.} */ public Date getCreationDate(); @@ -69,6 +65,4 @@ public interface DataTypeArchive extends DataTypeManagerDomainObject { */ public void invalidate(); - public void updateID(); - }