public RenamedItem(NanoXmlElement el, RenamedClass owner) { try { this.owner = owner; entityType = (EntityType)Enum.Parse(typeof (EntityType), el.Name.Substring(7)); string str = el.GetAttribute("oldName"); int i; if ((i = str.IndexOf(' ')) != -1) { string s = str.Substring(0, i); int k = s.IndexOf('/'); if (k != -1) resultType = new Renamed(s.Substring(0, k) + "." + s.Substring(k + 1)); else resultType = new Renamed(s); str = str.Substring(i + 1); } if ((i = str.IndexOf("::")) != -1) str = str.Substring(i + 2); if ((i = str.IndexOf('(')) != -1) { methodParams = new List<Renamed>(); foreach (string s in EntityName.ParseList(str, i + 1, ')')) { int k = s.IndexOf('/'); if (k != -1) methodParams.Add(new Renamed(s.Substring(0, k) + "." + s.Substring(k + 1))); else methodParams.Add(new Renamed(s)); } str = str.Substring(0, i); i = str.IndexOf('['); if (i != -1 && str[i + 2] == ']') str = str.Substring(0, i); } string strNew = el.GetAttribute("newName"); if (strNew != "dropped") name = new Renamed(str, strNew); else name = new Renamed(str); } catch (Exception e) { throw new ObfuscarParserException("Failed to process item element", e, el.Path); } }
private void LoadFile() { Stopwatch sw = new Stopwatch(); sw.Start(); NanoXmlDocument xml = NanoXmlDocument.LoadFromFile(filename); timingXML = sw.ElapsedMilliseconds; Debug.WriteLine("XML Loading: " + timingXML + " ms"); sw.Reset(); sw.Start(); NanoXmlElement doc = xml.DocumentElement; NanoXmlElement types = (NanoXmlElement)doc["renamedTypes"]; modules.Clear(); namespaces.Clear(); namespacesObfuscated.Clear(); classes.Clear(); haveSystemEntities = false; methodsCount = classesCount = subclassesCount = skippedCount = 0; lastModified = File.GetLastWriteTime(filename); List<RenamedClass> subclasses = new List<RenamedClass>(); if (types != null) foreach (NanoXmlElement element in types.ChildElements) { if (string.Compare(element.Name, "renamedClass", StringComparison.Ordinal) == 0) { RenamedClass c = new RenamedClass(element, this); classesCount++; if (c.OwnerClassName == null) { classes.Add(c); if (c.Name.NameOld != null && c.Name.NameOld.Namespace != null) haveSystemEntities |= c.Name.NameOld.Namespace.StartsWith("System."); } else subclasses.Add(c); methodsCount += c.MethodsCount; if (c.ModuleNew != null && !modules.Contains(c.ModuleNew)) modules.Add(c.ModuleNew); if (c.Name.NameOld != null && !string.IsNullOrEmpty(c.Name.NameOld.Namespace) && !namespaces.Contains(c.Name.NameOld.Namespace)) namespaces.Add(c.Name.NameOld.Namespace); if (c.Name.NameNew != null && !string.IsNullOrEmpty(c.Name.NameNew.Namespace) && !namespacesObfuscated.Contains(c.Name.NameNew.Namespace)) namespacesObfuscated.Add(c.Name.NameNew.Namespace); } } types = (NanoXmlElement)doc["skippedTypes"]; if (types != null) foreach (NanoXmlElement element in types.ChildElements) if (string.Compare(element.Name, "skippedClass", StringComparison.Ordinal) == 0) { skippedCount++; classesCount++; RenamedClass c = new RenamedClass(element, this); if (c.OwnerClassName == null) classes.Add(c); else subclasses.Add(c); } timingParsing = sw.ElapsedMilliseconds; Debug.WriteLine("Parsing: " + timingParsing + " ms"); sw.Reset(); sw.Start(); foreach (RenamedClass subclass in subclasses) { RenamedClass c = (RenamedClass)SearchForOldName(subclass.OwnerClassName); if (c == null) c = (RenamedClass)SearchForNewName(subclass.OwnerClassName); if (c != null) { c.Items.Add(subclass); subclass.OwnerClass = c; subclassesCount++; continue; } Debug.WriteLine("Failed to find root class: " + subclass.OwnerClassName); classes.Add(subclass); } timingSubclasses = sw.ElapsedMilliseconds; Debug.WriteLine("Subclasses processing: " + timingSubclasses + " ms"); sw.Reset(); sw.Start(); foreach (RenamedClass c in classes) c.UpdateNewNames(this); timingUpdateNewNames = sw.ElapsedMilliseconds; Debug.WriteLine("Values updating: " + timingUpdateNewNames + " ms"); Debug.WriteLine("Total elapsed: " + TimingTotal + " ms"); sw.Stop(); }
private void LoadFile(IMappingReader reader) { loadTime = 0; LoadTimer timer = new LoadTimer("File Parsing"); reader.Load(); loadTime += timer.Stop(); timer = new LoadTimer("Items Processing"); modules.Clear(); namespaces.Clear(); namespacesObfuscated.Clear(); classes.Clear(); classesCache.Clear(); haveSystemEntities = false; methodsCount = classesCount = subclassesCount = skippedCount = 0; List <RenamedClass> subclasses = new List <RenamedClass>(); foreach (IMappingEntity entity in reader.Entities) { if (entity.Type == EntityType.Resource) { RenamedResource resource = new RenamedResource(entity); resources.Add(resource); continue; } RenamedClass c = new RenamedClass(entity, this); classesCount++; if (c.SkipReason != null) { skippedCount++; } if (c.OwnerClassName == null) { classes.Add(c); if (c.Name.NameOld != null && c.Name.NameOld.Namespace != null) { haveSystemEntities |= c.Name.NameOld.Namespace.StartsWith("System."); } } else { subclasses.Add(c); } methodsCount += c.MethodsCount; if (c.ModuleNew != null) { modules.Add(c.ModuleNew); } if (c.Name.NameOld != null) { classesCache[c.NameOld] = c; classesCache[c.NameOldFull] = c; if (!string.IsNullOrEmpty(c.Name.NameOld.Namespace)) { namespaces.Add(c.Name.NameOld.Namespace); } } if (c.Name.NameNew != null) { classesCache[c.NameNew] = c; classesCache[c.NameNewFull] = c; if (!string.IsNullOrEmpty(c.Name.NameNew.Namespace)) { namespacesObfuscated.Add(c.Name.NameNew.Namespace); } } } loadTime += timer.Stop(); timer = new LoadTimer("Subclasses Processing"); foreach (RenamedClass subclass in subclasses) { RenamedClass c; if (classesCache.TryGetValue(subclass.OwnerClassName, out c)) { c.Items.Add(subclass); subclass.OwnerClass = c; subclassesCount++; continue; } Debug.WriteLine("Failed to find root class: " + subclass.OwnerClassName); classes.Add(subclass); } loadTime += timer.Stop(); timer = new LoadTimer("Values Updating"); foreach (RenamedClass c in classes) { c.UpdateNewNames(this); } loadTime += timer.Stop(); Debug.WriteLine("Total Elapsed: {0} ms", loadTime); }