summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz')
-rw-r--r--src/main/java/cuchaz/enigma/gui/Gui.java4
-rw-r--r--src/main/java/cuchaz/enigma/gui/GuiController.java8
-rw-r--r--src/main/java/cuchaz/enigma/gui/elements/MenuBar.java16
-rw-r--r--src/main/java/cuchaz/enigma/mapping/ClassMapping.java13
-rw-r--r--src/main/java/cuchaz/enigma/mapping/Mappings.java2
-rw-r--r--src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java99
6 files changed, 141 insertions, 1 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java
index 9f8d6fc4..77065a90 100644
--- a/src/main/java/cuchaz/enigma/gui/Gui.java
+++ b/src/main/java/cuchaz/enigma/gui/Gui.java
@@ -63,6 +63,7 @@ public class Gui {
63 // state 63 // state
64 public EntryReference<Entry, Entry> reference; 64 public EntryReference<Entry, Entry> reference;
65 public JFileChooser jarFileChooser; 65 public JFileChooser jarFileChooser;
66 public JFileChooser tinyMappingsFileChooser;
66 public JFileChooser enigmaMappingsFileChooser; 67 public JFileChooser enigmaMappingsFileChooser;
67 public JFileChooser exportSourceFileChooser; 68 public JFileChooser exportSourceFileChooser;
68 public JFileChooser exportJarFileChooser; 69 public JFileChooser exportJarFileChooser;
@@ -105,6 +106,7 @@ public class Gui {
105 // init file choosers 106 // init file choosers
106 this.jarFileChooser = new FileChooserFile(); 107 this.jarFileChooser = new FileChooserFile();
107 108
109 this.tinyMappingsFileChooser = new FileChooserFile();
108 this.enigmaMappingsFileChooser = new FileChooserAny(); 110 this.enigmaMappingsFileChooser = new FileChooserAny();
109 this.exportSourceFileChooser = new FileChooserFolder(); 111 this.exportSourceFileChooser = new FileChooserFolder();
110 this.exportJarFileChooser = new FileChooserFile(); 112 this.exportJarFileChooser = new FileChooserFile();
@@ -314,6 +316,7 @@ public class Gui {
314 316
315 // update menu 317 // update menu
316 this.menuBar.closeJarMenu.setEnabled(true); 318 this.menuBar.closeJarMenu.setEnabled(true);
319 this.menuBar.openTinyMappingsMenu.setEnabled(true);
317 this.menuBar.openEnigmaMappingsMenu.setEnabled(true); 320 this.menuBar.openEnigmaMappingsMenu.setEnabled(true);
318 this.menuBar.saveMappingsMenu.setEnabled(false); 321 this.menuBar.saveMappingsMenu.setEnabled(false);
319 this.menuBar.saveMappingEnigmaFileMenu.setEnabled(true); 322 this.menuBar.saveMappingEnigmaFileMenu.setEnabled(true);
@@ -336,6 +339,7 @@ public class Gui {
336 339
337 // update menu 340 // update menu
338 this.menuBar.closeJarMenu.setEnabled(false); 341 this.menuBar.closeJarMenu.setEnabled(false);
342 this.menuBar.openTinyMappingsMenu.setEnabled(false);
339 this.menuBar.openEnigmaMappingsMenu.setEnabled(false); 343 this.menuBar.openEnigmaMappingsMenu.setEnabled(false);
340 this.menuBar.saveMappingsMenu.setEnabled(false); 344 this.menuBar.saveMappingsMenu.setEnabled(false);
341 this.menuBar.saveMappingEnigmaFileMenu.setEnabled(false); 345 this.menuBar.saveMappingEnigmaFileMenu.setEnabled(false);
diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java
index 1b461da7..c3cdbf83 100644
--- a/src/main/java/cuchaz/enigma/gui/GuiController.java
+++ b/src/main/java/cuchaz/enigma/gui/GuiController.java
@@ -71,6 +71,14 @@ public class GuiController {
71 refreshCurrentClass(); 71 refreshCurrentClass();
72 } 72 }
73 73
74 public void openTinyMappings(File file) throws IOException, MappingParseException {
75 this.deobfuscator.setMappings(new MappingsTinyReader().read(file));
76 this.isDirty = false;
77 this.gui.setMappingsFile(file);
78 refreshClasses();
79 refreshCurrentClass();
80 }
81
74 public void saveMappings(File file) throws IOException { 82 public void saveMappings(File file) throws IOException {
75 Mappings mappings = this.deobfuscator.getMappings(); 83 Mappings mappings = this.deobfuscator.getMappings();
76 switch (mappings.getOriginMappingFormat()) { 84 switch (mappings.getOriginMappingFormat()) {
diff --git a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
index cd11acaf..e446c5a5 100644
--- a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
+++ b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
@@ -14,6 +14,7 @@ public class MenuBar extends JMenuBar {
14 14
15 public final JMenuItem closeJarMenu; 15 public final JMenuItem closeJarMenu;
16 public final JMenuItem openEnigmaMappingsMenu; 16 public final JMenuItem openEnigmaMappingsMenu;
17 public final JMenuItem openTinyMappingsMenu;
17 public final JMenuItem saveMappingsMenu; 18 public final JMenuItem saveMappingsMenu;
18 public final JMenuItem saveMappingEnigmaFileMenu; 19 public final JMenuItem saveMappingEnigmaFileMenu;
19 public final JMenuItem saveMappingEnigmaDirectoryMenu; 20 public final JMenuItem saveMappingEnigmaDirectoryMenu;
@@ -71,6 +72,21 @@ public class MenuBar extends JMenuBar {
71 } 72 }
72 }); 73 });
73 this.openEnigmaMappingsMenu = item; 74 this.openEnigmaMappingsMenu = item;
75
76 item = new JMenuItem("Tiny");
77 openMenu.add(item);
78 item.addActionListener(event -> {
79 if (this.gui.tinyMappingsFileChooser.showOpenDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) {
80 try {
81 this.gui.getController().openTinyMappings(this.gui.tinyMappingsFileChooser.getSelectedFile());
82 } catch (IOException ex) {
83 throw new Error(ex);
84 } catch (MappingParseException ex) {
85 JOptionPane.showMessageDialog(this.gui.getFrame(), ex.getMessage());
86 }
87 }
88 });
89 this.openTinyMappingsMenu = item;
74 } 90 }
75 { 91 {
76 JMenuItem item = new JMenuItem("Save Mappings"); 92 JMenuItem item = new JMenuItem("Save Mappings");
diff --git a/src/main/java/cuchaz/enigma/mapping/ClassMapping.java b/src/main/java/cuchaz/enigma/mapping/ClassMapping.java
index 178dd3c6..1d1f558c 100644
--- a/src/main/java/cuchaz/enigma/mapping/ClassMapping.java
+++ b/src/main/java/cuchaz/enigma/mapping/ClassMapping.java
@@ -23,6 +23,7 @@ public class ClassMapping implements Comparable<ClassMapping> {
23 private String obfFullName; 23 private String obfFullName;
24 private String obfSimpleName; 24 private String obfSimpleName;
25 private String deobfName; 25 private String deobfName;
26 private String deobfFullName;
26 private String previousDeobfName; 27 private String previousDeobfName;
27 private Map<String, ClassMapping> innerClassesByObfSimple; 28 private Map<String, ClassMapping> innerClassesByObfSimple;
28 private Map<String, ClassMapping> innerClassesByObfFull; 29 private Map<String, ClassMapping> innerClassesByObfFull;
@@ -33,6 +34,7 @@ public class ClassMapping implements Comparable<ClassMapping> {
33 private Map<String, MethodMapping> methodsByDeobf; 34 private Map<String, MethodMapping> methodsByDeobf;
34 private boolean isDirty; 35 private boolean isDirty;
35 private Mappings.EntryModifier modifier; 36 private Mappings.EntryModifier modifier;
37 private boolean deobfInner;
36 38
37 public ClassMapping(String obfFullName) { 39 public ClassMapping(String obfFullName) {
38 this(obfFullName, null, Mappings.EntryModifier.UNCHANGED); 40 this(obfFullName, null, Mappings.EntryModifier.UNCHANGED);
@@ -497,6 +499,10 @@ public class ClassMapping implements Comparable<ClassMapping> {
497 return new ClassEntry(obfFullName); 499 return new ClassEntry(obfFullName);
498 } 500 }
499 501
502 public ClassEntry getDeObfEntry() {
503 return deobfFullName != null ? new ClassEntry(deobfFullName) : null;
504 }
505
500 public boolean isDirty() { 506 public boolean isDirty() {
501 return isDirty; 507 return isDirty;
502 } 508 }
@@ -534,4 +540,11 @@ public class ClassMapping implements Comparable<ClassMapping> {
534 this.isDirty = true; 540 this.isDirty = true;
535 } 541 }
536 } 542 }
543
544 // Used for tiny parsing to keep track of deobfuscate inner classes
545 public ClassMapping setDeobInner(String deobName)
546 {
547 this.deobfFullName = deobName;
548 return this;
549 }
537} 550}
diff --git a/src/main/java/cuchaz/enigma/mapping/Mappings.java b/src/main/java/cuchaz/enigma/mapping/Mappings.java
index 8aa463fd..cf78ca30 100644
--- a/src/main/java/cuchaz/enigma/mapping/Mappings.java
+++ b/src/main/java/cuchaz/enigma/mapping/Mappings.java
@@ -230,7 +230,7 @@ public class Mappings {
230 } 230 }
231 231
232 public enum FormatType { 232 public enum FormatType {
233 ENIGMA_FILE, ENIGMA_DIRECTORY, SRG_FILE 233 ENIGMA_FILE, ENIGMA_DIRECTORY, TINY_FILE, SRG_FILE
234 } 234 }
235 235
236 public enum EntryModifier { 236 public enum EntryModifier {
diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java b/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java
new file mode 100644
index 00000000..b2ba1917
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java
@@ -0,0 +1,99 @@
1package cuchaz.enigma.mapping;
2
3import com.google.common.base.Charsets;
4import com.google.common.collect.Maps;
5import cuchaz.enigma.throwables.MappingConflict;
6import cuchaz.enigma.throwables.MappingParseException;
7
8import java.io.File;
9import java.io.IOException;
10import java.nio.file.Files;
11import java.util.ArrayList;
12import java.util.List;
13import java.util.Map;
14
15public class MappingsTinyReader {
16 public ClassMapping readClass(String[] parts) {
17 // Extract the inner naming of the deob form if it have one
18 String deobName = parts[2].contains("$") ? parts[2].substring(parts[2].lastIndexOf('$') + 1) : parts[2];
19 return new ClassMapping(parts[1], deobName).setDeobInner(parts[2]);
20 }
21
22 public FieldMapping readField(String[] parts) {
23 return new FieldMapping(parts[3], new Type(parts[2]), parts[4], Mappings.EntryModifier.UNCHANGED);
24 }
25
26 public MethodMapping readMethod(String[] parts) {
27 return new MethodMapping(parts[3], new Signature(parts[2]), parts[4]);
28 }
29
30 public Mappings read(File file) throws IOException, MappingParseException {
31 Mappings mappings = new Mappings(Mappings.FormatType.TINY_FILE);
32 System.out.println(file);
33 List<String> lines = Files.readAllLines(file.toPath(), Charsets.UTF_8);
34 Map<String, ClassMapping> classMappingMap = Maps.newHashMap();
35 String header = lines.remove(0);
36 for (int lineNumber = 0; lineNumber < lines.size(); lineNumber++) {
37 String line = lines.get(lineNumber);
38 String[] parts = line.split("\\s");
39 try {
40 String token = parts[0];
41 ClassMapping classMapping;
42 switch (token) {
43 case "CLASS":
44 if (classMappingMap.containsKey(parts[1])) {
45 classMapping = classMappingMap.get(parts[1]);
46 String deobName = parts[2].contains("$") ?
47 parts[2].substring(parts[2].lastIndexOf('$') + 1) :
48 parts[2];
49 classMappingMap.put(parts[2], classMapping.setDeobInner(parts[2]));
50 classMapping.setDeobfName(deobName);
51 classMapping.resetDirty();
52 } else
53 classMapping = readClass(parts);
54 classMappingMap.put(parts[1], classMapping);
55 break;
56 case "FIELD":
57 classMapping = classMappingMap.computeIfAbsent(parts[1], k -> new ClassMapping(parts[1]));
58 //throw new MappingParseException(file, lineNumber, "Cannot find class '" + parts[1] + "' declaration!");
59 classMapping.addFieldMapping(readField(parts));
60 break;
61 case "METHOD":
62 classMapping = classMappingMap.computeIfAbsent(parts[1], k -> new ClassMapping(parts[1]));
63 //throw new MappingParseException(file, lineNumber, "Cannot find class '" + parts[1] + "' declaration!");
64 classMapping.addMethodMapping(readMethod(parts));
65 break;
66 default:
67 throw new MappingParseException(file, lineNumber, "Unknown token '" + token + "' !");
68 }
69 } catch (ArrayIndexOutOfBoundsException | IllegalArgumentException ex) {
70 throw new MappingParseException(file, lineNumber, "Malformed line:\n" + line);
71 }
72 }
73
74 List<ClassMapping> toRegister = new ArrayList<>(classMappingMap.values());
75 for (ClassMapping classMapping : toRegister) {
76 ClassEntry obEntry = classMapping.getObfEntry();
77 ClassEntry deobEntry = classMapping.getDeObfEntry();
78 try {
79 if (obEntry.isInnerClass()) {
80 ClassMapping parent = classMappingMap.get(obEntry.getOuterClassName());
81 if (parent == null) {
82 parent = new ClassMapping(obEntry.getOuterClassName());
83 classMappingMap.put(obEntry.getOuterClassName(), parent);
84 mappings.addClassMapping(parent);
85 }
86 parent.addInnerClassMapping(classMapping);
87 } else if (deobEntry != null && deobEntry.isInnerClass())
88 classMappingMap.get(deobEntry.getOuterClassName()).addInnerClassMapping(classMapping);
89 else
90 mappings.addClassMapping(classMapping);
91 } catch (MappingConflict e) {
92 throw new MappingParseException(file, -1, e.getMessage());
93 }
94 }
95 lines.clear();
96 classMappingMap.clear();
97 return mappings;
98 }
99}