mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-06-01 04:15:22 +08:00
Merge remote-tracking branch 'origin/dragonmacher-GT-2705-9.0' into Ghidra_9.0.2
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
/* ###
|
||||
* IP: GHIDRA
|
||||
* REVIEWED: YES
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,21 +15,29 @@
|
||||
*/
|
||||
package foundation;
|
||||
|
||||
import ghidra.app.factory.*;
|
||||
import ghidra.app.util.*;
|
||||
import ghidra.framework.*;
|
||||
import ghidra.framework.data.*;
|
||||
import ghidra.framework.main.datatree.*;
|
||||
import ghidra.app.factory.GhidraToolStateFactory;
|
||||
import ghidra.app.util.GhidraFileOpenDataFlavorHandlerService;
|
||||
import ghidra.framework.ModuleInitializer;
|
||||
import ghidra.framework.PluggableServiceRegistry;
|
||||
import ghidra.framework.data.ToolStateFactory;
|
||||
import ghidra.framework.main.datatree.GhidraDataFlavorHandlerService;
|
||||
import ghidra.program.database.*;
|
||||
|
||||
public class FoundationInitializer implements ModuleInitializer {
|
||||
public void run() {
|
||||
PluggableServiceRegistry.registerPluggableService( ToolStateFactory.class, new GhidraToolStateFactory() );
|
||||
PluggableServiceRegistry.registerPluggableService( DataFlavorHandlerService.class, new GhidraDataFlavorHandlerService() );
|
||||
PluggableServiceRegistry.registerPluggableService( FileOpenDataFlavorHandlerService.class, new GhidraFileOpenDataFlavorHandlerService() );
|
||||
PluggableServiceRegistry.registerPluggableService( DataTypeArchiveMergeManagerFactory.class, new GhidraDataTypeArchiveMergeManagerFactory() );
|
||||
PluggableServiceRegistry.registerPluggableService( ProgramMultiUserMergeManagerFactory.class, new GhidraProgramMultiUserMergeManagerFactory() );
|
||||
}
|
||||
@Override
|
||||
public void run() {
|
||||
PluggableServiceRegistry.registerPluggableService(ToolStateFactory.class,
|
||||
new GhidraToolStateFactory());
|
||||
PluggableServiceRegistry.registerPluggableService(GhidraDataFlavorHandlerService.class,
|
||||
new GhidraDataFlavorHandlerService());
|
||||
PluggableServiceRegistry.registerPluggableService(
|
||||
GhidraFileOpenDataFlavorHandlerService.class,
|
||||
new GhidraFileOpenDataFlavorHandlerService());
|
||||
PluggableServiceRegistry.registerPluggableService(DataTypeArchiveMergeManagerFactory.class,
|
||||
new GhidraDataTypeArchiveMergeManagerFactory());
|
||||
PluggableServiceRegistry.registerPluggableService(ProgramMultiUserMergeManagerFactory.class,
|
||||
new GhidraProgramMultiUserMergeManagerFactory());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
|
||||
+6
-8
@@ -1,6 +1,5 @@
|
||||
/* ###
|
||||
* IP: GHIDRA
|
||||
* REVIEWED: YES
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,6 +15,12 @@
|
||||
*/
|
||||
package ghidra.app.plugin.core.datamgr;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.tree.TreePath;
|
||||
|
||||
import docking.widgets.tree.GTreeNode;
|
||||
import ghidra.app.context.ProgramActionContext;
|
||||
import ghidra.app.plugin.core.datamgr.archive.ProjectArchive;
|
||||
import ghidra.app.plugin.core.datamgr.tree.DataTypeArchiveGTree;
|
||||
@@ -24,13 +29,6 @@ import ghidra.framework.main.datatable.DomainFileProvider;
|
||||
import ghidra.framework.model.DomainFile;
|
||||
import ghidra.program.model.listing.Program;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.tree.TreePath;
|
||||
|
||||
import docking.widgets.tree.GTreeNode;
|
||||
|
||||
public class DataTypesActionContext extends ProgramActionContext implements DomainFileProvider {
|
||||
private final GTreeNode clickedNode;
|
||||
private final boolean isToolbarAction;
|
||||
|
||||
+10
-12
@@ -1,6 +1,5 @@
|
||||
/* ###
|
||||
* IP: GHIDRA
|
||||
* REVIEWED: YES
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,14 +15,13 @@
|
||||
*/
|
||||
package ghidra.app.util;
|
||||
|
||||
import ghidra.framework.main.datatree.*;
|
||||
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
|
||||
public class GhidraFileOpenDataFlavorHandlerService extends FileOpenDataFlavorHandlerService {
|
||||
import ghidra.framework.main.datatree.*;
|
||||
|
||||
@Override
|
||||
protected void doRegisterDataFlavorHandlers() {
|
||||
public class GhidraFileOpenDataFlavorHandlerService {
|
||||
|
||||
public GhidraFileOpenDataFlavorHandlerService() {
|
||||
|
||||
try {
|
||||
DataFlavor linuxFileUrlFlavor =
|
||||
@@ -34,15 +32,15 @@ public class GhidraFileOpenDataFlavorHandlerService extends FileOpenDataFlavorHa
|
||||
// should never happen as it is using java.lang.String
|
||||
}
|
||||
|
||||
LocalTreeNodeFlavorHandler localHandler = new LocalTreeNodeFlavorHandler();
|
||||
LocalTreeNodeHandler localHandler = new LocalTreeNodeHandler();
|
||||
FileOpenDropHandler.addDataFlavorHandler(DataTreeDragNDropHandler.localDomainFileFlavor,
|
||||
localHandler);
|
||||
FileOpenDropHandler.addDataFlavorHandler(VersionInfoTransferable.localVersionInfoFlavor,
|
||||
FileOpenDropHandler.addDataFlavorHandler(DataTreeDragNDropHandler.localDomainFileTreeFlavor,
|
||||
localHandler);
|
||||
FileOpenDropHandler.addDataFlavorHandler(DataFlavor.javaFileListFlavor,
|
||||
new JavaFileListFlavorHandler());
|
||||
|
||||
FileOpenDropHandler.addDataFlavorHandler(
|
||||
DataTreeDragNDropHandler.localDomainFileTreeFlavor, localHandler);
|
||||
FileOpenDropHandler.addDataFlavorHandler(VersionInfoTransferable.localVersionInfoFlavor,
|
||||
new LocalVersionInfoHandler());
|
||||
FileOpenDropHandler.addDataFlavorHandler(DataFlavor.javaFileListFlavor,
|
||||
new JavaFileListHandler());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
/* ###
|
||||
* 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.app.util;
|
||||
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
import java.awt.dnd.DropTargetDropEvent;
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
import ghidra.app.services.FileImporterService;
|
||||
import ghidra.framework.model.DomainFolder;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import util.CollectionUtils;
|
||||
|
||||
final class JavaFileListFlavorHandler implements FileOpenDataFlavorHandler {
|
||||
@Override
|
||||
public void handle(PluginTool tool, Object obj, DropTargetDropEvent e, DataFlavor f) {
|
||||
List<File> files = CollectionUtils.asList((List<?>) obj, File.class);
|
||||
|
||||
FileImporterService im = tool.getService(FileImporterService.class);
|
||||
if (im == null) {
|
||||
tool.setStatusInfo("ERROR: Could not get importer service.");
|
||||
return;
|
||||
}
|
||||
|
||||
DomainFolder rootFolder = tool.getProject().getProjectData().getRootFolder();
|
||||
|
||||
if (files.size() == 1 && files.get(0).isFile()) {
|
||||
im.importFile(rootFolder, files.get(0));
|
||||
}
|
||||
else {
|
||||
im.importFiles(rootFolder, files);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,7 @@ import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
|
||||
import docking.*;
|
||||
import docking.event.mouse.GMouseListenerAdapter;
|
||||
import docking.widgets.tree.support.GTreeSelectionEvent;
|
||||
import docking.widgets.tree.support.GTreeSelectionListener;
|
||||
import ghidra.framework.main.datatree.ClearCutAction;
|
||||
@@ -40,7 +41,7 @@ import ghidra.util.layout.PairLayout;
|
||||
* Dialog to open or save domain data items to a new location or name.
|
||||
*/
|
||||
public class DataTreeDialog extends DialogComponentProvider
|
||||
implements GTreeSelectionListener, ActionListener {
|
||||
implements GTreeSelectionListener, ActionListener {
|
||||
|
||||
/**
|
||||
* Dialog type for opening domain data files.
|
||||
@@ -540,10 +541,11 @@ implements GTreeSelectionListener, ActionListener {
|
||||
|
||||
protected void addTreeListeners() {
|
||||
if (type == OPEN) {
|
||||
treePanel.addTreeMouseListener(new MouseAdapter() {
|
||||
|
||||
treePanel.addTreeMouseListener(new GMouseListenerAdapter() {
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
if (e.getClickCount() == 2 && okButton.isEnabled()) {
|
||||
public void doubleClickTriggered(MouseEvent e) {
|
||||
if (okButton.isEnabled()) {
|
||||
okCallback();
|
||||
}
|
||||
}
|
||||
@@ -671,7 +673,7 @@ implements GTreeSelectionListener, ActionListener {
|
||||
|
||||
// populate the combo box
|
||||
DefaultComboBoxModel<String> model =
|
||||
(DefaultComboBoxModel<String>) projectComboBox.getModel();
|
||||
(DefaultComboBoxModel<String>) projectComboBox.getModel();
|
||||
model.removeAllElements();
|
||||
|
||||
Set<String> map = new HashSet<>();
|
||||
|
||||
+6
-9
@@ -1,6 +1,5 @@
|
||||
/* ###
|
||||
* IP: GHIDRA
|
||||
* REVIEWED: YES
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -18,9 +17,10 @@ package ghidra.framework.main.datatree;
|
||||
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
|
||||
public class GhidraDataFlavorHandlerService extends DataFlavorHandlerService {
|
||||
@Override
|
||||
protected void doRegisterDataFlavorHandlers() {
|
||||
public class GhidraDataFlavorHandlerService {
|
||||
|
||||
public GhidraDataFlavorHandlerService() {
|
||||
|
||||
try {
|
||||
DataFlavor linuxFileUrlFlavor =
|
||||
new DataFlavor("application/x-java-serialized-object;class=java.lang.String");
|
||||
@@ -31,15 +31,12 @@ public class GhidraDataFlavorHandlerService extends DataFlavorHandlerService {
|
||||
// should never happen as it is using java.lang.String
|
||||
}
|
||||
|
||||
final LocalTreeNodeHandler localTreeNodeHandler = new LocalTreeNodeHandler();
|
||||
LocalTreeNodeHandler localNodeHandler = new LocalTreeNodeHandler();
|
||||
DataTreeDragNDropHandler.addActiveDataFlavorHandler(
|
||||
DataTreeDragNDropHandler.localDomainFileTreeFlavor, localTreeNodeHandler);
|
||||
DataTreeDragNDropHandler.localDomainFileTreeFlavor, localNodeHandler);
|
||||
DataTreeDragNDropHandler.addActiveDataFlavorHandler(DataFlavor.javaFileListFlavor,
|
||||
new JavaFileListHandler());
|
||||
DataTreeDragNDropHandler.addActiveDataFlavorHandler(
|
||||
VersionInfoTransferable.localVersionInfoFlavor, new LocalVersionInfoHandler());
|
||||
|
||||
DataTreeDragNDropHandler.addInactiveDataFlavorHandler(
|
||||
DataTreeDragNDropHandler.localDomainFileTreeFlavor, localTreeNodeHandler);
|
||||
}
|
||||
}
|
||||
|
||||
+33
-12
@@ -19,13 +19,15 @@
|
||||
package ghidra.framework.main.datatree;
|
||||
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
import java.awt.dnd.DropTargetDropEvent;
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
import docking.widgets.tree.GTreeNode;
|
||||
import ghidra.app.services.FileImporterService;
|
||||
import ghidra.framework.main.FrontEndTool;
|
||||
import ghidra.app.util.FileOpenDataFlavorHandler;
|
||||
import ghidra.framework.model.DomainFolder;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.util.Msg;
|
||||
import util.CollectionUtils;
|
||||
|
||||
@@ -33,24 +35,43 @@ import util.CollectionUtils;
|
||||
* A drag-and-drop handler for trees that is specific to List<File>. (see
|
||||
* {@link DataFlavor#javaFileListFlavor}).
|
||||
*/
|
||||
final class JavaFileListHandler implements DataFlavorHandler {
|
||||
@Override
|
||||
public void handle(FrontEndTool tool, DataTree dataTree, GTreeNode destinationNode,
|
||||
Object transferData, int dropAction) {
|
||||
DomainFolder folder = getDomainFolder(destinationNode);
|
||||
public final class JavaFileListHandler implements DataTreeFlavorHandler, FileOpenDataFlavorHandler {
|
||||
|
||||
FileImporterService im = tool.getService(FileImporterService.class);
|
||||
if (im == null) {
|
||||
Msg.showError(this, dataTree, "Could Not Import", "Could not find importer service");
|
||||
@Override
|
||||
public void handle(PluginTool tool, Object transferData, DropTargetDropEvent e, DataFlavor f) {
|
||||
|
||||
FileImporterService importer = tool.getService(FileImporterService.class);
|
||||
if (importer == null) {
|
||||
Msg.showError(this, null, "Could Not Import", "Could not find Importer Service");
|
||||
return;
|
||||
}
|
||||
|
||||
List<File> fileList = CollectionUtils.asList((List<?>) transferData, File.class);
|
||||
DomainFolder folder = tool.getProject().getProjectData().getRootFolder();
|
||||
doImport(importer, folder, transferData);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(PluginTool tool, DataTree dataTree, GTreeNode destinationNode,
|
||||
Object transferData, int dropAction) {
|
||||
|
||||
FileImporterService importer = tool.getService(FileImporterService.class);
|
||||
if (importer == null) {
|
||||
Msg.showError(this, dataTree, "Could Not Import", "Could not find Importer Service");
|
||||
return;
|
||||
}
|
||||
|
||||
DomainFolder folder = getDomainFolder(destinationNode);
|
||||
doImport(importer, folder, transferData);
|
||||
}
|
||||
|
||||
private void doImport(FileImporterService importer, DomainFolder folder, Object files) {
|
||||
|
||||
List<File> fileList = CollectionUtils.asList((List<?>) files, File.class);
|
||||
if (fileList.size() == 1 && fileList.get(0).isFile()) {
|
||||
im.importFile(folder, fileList.get(0));
|
||||
importer.importFile(folder, fileList.get(0));
|
||||
}
|
||||
else {
|
||||
im.importFiles(folder, fileList);
|
||||
importer.importFiles(folder, fileList);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-3
@@ -27,7 +27,6 @@ import java.util.function.Function;
|
||||
import docking.widgets.tree.GTreeNode;
|
||||
import ghidra.app.services.FileImporterService;
|
||||
import ghidra.app.util.FileOpenDataFlavorHandler;
|
||||
import ghidra.framework.main.FrontEndTool;
|
||||
import ghidra.framework.model.DomainFolder;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.framework.plugintool.ServiceProvider;
|
||||
@@ -38,11 +37,11 @@ import ghidra.util.Msg;
|
||||
* duty in that it opens files for DataTrees and for Tools (signaled via the interfaces it
|
||||
* implements).
|
||||
*/
|
||||
public final class LinuxFileUrlHandler implements DataFlavorHandler, FileOpenDataFlavorHandler {
|
||||
public final class LinuxFileUrlHandler implements DataTreeFlavorHandler, FileOpenDataFlavorHandler {
|
||||
|
||||
@Override
|
||||
// This is for the DataFlavorHandler interface for handling node drops in DataTrees
|
||||
public void handle(FrontEndTool tool, DataTree dataTree, GTreeNode destinationNode,
|
||||
public void handle(PluginTool tool, DataTree dataTree, GTreeNode destinationNode,
|
||||
Object transferData, int dropAction) {
|
||||
|
||||
DomainFolder folder = getDomainFolder(destinationNode);
|
||||
|
||||
Reference in New Issue
Block a user