diff options
Diffstat (limited to 'src/cuchaz/enigma/gui/GuiController.java')
| -rw-r--r-- | src/cuchaz/enigma/gui/GuiController.java | 94 |
1 files changed, 67 insertions, 27 deletions
diff --git a/src/cuchaz/enigma/gui/GuiController.java b/src/cuchaz/enigma/gui/GuiController.java index 6704ef8..e1ba49a 100644 --- a/src/cuchaz/enigma/gui/GuiController.java +++ b/src/cuchaz/enigma/gui/GuiController.java | |||
| @@ -14,14 +14,18 @@ import java.io.File; | |||
| 14 | import java.io.FileReader; | 14 | import java.io.FileReader; |
| 15 | import java.io.FileWriter; | 15 | import java.io.FileWriter; |
| 16 | import java.io.IOException; | 16 | import java.io.IOException; |
| 17 | import java.util.ArrayList; | ||
| 18 | import java.util.List; | 17 | import java.util.List; |
| 18 | import java.util.Map; | ||
| 19 | |||
| 20 | import jsyntaxpane.Token; | ||
| 21 | |||
| 22 | import com.beust.jcommander.internal.Lists; | ||
| 23 | import com.beust.jcommander.internal.Maps; | ||
| 19 | 24 | ||
| 20 | import cuchaz.enigma.ClassFile; | 25 | import cuchaz.enigma.ClassFile; |
| 21 | import cuchaz.enigma.Deobfuscator; | 26 | import cuchaz.enigma.Deobfuscator; |
| 22 | import cuchaz.enigma.analysis.Analyzer; | 27 | import cuchaz.enigma.analysis.Analyzer; |
| 23 | import cuchaz.enigma.analysis.SourceIndex; | 28 | import cuchaz.enigma.analysis.SourceIndex; |
| 24 | import cuchaz.enigma.mapping.ClassEntry; | ||
| 25 | import cuchaz.enigma.mapping.Entry; | 29 | import cuchaz.enigma.mapping.Entry; |
| 26 | import cuchaz.enigma.mapping.EntryPair; | 30 | import cuchaz.enigma.mapping.EntryPair; |
| 27 | import cuchaz.enigma.mapping.MappingsReader; | 31 | import cuchaz.enigma.mapping.MappingsReader; |
| @@ -33,6 +37,7 @@ public class GuiController | |||
| 33 | private Gui m_gui; | 37 | private Gui m_gui; |
| 34 | private SourceIndex m_index; | 38 | private SourceIndex m_index; |
| 35 | private ClassFile m_currentFile; | 39 | private ClassFile m_currentFile; |
| 40 | private boolean m_isDirty; | ||
| 36 | 41 | ||
| 37 | public GuiController( Gui gui ) | 42 | public GuiController( Gui gui ) |
| 38 | { | 43 | { |
| @@ -40,6 +45,12 @@ public class GuiController | |||
| 40 | m_deobfuscator = null; | 45 | m_deobfuscator = null; |
| 41 | m_index = null; | 46 | m_index = null; |
| 42 | m_currentFile = null; | 47 | m_currentFile = null; |
| 48 | m_isDirty = false; | ||
| 49 | } | ||
| 50 | |||
| 51 | public boolean isDirty( ) | ||
| 52 | { | ||
| 53 | return m_isDirty; | ||
| 43 | } | 54 | } |
| 44 | 55 | ||
| 45 | public void openJar( File file ) | 56 | public void openJar( File file ) |
| @@ -62,6 +73,7 @@ public class GuiController | |||
| 62 | FileReader in = new FileReader( file ); | 73 | FileReader in = new FileReader( file ); |
| 63 | m_deobfuscator.setMappings( new MappingsReader().read( in ) ); | 74 | m_deobfuscator.setMappings( new MappingsReader().read( in ) ); |
| 64 | in.close(); | 75 | in.close(); |
| 76 | m_isDirty = false; | ||
| 65 | m_gui.setMappingsFile( file ); | 77 | m_gui.setMappingsFile( file ); |
| 66 | refreshClasses(); | 78 | refreshClasses(); |
| 67 | refreshOpenFiles(); | 79 | refreshOpenFiles(); |
| @@ -73,12 +85,14 @@ public class GuiController | |||
| 73 | FileWriter out = new FileWriter( file ); | 85 | FileWriter out = new FileWriter( file ); |
| 74 | new MappingsWriter().write( out, m_deobfuscator.getMappings() ); | 86 | new MappingsWriter().write( out, m_deobfuscator.getMappings() ); |
| 75 | out.close(); | 87 | out.close(); |
| 88 | m_isDirty = false; | ||
| 76 | } | 89 | } |
| 77 | 90 | ||
| 78 | public void closeMappings( ) | 91 | public void closeMappings( ) |
| 79 | { | 92 | { |
| 80 | m_deobfuscator.setMappings( null ); | 93 | m_deobfuscator.setMappings( null ); |
| 81 | m_gui.setMappingsFile( null ); | 94 | m_gui.setMappingsFile( null ); |
| 95 | refreshClasses(); | ||
| 82 | refreshOpenFiles(); | 96 | refreshOpenFiles(); |
| 83 | } | 97 | } |
| 84 | 98 | ||
| @@ -95,52 +109,63 @@ public class GuiController | |||
| 95 | return null; | 109 | return null; |
| 96 | } | 110 | } |
| 97 | 111 | ||
| 98 | Entry deobfEntry = m_index.getEntry( pos ); | 112 | Map.Entry<Entry,Token> deobfEntryAndToken = m_index.getEntry( pos ); |
| 99 | if( deobfEntry == null ) | 113 | if( deobfEntryAndToken == null ) |
| 100 | { | 114 | { |
| 101 | return null; | 115 | return null; |
| 102 | } | 116 | } |
| 103 | return new EntryPair<Entry>( m_deobfuscator.obfuscate( deobfEntry ), deobfEntry ); | 117 | Entry deobfEntry = deobfEntryAndToken.getKey(); |
| 118 | Token token = deobfEntryAndToken.getValue(); | ||
| 119 | return new EntryPair<Entry>( m_deobfuscator.obfuscateEntry( deobfEntry ), deobfEntry, token ); | ||
| 104 | } | 120 | } |
| 105 | 121 | ||
| 106 | public void rename( Entry obfsEntry, String newName ) | 122 | public boolean entryHasMapping( int pos ) |
| 107 | { | 123 | { |
| 108 | m_deobfuscator.rename( obfsEntry, newName ); | 124 | EntryPair<Entry> pair = getEntryPair( pos ); |
| 109 | 125 | if( pair == null || pair.obf == null ) | |
| 110 | // did we rename the current file? | ||
| 111 | if( obfsEntry instanceof ClassEntry ) | ||
| 112 | { | 126 | { |
| 113 | ClassEntry classEntry = (ClassEntry)obfsEntry; | 127 | return false; |
| 114 | |||
| 115 | // update the current file | ||
| 116 | if( classEntry.getName().equals( m_currentFile.getName() ) ) | ||
| 117 | { | ||
| 118 | m_currentFile = new ClassFile( newName ); | ||
| 119 | } | ||
| 120 | } | 128 | } |
| 121 | 129 | return m_deobfuscator.hasMapping( pair.obf ); | |
| 122 | refreshOpenFiles(); | 130 | } |
| 131 | |||
| 132 | public void rename( Entry obfsEntry, String newName, int lineNum ) | ||
| 133 | { | ||
| 134 | m_deobfuscator.rename( obfsEntry, newName ); | ||
| 135 | m_isDirty = true; | ||
| 136 | refreshClasses(); | ||
| 137 | refreshOpenFiles( lineNum ); | ||
| 123 | } | 138 | } |
| 124 | 139 | ||
| 125 | private void refreshClasses( ) | 140 | private void refreshClasses( ) |
| 126 | { | 141 | { |
| 127 | List<ClassFile> obfClasses = new ArrayList<ClassFile>(); | 142 | List<ClassFile> obfClasses = Lists.newArrayList(); |
| 128 | List<ClassFile> deobfClasses = new ArrayList<ClassFile>(); | 143 | Map<ClassFile,String> deobfClasses = Maps.newHashMap(); |
| 129 | m_deobfuscator.getSortedClasses( obfClasses, deobfClasses ); | 144 | m_deobfuscator.getSeparatedClasses( obfClasses, deobfClasses ); |
| 130 | m_gui.setObfClasses( obfClasses ); | 145 | m_gui.setObfClasses( obfClasses ); |
| 131 | m_gui.setDeobfClasses( deobfClasses ); | 146 | m_gui.setDeobfClasses( deobfClasses ); |
| 132 | } | 147 | } |
| 133 | 148 | ||
| 134 | private void refreshOpenFiles( ) | 149 | private void refreshOpenFiles( ) |
| 135 | { | 150 | { |
| 151 | refreshOpenFiles( 0 ); | ||
| 152 | } | ||
| 153 | |||
| 154 | private void refreshOpenFiles( int lineNum ) | ||
| 155 | { | ||
| 136 | if( m_currentFile != null ) | 156 | if( m_currentFile != null ) |
| 137 | { | 157 | { |
| 138 | deobfuscate( m_currentFile ); | 158 | deobfuscate( m_currentFile, lineNum ); |
| 139 | } | 159 | } |
| 140 | } | 160 | } |
| 141 | 161 | ||
| 142 | private void deobfuscate( final ClassFile classFile ) | 162 | private void deobfuscate( final ClassFile classFile ) |
| 143 | { | 163 | { |
| 164 | deobfuscate( classFile, 0 ); | ||
| 165 | } | ||
| 166 | |||
| 167 | private void deobfuscate( final ClassFile classFile, final int lineNum ) | ||
| 168 | { | ||
| 144 | m_gui.setSource( "(deobfuscating...)" ); | 169 | m_gui.setSource( "(deobfuscating...)" ); |
| 145 | 170 | ||
| 146 | // run the deobfuscator in a separate thread so we don't block the GUI event queue | 171 | // run the deobfuscator in a separate thread so we don't block the GUI event queue |
| @@ -149,13 +174,28 @@ public class GuiController | |||
| 149 | @Override | 174 | @Override |
| 150 | public void run( ) | 175 | public void run( ) |
| 151 | { | 176 | { |
| 152 | // deobfuscate the bytecode | 177 | // deobfuscate,decompile the bytecode |
| 153 | String source = m_deobfuscator.getSource( classFile ); | 178 | String source = m_deobfuscator.getSource( classFile ); |
| 154 | m_gui.setSource( source ); | 179 | m_gui.setSource( source, lineNum ); |
| 155 | 180 | ||
| 156 | // index the source file | 181 | // index the source file |
| 157 | m_index = Analyzer.analyze( classFile.getName(), source ); | 182 | m_index = Analyzer.analyze( classFile.getName(), source ); |
| 158 | m_gui.setHighlightedTokens( m_index.tokens() ); | 183 | |
| 184 | // set the highlighted tokens | ||
| 185 | List<Token> obfuscatedTokens = Lists.newArrayList(); | ||
| 186 | List<Token> deobfuscatedTokens = Lists.newArrayList(); | ||
| 187 | for( Token token : m_index.tokens() ) | ||
| 188 | { | ||
| 189 | if( entryHasMapping( token.start ) ) | ||
| 190 | { | ||
| 191 | deobfuscatedTokens.add( token ); | ||
| 192 | } | ||
| 193 | else | ||
| 194 | { | ||
| 195 | obfuscatedTokens.add( token ); | ||
| 196 | } | ||
| 197 | } | ||
| 198 | m_gui.setHighlightedTokens( obfuscatedTokens, deobfuscatedTokens ); | ||
| 159 | } | 199 | } |
| 160 | }.start(); | 200 | }.start(); |
| 161 | } | 201 | } |