Skip to content

Instantly share code, notes, and snippets.

@gfraiteur
Created August 1, 2011 11:32
Show Gist options
  • Save gfraiteur/1117977 to your computer and use it in GitHub Desktop.
Save gfraiteur/1117977 to your computer and use it in GitHub Desktop.
using System.Collections.Generic;
using System.Xml;
using PostSharp.Sdk.CodeModel;
namespace PostSharp.AddIn.PostObfuscation.Dotfuscator
{
internal sealed class DotfuscatorMap : ObfuscationMap
{
protected override string GetSignature( IWriteReflectionName member )
{
return member.GetReflectionName( ReflectionNameOptions.SignatureOptions, NameMapper.Default ).Replace( '+', '/' );
}
public override void ReadFile( string fileName )
{
XmlReaderSettings settings = new XmlReaderSettings
{
IgnoreWhitespace = true,
XmlResolver = null,
ProhibitDtd = false
};
using ( XmlReader reader = XmlReader.Create( fileName, settings ) )
{
string moduleName = null;
string typeName = null;
string memberName = null;
string signature = null;
string memberNewName = null;
string typeNewName = null;
Stack<string> stack = new Stack<string>( 32 );
string currentPath = "";
while ( reader.Read() )
{
switch ( reader.NodeType )
{
case XmlNodeType.Element:
if ( !reader.IsEmptyElement )
{
currentPath += "/" + reader.Name;
stack.Push( currentPath );
}
break;
case XmlNodeType.EndElement:
switch ( currentPath )
{
case "/dotfuscatorMap/mapping/module/type/methodlist/method":
this.SetObfuscatedName( GetMethodIdentity( moduleName, typeName, memberName, signature ), memberNewName ?? memberName );
memberNewName = null;
break;
case "/dotfuscatorMap/mapping/module/type/fieldlist/field":
this.SetObfuscatedName( GetFieldIdentity( moduleName, typeName, memberName ), memberNewName ?? memberName );
memberNewName = null;
break;
case "/dotfuscatorMap/mapping/module/type/propertylist/property":
this.SetObfuscatedName( GetPropertyIdentity( moduleName, typeName, memberName, signature ), memberNewName ?? memberName );
memberNewName = null;
break;
case "/dotfuscatorMap/mapping/module/type/eventlist/event":
this.SetObfuscatedName( GetEventIdentity( moduleName, typeName, memberName ), memberNewName ?? memberName );
memberNewName = null;
break;
case "/dotfuscatorMap/mapping/module/type":
this.SetObfuscatedName( GetTypeIdentity( moduleName, typeName ), typeNewName ?? typeName );
typeNewName = null;
break;
}
stack.Pop();
currentPath = stack.Count > 0 ? stack.Peek() : null;
break;
case XmlNodeType.Text:
switch ( currentPath )
{
case "/dotfuscatorMap/mapping/module/name":
moduleName = reader.Value;
break;
case "/dotfuscatorMap/mapping/module/type/name":
typeName = reader.Value;
break;
case "/dotfuscatorMap/mapping/module/type/methodlist/method/name":
case "/dotfuscatorMap/mapping/module/type/fieldlist/field/name":
case "/dotfuscatorMap/mapping/module/type/propertylist/property/name":
case "/dotfuscatorMap/mapping/module/type/eventlist/event/name":
memberName = reader.Value;
break;
case "/dotfuscatorMap/mapping/module/type/methodlist/method/signature":
case "/dotfuscatorMap/mapping/module/type/propertylist/property/signature":
signature = reader.Value;
break;
case "/dotfuscatorMap/mapping/module/type/newname":
typeNewName = reader.Value;
break;
case "/dotfuscatorMap/mapping/module/type/methodlist/method/newname":
case "/dotfuscatorMap/mapping/module/type/propertylist/property/newname":
case "/dotfuscatorMap/mapping/module/type/fieldlist/field/newname":
case "/dotfuscatorMap/mapping/module/type/eventlist/event/newname":
memberNewName = reader.Value;
break;
}
break;
}
}
}
}
}
internal class DotfuscatorImpl : IObfuscator
{
public ObfuscationMap CreateMap()
{
return new DotfuscatorMap();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment