summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/mapping/Renamer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuchaz/enigma/mapping/Renamer.java')
-rw-r--r--src/cuchaz/enigma/mapping/Renamer.java125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/cuchaz/enigma/mapping/Renamer.java b/src/cuchaz/enigma/mapping/Renamer.java
new file mode 100644
index 0000000..4a648ad
--- /dev/null
+++ b/src/cuchaz/enigma/mapping/Renamer.java
@@ -0,0 +1,125 @@
1/*******************************************************************************
2 * Copyright (c) 2014 Jeff Martin.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the GNU Public License v3.0
5 * which accompanies this distribution, and is available at
6 * http://www.gnu.org/licenses/gpl.html
7 *
8 * Contributors:
9 * Jeff Martin - initial API and implementation
10 ******************************************************************************/
11package cuchaz.enigma.mapping;
12
13import java.io.IOException;
14import java.io.ObjectOutputStream;
15import java.io.OutputStream;
16import java.util.zip.GZIPOutputStream;
17
18public class Renamer
19{
20 private Ancestries m_ancestries;
21 private Mappings m_mappings;
22
23 public Renamer( Ancestries ancestries, Mappings mappings )
24 {
25 m_ancestries = ancestries;
26 m_mappings = mappings;
27 }
28
29 public void setClassName( ClassEntry obf, String deobfName )
30 {
31 ClassMapping classMapping = m_mappings.m_classesByObf.get( obf.getName() );
32 if( classMapping == null )
33 {
34 classMapping = createClassMapping( obf );
35 }
36
37 m_mappings.m_classesByDeobf.remove( classMapping.getDeobfName() );
38 classMapping.setDeobfName( deobfName );
39 m_mappings.m_classesByDeobf.put( deobfName, classMapping );
40
41 updateDeobfMethodSignatures();
42
43 // TEMP
44 String translatedName = m_mappings.getTranslator( m_ancestries, TranslationDirection.Deobfuscating ).translate( obf );
45 assert( translatedName != null && translatedName.equals( deobfName ) );
46 }
47
48 public void setFieldName( FieldEntry obf, String deobfName )
49 {
50 ClassMapping classMapping = m_mappings.m_classesByObf.get( obf.getClassName() );
51 if( classMapping == null )
52 {
53 classMapping = createClassMapping( obf.getClassEntry() );
54 }
55
56 classMapping.setFieldName( obf.getName(), deobfName );
57
58 // TEMP
59 System.out.println( classMapping );
60 String translatedName = m_mappings.getTranslator( m_ancestries, TranslationDirection.Deobfuscating ).translate( obf );
61 assert( translatedName != null && translatedName.equals( deobfName ) );
62 }
63
64 public void setMethodName( MethodEntry obf, String deobfName )
65 {
66 ClassMapping classMapping = m_mappings.m_classesByObf.get( obf.getClassName() );
67 if( classMapping == null )
68 {
69 classMapping = createClassMapping( obf.getClassEntry() );
70 }
71
72 String deobfSignature = m_mappings.getTranslator( m_ancestries, TranslationDirection.Deobfuscating ).translateSignature( obf.getSignature() );
73 classMapping.setMethodNameAndSignature( obf.getName(), obf.getSignature(), deobfName, deobfSignature );
74
75 // TODO: update ancestor/descendant methods in other classes in the inheritance hierarchy too
76
77 // TEMP
78 System.out.println( classMapping );
79 String translatedName = m_mappings.getTranslator( m_ancestries, TranslationDirection.Deobfuscating ).translate( obf );
80 assert( translatedName != null && translatedName.equals( deobfName ) );
81 }
82
83 public void setArgumentName( ArgumentEntry obf, String deobfName )
84 {
85 ClassMapping classMapping = m_mappings.m_classesByObf.get( obf.getClassName() );
86 if( classMapping == null )
87 {
88 classMapping = createClassMapping( obf.getClassEntry() );
89 }
90
91 classMapping.setArgumentName( obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), deobfName );
92
93 // TEMP
94 System.out.println( classMapping );
95 String translatedName = m_mappings.getTranslator( m_ancestries, TranslationDirection.Deobfuscating ).translate( obf );
96 assert( translatedName != null && translatedName.equals( deobfName ) );
97 }
98
99 public void write( OutputStream out )
100 throws IOException
101 {
102 // TEMP: just use the object output for now. We can find a more efficient storage format later
103 GZIPOutputStream gzipout = new GZIPOutputStream( out );
104 ObjectOutputStream oout = new ObjectOutputStream( gzipout );
105 oout.writeObject( this );
106 gzipout.finish();
107 }
108
109 private ClassMapping createClassMapping( ClassEntry obf )
110 {
111 ClassMapping classMapping = new ClassMapping( obf.getName(), obf.getName() );
112 m_mappings.m_classesByObf.put( classMapping.getObfName(), classMapping );
113 m_mappings.m_classesByDeobf.put( classMapping.getDeobfName(), classMapping );
114 return classMapping;
115 }
116
117 private void updateDeobfMethodSignatures( )
118 {
119 Translator translator = m_mappings.getTranslator( m_ancestries, TranslationDirection.Deobfuscating );
120 for( ClassMapping classMapping : m_mappings.m_classesByObf.values() )
121 {
122 classMapping.updateDeobfMethodSignatures( translator );
123 }
124 }
125}