diff options
| author | 2014-09-03 00:20:36 -0400 | |
|---|---|---|
| committer | 2014-09-03 00:20:36 -0400 | |
| commit | b5338883d271779c335842c07047d60136316167 (patch) | |
| tree | 006477e8c1ea0ade75ae8a9003abaf1978995fd7 /src/cuchaz/enigma/mapping/Mappings.java | |
| parent | fixed bug with export progress bar (diff) | |
| download | enigma-fork-b5338883d271779c335842c07047d60136316167.tar.gz enigma-fork-b5338883d271779c335842c07047d60136316167.tar.xz enigma-fork-b5338883d271779c335842c07047d60136316167.zip | |
big refactor to better model class/method mappings with no deobf name
Diffstat (limited to 'src/cuchaz/enigma/mapping/Mappings.java')
| -rw-r--r-- | src/cuchaz/enigma/mapping/Mappings.java | 90 |
1 files changed, 62 insertions, 28 deletions
diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index f52094f..99cb85f 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java | |||
| @@ -47,7 +47,10 @@ public class Mappings implements Serializable | |||
| 47 | for( ClassMapping classMapping : classes ) | 47 | for( ClassMapping classMapping : classes ) |
| 48 | { | 48 | { |
| 49 | m_classesByObf.put( classMapping.getObfName(), classMapping ); | 49 | m_classesByObf.put( classMapping.getObfName(), classMapping ); |
| 50 | m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); | 50 | if( classMapping.getDeobfName() != null ) |
| 51 | { | ||
| 52 | m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); | ||
| 53 | } | ||
| 51 | } | 54 | } |
| 52 | } | 55 | } |
| 53 | 56 | ||
| @@ -68,23 +71,27 @@ public class Mappings implements Serializable | |||
| 68 | 71 | ||
| 69 | public Collection<ClassMapping> classes( ) | 72 | public Collection<ClassMapping> classes( ) |
| 70 | { | 73 | { |
| 71 | assert( m_classesByObf.size() == m_classesByDeobf.size() ); | 74 | assert( m_classesByObf.size() >= m_classesByDeobf.size() ); |
| 72 | return m_classesByObf.values(); | 75 | return m_classesByObf.values(); |
| 73 | } | 76 | } |
| 74 | 77 | ||
| 75 | protected void addClassMapping( ClassMapping classMapping ) | 78 | public void addClassMapping( ClassMapping classMapping ) |
| 76 | { | 79 | { |
| 77 | if( m_classesByObf.containsKey( classMapping.getObfName() ) ) | 80 | if( m_classesByObf.containsKey( classMapping.getObfName() ) ) |
| 78 | { | 81 | { |
| 79 | throw new Error( "Already have mapping for " + classMapping.getObfName() ); | 82 | throw new Error( "Already have mapping for " + classMapping.getObfName() ); |
| 80 | } | 83 | } |
| 81 | if( m_classesByDeobf.containsKey( classMapping.getDeobfName() ) ) | 84 | boolean obfWasAdded = m_classesByObf.put( classMapping.getObfName(), classMapping ) == null; |
| 85 | assert( obfWasAdded ); | ||
| 86 | if( classMapping.getDeobfName() != null ) | ||
| 82 | { | 87 | { |
| 83 | throw new Error( "Already have mapping for " + classMapping.getDeobfName() ); | 88 | if( m_classesByDeobf.containsKey( classMapping.getDeobfName() ) ) |
| 89 | { | ||
| 90 | throw new Error( "Already have mapping for " + classMapping.getDeobfName() ); | ||
| 91 | } | ||
| 92 | boolean deobfWasAdded = m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ) == null; | ||
| 93 | assert( deobfWasAdded ); | ||
| 84 | } | 94 | } |
| 85 | m_classesByObf.put( classMapping.getObfName(), classMapping ); | ||
| 86 | m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); | ||
| 87 | assert( m_classesByObf.size() == m_classesByDeobf.size() ); | ||
| 88 | } | 95 | } |
| 89 | 96 | ||
| 90 | public ClassMapping getClassByObf( ClassEntry entry ) | 97 | public ClassMapping getClassByObf( ClassEntry entry ) |
| @@ -99,7 +106,7 @@ public class Mappings implements Serializable | |||
| 99 | 106 | ||
| 100 | public ClassMapping getClassByDeobf( ClassEntry entry ) | 107 | public ClassMapping getClassByDeobf( ClassEntry entry ) |
| 101 | { | 108 | { |
| 102 | return getClassByObf( entry.getName() ); | 109 | return getClassByDeobf( entry.getName() ); |
| 103 | } | 110 | } |
| 104 | 111 | ||
| 105 | public ClassMapping getClassByDeobf( String deobfName ) | 112 | public ClassMapping getClassByDeobf( String deobfName ) |
| @@ -109,26 +116,52 @@ public class Mappings implements Serializable | |||
| 109 | 116 | ||
| 110 | public Translator getTranslator( TranslationIndex index, TranslationDirection direction ) | 117 | public Translator getTranslator( TranslationIndex index, TranslationDirection direction ) |
| 111 | { | 118 | { |
| 112 | if( direction == TranslationDirection.Obfuscating ) | 119 | switch( direction ) |
| 113 | { | 120 | { |
| 114 | // deobfuscate the index | 121 | case Deobfuscating: |
| 115 | index = new TranslationIndex( index ); | 122 | |
| 116 | Map<String,String> renames = Maps.newHashMap(); | 123 | return new Translator( direction, m_classesByObf, index ); |
| 117 | for( ClassMapping classMapping : classes() ) | 124 | |
| 118 | { | 125 | case Obfuscating: |
| 119 | renames.put( classMapping.getObfName(), classMapping.getDeobfName() ); | 126 | |
| 120 | for( ClassMapping innerClassMapping : classMapping.innerClasses() ) | 127 | // deobfuscate the index |
| 128 | index = new TranslationIndex( index ); | ||
| 129 | Map<String,String> renames = Maps.newHashMap(); | ||
| 130 | for( ClassMapping classMapping : classes() ) | ||
| 121 | { | 131 | { |
| 122 | renames.put( innerClassMapping.getObfName(), innerClassMapping.getDeobfName() ); | 132 | if( classMapping.getDeobfName() != null ) |
| 133 | { | ||
| 134 | renames.put( classMapping.getObfName(), classMapping.getDeobfName() ); | ||
| 135 | } | ||
| 136 | for( ClassMapping innerClassMapping : classMapping.innerClasses() ) | ||
| 137 | { | ||
| 138 | if( innerClassMapping.getDeobfName() != null ) | ||
| 139 | { | ||
| 140 | renames.put( innerClassMapping.getObfName(), innerClassMapping.getDeobfName() ); | ||
| 141 | } | ||
| 142 | } | ||
| 123 | } | 143 | } |
| 124 | } | 144 | index.renameClasses( renames ); |
| 125 | index.renameClasses( renames ); | 145 | |
| 146 | // fill in the missing deobf class entries with obf entries | ||
| 147 | Map<String,ClassMapping> classes = Maps.newHashMap(); | ||
| 148 | for( ClassMapping classMapping : classes() ) | ||
| 149 | { | ||
| 150 | if( classMapping.getDeobfName() != null ) | ||
| 151 | { | ||
| 152 | classes.put( classMapping.getDeobfName(), classMapping ); | ||
| 153 | } | ||
| 154 | else | ||
| 155 | { | ||
| 156 | classes.put( classMapping.getObfName(), classMapping ); | ||
| 157 | } | ||
| 158 | } | ||
| 159 | |||
| 160 | return new Translator( direction, classes, index ); | ||
| 161 | |||
| 162 | default: | ||
| 163 | throw new Error( "Invalid translation direction!" ); | ||
| 126 | } | 164 | } |
| 127 | return new Translator( | ||
| 128 | direction, | ||
| 129 | direction.choose( m_classesByObf, m_classesByDeobf ), | ||
| 130 | index | ||
| 131 | ); | ||
| 132 | } | 165 | } |
| 133 | 166 | ||
| 134 | public static Mappings newFromStream( InputStream in ) | 167 | public static Mappings newFromStream( InputStream in ) |
| @@ -162,9 +195,10 @@ public class Mappings implements Serializable | |||
| 162 | { | 195 | { |
| 163 | if( classMapping.renameObfClass( oldObfName, newObfName ) ) | 196 | if( classMapping.renameObfClass( oldObfName, newObfName ) ) |
| 164 | { | 197 | { |
| 165 | m_classesByObf.remove( oldObfName ); | 198 | boolean wasRemoved = m_classesByObf.remove( oldObfName ) != null; |
| 166 | m_classesByObf.put( newObfName, classMapping ); | 199 | assert( wasRemoved ); |
| 167 | assert( m_classesByObf.size() == m_classesByDeobf.size() ); | 200 | boolean wasAdded = m_classesByObf.put( newObfName, classMapping ) == null; |
| 201 | assert( wasAdded ); | ||
| 168 | } | 202 | } |
| 169 | } | 203 | } |
| 170 | } | 204 | } |