summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/gui/GuiController.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuchaz/enigma/gui/GuiController.java')
-rw-r--r--src/cuchaz/enigma/gui/GuiController.java94
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;
14import java.io.FileReader; 14import java.io.FileReader;
15import java.io.FileWriter; 15import java.io.FileWriter;
16import java.io.IOException; 16import java.io.IOException;
17import java.util.ArrayList;
18import java.util.List; 17import java.util.List;
18import java.util.Map;
19
20import jsyntaxpane.Token;
21
22import com.beust.jcommander.internal.Lists;
23import com.beust.jcommander.internal.Maps;
19 24
20import cuchaz.enigma.ClassFile; 25import cuchaz.enigma.ClassFile;
21import cuchaz.enigma.Deobfuscator; 26import cuchaz.enigma.Deobfuscator;
22import cuchaz.enigma.analysis.Analyzer; 27import cuchaz.enigma.analysis.Analyzer;
23import cuchaz.enigma.analysis.SourceIndex; 28import cuchaz.enigma.analysis.SourceIndex;
24import cuchaz.enigma.mapping.ClassEntry;
25import cuchaz.enigma.mapping.Entry; 29import cuchaz.enigma.mapping.Entry;
26import cuchaz.enigma.mapping.EntryPair; 30import cuchaz.enigma.mapping.EntryPair;
27import cuchaz.enigma.mapping.MappingsReader; 31import 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 }