Add support for copying bytes formatted as Python byte-string, Python list, and C/Java array

This commit is contained in:
S-S-P
2019-06-30 20:17:24 -04:00
committed by dragonmacher
parent 7940f96c8c
commit 00ef824dbd
3 changed files with 101 additions and 1 deletions
@@ -77,6 +77,9 @@ public class CodeBrowserClipboardProvider extends ByteCopier
list.add(COMMENTS_TYPE);
list.add(BYTE_STRING_TYPE);
list.add(BYTE_STRING_NO_SPACE_TYPE);
list.add(PYTHON_BYTE_STRING_TYPE);
list.add(PYTHON_LIST_TYPE);
list.add(CPP_BYTE_ARRAY_TYPE);
list.add(ADDRESS_TEXT_TYPE);
return list;
@@ -239,6 +242,21 @@ public class CodeBrowserClipboardProvider extends ByteCopier
String byteString = copyBytesAsString(getSelectedAddresses(), false, monitor);
return new ByteViewerTransferable(byteString);
}
else if (copyType == PYTHON_BYTE_STRING_TYPE) {
String byteString = "b'"
+ copyBytesAsString(currentSelection, true, monitor).replaceAll(" ", "\\x") + "'";
return new ByteViewerTransferable(byteString);
}
else if (copyType == PYTHON_LIST_TYPE) {
String byteString = "[ "
+ copyBytesAsString(currentSelection, true, monitor).replaceAll(" ", ", 0x") + " ]";
return new ByteViewerTransferable(byteString);
}
else if (copyType == CPP_BYTE_ARRAY_TYPE) {
String byteString = "{ "
+ copyBytesAsString(currentSelection, true, monitor).replaceAll(" ", ", 0x") + " }";
return new ByteViewerTransferable(byteString);
}
return null;
}
@@ -46,12 +46,23 @@ public abstract class ByteCopier {
public static DataFlavor BYTE_STRING_FLAVOR = createByteStringLocalDataTypeFlavor();
public static DataFlavor BYTE_STRING_NO_SPACES_FLAVOR =
createByteStringNoSpacesLocalDataTypeFlavor();
public static DataFlavor PYTHON_BYTE_STRING_FLAVOR =
createPythonByteStringLocalDataTypeFlavor();
public static DataFlavor PYTHON_LIST_FLAVOR = createPythonListLocalDataTypeFlavor();
public static DataFlavor CPP_BYTE_ARRAY_FLAVOR =
createCppByteArrayLocalDataTypeFlavor();
protected static final List<ClipboardType> EMPTY_LIST = Collections.emptyList();
public static final ClipboardType BYTE_STRING_TYPE =
new ClipboardType(BYTE_STRING_FLAVOR, "Byte String");
public static final ClipboardType BYTE_STRING_NO_SPACE_TYPE =
new ClipboardType(BYTE_STRING_NO_SPACES_FLAVOR, "Byte String (No Spaces)");
public static final ClipboardType PYTHON_BYTE_STRING_TYPE =
new ClipboardType(PYTHON_BYTE_STRING_FLAVOR, "Python Byte String");
public static final ClipboardType PYTHON_LIST_TYPE =
new ClipboardType(PYTHON_LIST_FLAVOR, "Python List");
public static final ClipboardType CPP_BYTE_ARRAY_TYPE =
new ClipboardType(CPP_BYTE_ARRAY_FLAVOR, "C Array");
private static DataFlavor createByteStringLocalDataTypeFlavor() {
@@ -83,6 +94,51 @@ public abstract class ByteCopier {
return null;
}
private static DataFlavor createPythonByteStringLocalDataTypeFlavor() {
try {
return new GenericDataFlavor(
DataFlavor.javaJVMLocalObjectMimeType + "; class=java.lang.String",
"Local flavor--Python byte string");
}
catch (Exception e) {
Msg.showError(ByteCopier.class, null, "Could Not Create Data Flavor",
"Unexpected exception creating data flavor for Python byte string", e);
}
return null;
}
private static DataFlavor createPythonListLocalDataTypeFlavor() {
try {
return new GenericDataFlavor(
DataFlavor.javaJVMLocalObjectMimeType + "; class=java.lang.String",
"Local flavor--Python list");
}
catch (Exception e) {
Msg.showError(ByteCopier.class, null, "Could Not Create Data Flavor",
"Unexpected exception creating data flavor for Python list", e);
}
return null;
}
private static DataFlavor createCppByteArrayLocalDataTypeFlavor() {
try {
return new GenericDataFlavor(
DataFlavor.javaJVMLocalObjectMimeType + "; class=java.lang.String",
"Local flavor--C++ array");
}
catch (Exception e) {
Msg.showError(ByteCopier.class, null, "Could Not Create Data Flavor",
"Unexpected exception creating data flavor for C array", e);
}
return null;
}
protected PluginTool tool;
protected Program currentProgram;
protected ProgramSelection currentSelection;
@@ -392,7 +448,9 @@ public abstract class ByteCopier {
public static class ByteViewerTransferable implements Transferable {
private final DataFlavor[] flavors = { BYTE_STRING_NO_SPACE_TYPE.getFlavor(),
BYTE_STRING_TYPE.getFlavor(), DataFlavor.stringFlavor };
BYTE_STRING_TYPE.getFlavor(), PYTHON_BYTE_STRING_TYPE.getFlavor(),
PYTHON_LIST_TYPE.getFlavor(), CPP_BYTE_ARRAY_TYPE.getFlavor(),
DataFlavor.stringFlavor };
private final List<DataFlavor> flavorList = Arrays.asList(flavors);
private final String byteString;
@@ -423,6 +481,15 @@ public abstract class ByteCopier {
if (flavor.equals(BYTE_STRING_NO_SPACE_TYPE.getFlavor())) {
return byteString;
}
if (flavor.equals(PYTHON_BYTE_STRING_TYPE.getFlavor())) {
return byteString;
}
if (flavor.equals(PYTHON_LIST_TYPE.getFlavor())) {
return byteString;
}
if (flavor.equals(CPP_BYTE_ARRAY_TYPE.getFlavor())) {
return byteString;
}
throw new UnsupportedFlavorException(flavor);
}
@@ -43,6 +43,9 @@ public class ByteViewerClipboardProvider extends ByteCopier
List<ClipboardType> copyTypesList = new LinkedList<>();
copyTypesList.add(BYTE_STRING_TYPE);
copyTypesList.add(BYTE_STRING_NO_SPACE_TYPE);
copyTypesList.add(PYTHON_BYTE_STRING_TYPE);
copyTypesList.add(PYTHON_LIST_TYPE);
copyTypesList.add(CPP_BYTE_ARRAY_TYPE);
return copyTypesList;
}
@@ -117,6 +120,18 @@ public class ByteViewerClipboardProvider extends ByteCopier
else if (copyType == BYTE_STRING_NO_SPACE_TYPE) {
byteString = copyBytesAsString(currentSelection, false, monitor);
}
else if (copyType == PYTHON_BYTE_STRING_TYPE) {
byteString = "b'"
+ copyBytesAsString(currentSelection, true, monitor).replaceAll(" ", "\\x") + "'";
}
else if (copyType == PYTHON_LIST_TYPE) {
byteString = "[ "
+ copyBytesAsString(currentSelection, true, monitor).replaceAll(" ", ", 0x") + " ]";
}
else if (copyType == CPP_BYTE_ARRAY_TYPE) {
byteString = "{ "
+ copyBytesAsString(currentSelection, true, monitor).replaceAll(" ", ", 0x") + " }";
}
else {
return null;
}