use of com.google.security.zynamics.binnavi.disassembly.INaviGroupNode in project binnavi by google.
the class CViewInserter method createNodes.
/**
* Clones a node of the source view and inserts it into the target view.
*
* @param target The target view where the cloned view is inserted.
* @param sourceNode The source node that is cloned and inserted into the target view.
* @param nodeMap Maps nodes of the source view to their cloned counterparts.
*/
private static void createNodes(final INaviView target, final INaviViewNode sourceNode, final Map<INaviViewNode, INaviViewNode> nodeMap) {
final INaviViewNode newNode = CNodeTypeSwitcher.switchNode(sourceNode, new INodeTypeCallback<INaviViewNode>() {
@Override
public INaviViewNode handle(final INaviCodeNode node) {
return insertCodeNode(target, node);
}
@Override
public INaviViewNode handle(final INaviFunctionNode node) {
return insertFunctionNode(target, node);
}
@Override
public INaviViewNode handle(final INaviGroupNode node) {
// Skip now, create later
return null;
}
@Override
public INaviViewNode handle(final INaviTextNode node) {
return insertTextNode(target, node);
}
});
if (newNode != null) {
newNode.setBorderColor(sourceNode.getBorderColor());
newNode.setColor(sourceNode.getColor());
newNode.setHeight(sourceNode.getHeight());
newNode.setSelected(sourceNode.isSelected());
newNode.setVisible(sourceNode.isVisible());
newNode.setWidth(sourceNode.getWidth());
newNode.setX(sourceNode.getX());
newNode.setY(sourceNode.getY());
nodeMap.put(sourceNode, newNode);
}
}
use of com.google.security.zynamics.binnavi.disassembly.INaviGroupNode in project binnavi by google.
the class GroupNodeTest method testSetCollapsed.
@Test
public void testSetCollapsed() {
final Database database = new Database(new MockDatabase());
final MockModule mockModule = new MockModule();
final TagManager nodeTagManager = new TagManager(new MockTagManager(com.google.security.zynamics.binnavi.Tagging.TagType.NODE_TAG));
final TagManager viewTagManager = new TagManager(new MockTagManager(com.google.security.zynamics.binnavi.Tagging.TagType.VIEW_TAG));
final Module module = new Module(database, mockModule, nodeTagManager, viewTagManager);
final MockView mockView = new MockView();
final View view = new View(module, mockView, nodeTagManager, viewTagManager);
final INaviGroupNode internalGroupNode = new CGroupNode(0, 0, 0, 0, 0, Color.RED, false, false, new HashSet<CTag>(), new ArrayList<IComment>(), false, new MockSqlProvider());
final GroupNode node = new GroupNode(view, internalGroupNode, viewTagManager);
final MockGroupNodeListener listener = new MockGroupNodeListener();
node.addListener(listener);
node.setCollapsed(true);
assertEquals("changedState;", listener.events);
assertTrue(node.isCollapsed());
node.removeListener(listener);
}
use of com.google.security.zynamics.binnavi.disassembly.INaviGroupNode in project binnavi by google.
the class CGraphGrouper method determineNodeText.
/**
* Determines the text to be displayed in a group node, if the given node is inside a collapsed
* group node.
*
* @param node The node whose text is determined.
*
* @return The string to be displayed for the given node.
*/
private static String determineNodeText(final NaviNode node) {
if (node.getRawNode() instanceof INaviCodeNode) {
final INaviCodeNode cnode = (INaviCodeNode) node.getRawNode();
return String.format("Basic Block: %s", cnode.getAddress().toHexString());
} else if (node.getRawNode() instanceof INaviFunctionNode) {
final INaviFunctionNode fnode = (INaviFunctionNode) node.getRawNode();
return String.format("Function: %s (%s)", fnode.getFunction().getName(), fnode.getFunction().getAddress().toHexString());
} else if (node.getRawNode() instanceof INaviTextNode) {
// Display up to 15 characters of the first line of
// the comment for comment nodes.
final INaviTextNode tnode = (INaviTextNode) node.getRawNode();
final List<IComment> comment = tnode.getComments();
final String firstLine = (comment.isEmpty()) ? "" : comment.get(1).getComment();
final int firstLineBreak = Math.min(firstLine.indexOf('\n'), firstLine.indexOf('\r'));
final int toDisplay = Math.min(Math.min(15, firstLineBreak == -1 ? Integer.MAX_VALUE : firstLineBreak), firstLine.length());
return String.format("Text: %s", firstLine.substring(0, toDisplay));
} else if (node.getRawNode() instanceof INaviGroupNode) {
// Display up to 15 characters of the first line of
// the comment for group nodes.
final INaviGroupNode gnode = (INaviGroupNode) node.getRawNode();
final List<IComment> comment = gnode.getComments();
final String firstLine = (comment.isEmpty()) ? "" : comment.get(0).getComment();
final int firstLineBreak = Math.min(firstLine.indexOf('\n'), firstLine.indexOf('\r'));
final int toDisplay = Math.min(Math.min(15, firstLineBreak == -1 ? Integer.MAX_VALUE : firstLineBreak), firstLine.length());
return String.format("Group: %s", firstLine.substring(0, toDisplay));
} else {
throw new IllegalStateException("IE01150: Unknown node type");
}
}
use of com.google.security.zynamics.binnavi.disassembly.INaviGroupNode in project binnavi by google.
the class CGraphGrouper method getCommonParent.
/**
* Finds the common parent group of a list of nodes.
*
* @param nodes The list of nodes whose parent group is determined.
*
* @return The common parent group of the nodes or null if there is no such group.
*/
private static INaviGroupNode getCommonParent(final List<NaviNode> nodes) {
INaviGroupNode parent = null;
boolean first = true;
for (final NaviNode node : nodes) {
if (first) {
parent = node.getRawNode().getParentGroup();
first = false;
} else {
if (parent != node.getRawNode().getParentGroup()) {
return null;
}
}
}
return parent;
}
use of com.google.security.zynamics.binnavi.disassembly.INaviGroupNode in project binnavi by google.
the class PostgreSQLCommentNotificationParser method processGroupNodeCommentNotification.
/**
* Parses the notifications from the database back end for group node comments by using a regular
* expression. If the regular expression matches the supplied {@link PGNotification} notification,
* it is determined if the group node in the notification is currently loaded, and if a
* {@link CommentNotificationContainer} with the gathered data from the notification is returned.
*
* @param notification The {@link PGNotification} from the PostgreSQL database server.
* @param provider The {@link SQLProvider} which is used to communicate with the database.
*/
static CommentNotification processGroupNodeCommentNotification(final PGNotification notification, final SQLProvider provider) {
final Matcher matcher = GROUP_NODE_PATTERN.matcher(notification.getParameter());
if (!matcher.find()) {
return null;
}
final Integer nodeId = Integer.parseInt(matcher.group(3));
final Integer commentId = matcher.group(4).equals("null") ? null : Integer.parseInt(matcher.group(4));
final INaviGroupNode groupNode = (INaviGroupNode) NodeCache.get(provider).getNodeById(nodeId);
if (groupNode == null) {
return null;
}
final CommentOperation operation = commentId == null ? CommentOperation.DELETE : CommentOperation.APPEND;
return new GroupNodeCommentNotificationContainer(groupNode, operation, commentId);
}
Aggregations