mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 19:42:36 +02:00
GP-4386 Handle null FileID for ProjectArchive
This commit is contained in:
parent
75beb82103
commit
aad9e41670
3 changed files with 20 additions and 35 deletions
|
@ -17,7 +17,6 @@ package ghidra.app.plugin.core.datamgr.archive;
|
|||
|
||||
import java.awt.Component;
|
||||
import java.io.IOException;
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.swing.Icon;
|
||||
|
||||
|
@ -30,18 +29,19 @@ public class ProjectArchive implements DomainFileArchive {
|
|||
|
||||
private static Icon CLOSED_ICON = new GIcon("icon.plugin.datatypes.archive.project.closed");
|
||||
private static Icon OPEN_ICON = new GIcon("icon.plugin.datatypes.archive.project.open");
|
||||
|
||||
private DataTypeArchive dataTypeArchive;
|
||||
private DomainFile originalDomainFile;
|
||||
DataTypeManagerChangeListener categoryListener; // hold on to since it is stored in a weak set
|
||||
private DomainFile sourceDomainFile;
|
||||
private DataTypeManagerChangeListener categoryListener; // hold on to since it is stored in a weak set
|
||||
private DataTypeManagerHandler archiveManager;
|
||||
private DataTypeManager dataTypeManager;
|
||||
|
||||
ProjectArchive(DataTypeManagerHandler archiveManager, DataTypeArchive dataTypeArchive,
|
||||
DomainFile originalDomainFile) {
|
||||
DomainFile sourceDomainFile) {
|
||||
this.archiveManager = archiveManager;
|
||||
this.dataTypeArchive = dataTypeArchive;
|
||||
this.dataTypeManager = dataTypeArchive.getDataTypeManager();
|
||||
this.originalDomainFile = originalDomainFile;
|
||||
this.sourceDomainFile = sourceDomainFile;
|
||||
categoryListener = new ArchiveCategoryChangeListener();
|
||||
dataTypeManager.addDataTypeManagerListener(categoryListener);
|
||||
}
|
||||
|
@ -67,39 +67,19 @@ public class ProjectArchive implements DomainFileArchive {
|
|||
return -1; // Project Archives appear between the ProgramArchive and FileArchives.
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return originalDomainFile.getFileID().hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
ProjectArchive other = (ProjectArchive) obj;
|
||||
return Objects.equals(originalDomainFile.getFileID(), other.originalDomainFile.getFileID());
|
||||
}
|
||||
|
||||
public boolean hasExclusiveAccess() {
|
||||
return dataTypeArchive.hasExclusiveAccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isModifiable() {
|
||||
DomainFile domainFile = getDomainObject().getDomainFile();
|
||||
return domainFile.canSave();
|
||||
DomainFile df = getDomainObject().getDomainFile();
|
||||
return df.canSave();
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainFile getDomainFile() {
|
||||
return originalDomainFile;
|
||||
return sourceDomainFile;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -109,8 +89,8 @@ public class ProjectArchive implements DomainFileArchive {
|
|||
|
||||
@Override
|
||||
public boolean isChanged() {
|
||||
DomainFile domainFile = dataTypeArchive.getDomainFile();
|
||||
long lastModifiedTime = domainFile.getLastModifiedTime();
|
||||
DomainFile df = dataTypeArchive.getDomainFile();
|
||||
long lastModifiedTime = df.getLastModifiedTime();
|
||||
return (lastModifiedTime == 0) || dataTypeArchive.isChanged();
|
||||
}
|
||||
|
||||
|
@ -134,7 +114,7 @@ public class ProjectArchive implements DomainFileArchive {
|
|||
@Override
|
||||
public void saveAs(Component component) throws IOException {
|
||||
archiveManager.saveAs(dataTypeArchive);
|
||||
originalDomainFile = dataTypeArchive.getDomainFile();
|
||||
sourceDomainFile = dataTypeArchive.getDomainFile(); // update with new domain file
|
||||
dataTypeArchive.updateID();
|
||||
}
|
||||
|
||||
|
|
|
@ -218,8 +218,8 @@ public class GhidraFileData {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns a unique file-ID
|
||||
* @return the ID
|
||||
* Returns a unique file-ID if one has been established or null
|
||||
* @return the file-ID or null if failed to obtain ID
|
||||
*/
|
||||
String getFileID() {
|
||||
return fileID;
|
||||
|
|
|
@ -65,8 +65,13 @@ public interface DomainFile extends Comparable<DomainFile> {
|
|||
public boolean exists();
|
||||
|
||||
/**
|
||||
* Returns a unique file-ID
|
||||
* @return the ID
|
||||
* Returns a unique file-ID if one has been established or null. Examples which may result in
|
||||
* null ID:
|
||||
* <ul>
|
||||
* <li>Very old project file which pre-dates introduction of file ID, or</li>
|
||||
* <li>Remote versioned file with lost connection</li>
|
||||
* </ul>
|
||||
* @return the file-ID or null if failed to obtain ID.
|
||||
*/
|
||||
public String getFileID();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue