diff options
| author | 2018-12-08 11:21:18 +0100 | |
|---|---|---|
| committer | 2018-12-08 11:21:18 +0100 | |
| commit | 4bc3afe4ff08b9f0c08952ec7f6e0ac930280cc5 (patch) | |
| tree | 99e43aa385d7fa1248c7fe474c022db55c364592 /src/main/java/cuchaz/enigma/gui/GuiController.java | |
| parent | work around Procyon weirdness (diff) | |
| download | enigma-fork-4bc3afe4ff08b9f0c08952ec7f6e0ac930280cc5.tar.gz enigma-fork-4bc3afe4ff08b9f0c08952ec7f6e0ac930280cc5.tar.xz enigma-fork-4bc3afe4ff08b9f0c08952ec7f6e0ac930280cc5.zip | |
add barebones plugin framework, cleanup
Diffstat (limited to 'src/main/java/cuchaz/enigma/gui/GuiController.java')
| -rw-r--r-- | src/main/java/cuchaz/enigma/gui/GuiController.java | 81 |
1 files changed, 63 insertions, 18 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java index 6e15bb0..e2f332d 100644 --- a/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/src/main/java/cuchaz/enigma/gui/GuiController.java | |||
| @@ -11,13 +11,14 @@ | |||
| 11 | 11 | ||
| 12 | package cuchaz.enigma.gui; | 12 | package cuchaz.enigma.gui; |
| 13 | 13 | ||
| 14 | import com.google.common.collect.ImmutableMap; | ||
| 14 | import com.google.common.collect.Lists; | 15 | import com.google.common.collect.Lists; |
| 15 | import com.google.common.collect.Queues; | 16 | import com.google.common.collect.Queues; |
| 16 | import com.strobel.decompiler.languages.java.ast.CompilationUnit; | 17 | import com.strobel.decompiler.languages.java.ast.CompilationUnit; |
| 17 | import cuchaz.enigma.Deobfuscator; | 18 | import cuchaz.enigma.Deobfuscator; |
| 18 | import cuchaz.enigma.analysis.*; | 19 | import cuchaz.enigma.analysis.*; |
| 20 | import cuchaz.enigma.api.EnigmaPlugin; | ||
| 19 | import cuchaz.enigma.config.Config; | 21 | import cuchaz.enigma.config.Config; |
| 20 | import cuchaz.enigma.config.Themes; | ||
| 21 | import cuchaz.enigma.gui.dialog.ProgressDialog; | 22 | import cuchaz.enigma.gui.dialog.ProgressDialog; |
| 22 | import cuchaz.enigma.mapping.*; | 23 | import cuchaz.enigma.mapping.*; |
| 23 | import cuchaz.enigma.mapping.entry.ClassEntry; | 24 | import cuchaz.enigma.mapping.entry.ClassEntry; |
| @@ -30,9 +31,7 @@ import cuchaz.enigma.utils.ReadableToken; | |||
| 30 | import java.awt.event.ItemEvent; | 31 | import java.awt.event.ItemEvent; |
| 31 | import java.io.File; | 32 | import java.io.File; |
| 32 | import java.io.IOException; | 33 | import java.io.IOException; |
| 33 | import java.util.Collection; | 34 | import java.util.*; |
| 34 | import java.util.Deque; | ||
| 35 | import java.util.List; | ||
| 36 | import java.util.jar.JarFile; | 35 | import java.util.jar.JarFile; |
| 37 | 36 | ||
| 38 | public class GuiController { | 37 | public class GuiController { |
| @@ -58,8 +57,10 @@ public class GuiController { | |||
| 58 | } | 57 | } |
| 59 | 58 | ||
| 60 | public void openJar(final JarFile jar) throws IOException { | 59 | public void openJar(final JarFile jar) throws IOException { |
| 61 | this.gui.onStartOpenJar(); | 60 | this.gui.onStartOpenJar("Loading JAR..."); |
| 62 | this.deobfuscator = new Deobfuscator(jar); | 61 | this.deobfuscator = new Deobfuscator(jar, (msg) -> { |
| 62 | this.gui.onStartOpenJar(msg); | ||
| 63 | }); | ||
| 63 | this.gui.onFinishOpenJar(jar.getName()); | 64 | this.gui.onFinishOpenJar(jar.getName()); |
| 64 | refreshClasses(); | 65 | refreshClasses(); |
| 65 | } | 66 | } |
| @@ -162,7 +163,7 @@ public class GuiController { | |||
| 162 | } | 163 | } |
| 163 | 164 | ||
| 164 | public boolean referenceIsRenameable(EntryReference<Entry, Entry> deobfReference) { | 165 | public boolean referenceIsRenameable(EntryReference<Entry, Entry> deobfReference) { |
| 165 | return this.deobfuscator.isRenameable(this.deobfuscator.obfuscateReference(deobfReference), true); | 166 | return this.deobfuscator.isRenameable(this.deobfuscator.obfuscateReference(deobfReference)); |
| 166 | } | 167 | } |
| 167 | 168 | ||
| 168 | public ClassInheritanceTreeNode getClassInheritance(ClassEntry deobfClassEntry) { | 169 | public ClassInheritanceTreeNode getClassInheritance(ClassEntry deobfClassEntry) { |
| @@ -334,29 +335,73 @@ public class GuiController { | |||
| 334 | } | 335 | } |
| 335 | String source = deobfuscator.getSource(sourceTree); | 336 | String source = deobfuscator.getSource(sourceTree); |
| 336 | index = deobfuscator.getSourceIndex(sourceTree, source); | 337 | index = deobfuscator.getSourceIndex(sourceTree, source); |
| 337 | gui.setSource(index.getSource()); | 338 | |
| 338 | if (obfReference != null) { | 339 | String sourceString = index.getSource(); |
| 339 | showReference(obfReference); | ||
| 340 | } | ||
| 341 | 340 | ||
| 342 | // set the highlighted tokens | 341 | // set the highlighted tokens |
| 343 | List<Token> obfuscatedTokens = Lists.newArrayList(); | 342 | List<Token> obfuscatedTokens = Lists.newArrayList(); |
| 343 | List<Token> proposedTokens = Lists.newArrayList(); | ||
| 344 | List<Token> deobfuscatedTokens = Lists.newArrayList(); | 344 | List<Token> deobfuscatedTokens = Lists.newArrayList(); |
| 345 | List<Token> otherTokens = Lists.newArrayList(); | 345 | List<Token> otherTokens = Lists.newArrayList(); |
| 346 | for (Token token : index.referenceTokens()) { | 346 | |
| 347 | EntryReference<Entry, Entry> reference = index.getDeobfReference(token); | 347 | int offset = 0; |
| 348 | Map<Token, Token> tokenRemap = new IdentityHashMap<>(); | ||
| 349 | boolean remapped = false; | ||
| 350 | |||
| 351 | for (Token inToken : index.referenceTokens()) { | ||
| 352 | EntryReference<Entry, Entry> reference = index.getDeobfReference(inToken); | ||
| 353 | Token token = inToken.move(offset); | ||
| 354 | |||
| 348 | if (referenceIsRenameable(reference)) { | 355 | if (referenceIsRenameable(reference)) { |
| 349 | if (entryHasDeobfuscatedName(reference.getNameableEntry())) { | 356 | boolean renamed = false; |
| 350 | deobfuscatedTokens.add(token); | 357 | |
| 351 | } else { | 358 | if (!entryHasDeobfuscatedName(reference.getNameableEntry())) { |
| 352 | obfuscatedTokens.add(token); | 359 | Entry obfEntry = deobfuscator.obfuscateEntry(reference.getNameableEntry()); |
| 360 | if (obfEntry instanceof FieldEntry) { | ||
| 361 | for (EnigmaPlugin plugin : deobfuscator.getPlugins()) { | ||
| 362 | String proposal = plugin.proposeFieldName(obfEntry.getClassName(), obfEntry.getName(), ((FieldEntry) obfEntry).getDesc().toString()); | ||
| 363 | if (proposal != null) { | ||
| 364 | proposedTokens.add(token); | ||
| 365 | offset += token.getRenameOffset(proposal); | ||
| 366 | sourceString = token.rename(sourceString, proposal); | ||
| 367 | renamed = true; | ||
| 368 | remapped = true; | ||
| 369 | break; | ||
| 370 | } | ||
| 371 | } | ||
| 372 | } | ||
| 373 | } | ||
| 374 | |||
| 375 | if (!renamed) { | ||
| 376 | if (entryHasDeobfuscatedName(reference.getNameableEntry())) { | ||
| 377 | deobfuscatedTokens.add(token); | ||
| 378 | } else { | ||
| 379 | obfuscatedTokens.add(token); | ||
| 380 | } | ||
| 353 | } | 381 | } |
| 354 | } else { | 382 | } else { |
| 355 | otherTokens.add(token); | 383 | otherTokens.add(token); |
| 356 | } | 384 | } |
| 385 | |||
| 386 | tokenRemap.put(inToken, token); | ||
| 387 | } | ||
| 388 | |||
| 389 | if (remapped) { | ||
| 390 | index.remap(sourceString, tokenRemap); | ||
| 391 | } | ||
| 392 | |||
| 393 | gui.setSource(sourceString); | ||
| 394 | if (obfReference != null) { | ||
| 395 | showReference(obfReference); | ||
| 357 | } | 396 | } |
| 397 | |||
| 358 | gui.setEditorTheme(Config.getInstance().lookAndFeel); | 398 | gui.setEditorTheme(Config.getInstance().lookAndFeel); |
| 359 | gui.setHighlightedTokens(obfuscatedTokens, deobfuscatedTokens, otherTokens); | 399 | gui.setHighlightedTokens(ImmutableMap.of( |
| 400 | "obfuscated", obfuscatedTokens, | ||
| 401 | "proposed", proposedTokens, | ||
| 402 | "deobfuscated", deobfuscatedTokens, | ||
| 403 | "other", otherTokens | ||
| 404 | )); | ||
| 360 | }).start(); | 405 | }).start(); |
| 361 | } | 406 | } |
| 362 | 407 | ||