From 77c2411b6d8604b9c2c7babc200a534228288fef Mon Sep 17 00:00:00 2001 From: Ronny Klier Date: Wed, 8 Jun 2011 22:01:11 +0200 Subject: [PATCH] Decompile contents of resource file nodes + non-Stream resources --- .../BamlResourceNodeFactory.cs | 6 +++--- ILSpy.sln | 8 ++++---- .../ResourceNodes/CursorResourceEntryNode.cs | 15 ++++++++++++--- .../ResourceNodes/IResourceNodeFactory.cs | 2 +- .../ResourceNodes/ImageResourceEntryNode.cs | 18 ++++++++++++++++-- .../ResourceNodes/ResourceEntryNode.cs | 4 ++-- .../ResourceNodes/ResourcesFileTreeNode.cs | 10 +++++----- .../ResourceNodes/XamlResourceNode.cs | 6 +++--- .../TreeNodes/ResourceNodes/XmlResourceNode.cs | 10 +++++++--- 9 files changed, 53 insertions(+), 26 deletions(-) diff --git a/ILSpy.BamlDecompiler/BamlResourceNodeFactory.cs b/ILSpy.BamlDecompiler/BamlResourceNodeFactory.cs index a1b77fb6b..21ea662a6 100644 --- a/ILSpy.BamlDecompiler/BamlResourceNodeFactory.cs +++ b/ILSpy.BamlDecompiler/BamlResourceNodeFactory.cs @@ -18,10 +18,10 @@ namespace ILSpy.BamlDecompiler return null; } - public ILSpyTreeNode CreateNode(string key, Stream data) + public ILSpyTreeNode CreateNode(string key, object data) { - if (key.EndsWith(".baml", StringComparison.OrdinalIgnoreCase)) - return new BamlResourceEntryNode(key, data); + if (key.EndsWith(".baml", StringComparison.OrdinalIgnoreCase) && data is Stream) + return new BamlResourceEntryNode(key, (Stream)data); else return null; } diff --git a/ILSpy.sln b/ILSpy.sln index 3888446b9..b1c88f93c 100644 --- a/ILSpy.sln +++ b/ILSpy.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 -# SharpDevelop 4.1.0.7590-alpha +# SharpDevelop 4.0.1.7126 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "doc", "doc", "{F45DB999-7E72-4000-B5AD-3A7B485A0896}" ProjectSection(SolutionItems) = postProject doc\Command Line.txt = doc\Command Line.txt @@ -11,10 +11,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{89 ProjectSection(SolutionItems) = postProject EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ILSpy.Debugger", "Debugger\ILSpy.Debugger\ILSpy.Debugger.csproj", "{6D3D0F0D-348D-456A-A6ED-E9BD5EFABB6A}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Core", "Debugger\Debugger.Core\Debugger.Core.csproj", "{1D18D788-F7EE-4585-A23B-34DC8EC63CB8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ILSpy.Debugger", "Debugger\ILSpy.Debugger\ILSpy.Debugger.csproj", "{6D3D0F0D-348D-456A-A6ED-E9BD5EFABB6A}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ILSpy", "ILSpy\ILSpy.csproj", "{1E85EFF9-E370-4683-83E4-8A3D063FF791}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TreeView", "SharpTreeView\ICSharpCode.TreeView.csproj", "{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}" @@ -146,7 +146,7 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {89C4A682-2706-44A3-ADDC-BC273164C37E} {6D3D0F0D-348D-456A-A6ED-E9BD5EFABB6A} = {89C4A682-2706-44A3-ADDC-BC273164C37E} + {1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {89C4A682-2706-44A3-ADDC-BC273164C37E} EndGlobalSection EndGlobal diff --git a/ILSpy/TreeNodes/ResourceNodes/CursorResourceEntryNode.cs b/ILSpy/TreeNodes/ResourceNodes/CursorResourceEntryNode.cs index 3170f0992..956d3bcac 100644 --- a/ILSpy/TreeNodes/ResourceNodes/CursorResourceEntryNode.cs +++ b/ILSpy/TreeNodes/ResourceNodes/CursorResourceEntryNode.cs @@ -40,11 +40,13 @@ namespace ICSharpCode.ILSpy.TreeNodes return null; } - public ILSpyTreeNode CreateNode(string key, Stream data) + public ILSpyTreeNode CreateNode(string key, object data) { + if (!(data is Stream)) + return null; foreach (string fileExt in imageFileExtensions) { if (key.EndsWith(fileExt, StringComparison.OrdinalIgnoreCase)) - return new CursorResourceEntryNode(key, data); + return new CursorResourceEntryNode(key, (Stream)data); } return null; } @@ -71,7 +73,14 @@ namespace ICSharpCode.ILSpy.TreeNodes //HACK: windows imaging does not understand that .cur files have the same layout as .ico // so load to data, and modify the ResourceType in the header to make look like an icon... - byte[] curData = ((MemoryStream)Data).ToArray(); + MemoryStream s = Data as MemoryStream; + if (null == s) + { + // data was stored in another stream type (e.g. PinnedBufferedMemoryStream) + s = new MemoryStream(); + Data.CopyTo(s); + } + byte[] curData = s.ToArray(); curData[2] = 1; using (Stream stream = new MemoryStream(curData)) { image.BeginInit(); diff --git a/ILSpy/TreeNodes/ResourceNodes/IResourceNodeFactory.cs b/ILSpy/TreeNodes/ResourceNodes/IResourceNodeFactory.cs index 49d5f4893..c19cbfeda 100644 --- a/ILSpy/TreeNodes/ResourceNodes/IResourceNodeFactory.cs +++ b/ILSpy/TreeNodes/ResourceNodes/IResourceNodeFactory.cs @@ -28,6 +28,6 @@ namespace ICSharpCode.ILSpy.TreeNodes public interface IResourceNodeFactory { ILSpyTreeNode CreateNode(Resource resource); - ILSpyTreeNode CreateNode(string key, Stream data); + ILSpyTreeNode CreateNode(string key, object data); } } diff --git a/ILSpy/TreeNodes/ResourceNodes/ImageResourceEntryNode.cs b/ILSpy/TreeNodes/ResourceNodes/ImageResourceEntryNode.cs index 94e894961..b2d2d60b9 100644 --- a/ILSpy/TreeNodes/ResourceNodes/ImageResourceEntryNode.cs +++ b/ILSpy/TreeNodes/ResourceNodes/ImageResourceEntryNode.cs @@ -40,11 +40,25 @@ namespace ICSharpCode.ILSpy.TreeNodes return null; } - public ILSpyTreeNode CreateNode(string key, Stream data) + public ILSpyTreeNode CreateNode(string key, object data) { + if (data is System.Drawing.Icon) + { + MemoryStream s = new MemoryStream(); + ((System.Drawing.Icon)data).Save(s); + return new ImageResourceEntryNode(key, s); + } + else if (data is System.Drawing.Image) + { + MemoryStream s = new MemoryStream(); + ((System.Drawing.Image)data).Save(s, System.Drawing.Imaging.ImageFormat.Bmp); + return new ImageResourceEntryNode(key, s); + } + if (!(data is Stream)) + return null; foreach (string fileExt in imageFileExtensions) { if (key.EndsWith(fileExt, StringComparison.OrdinalIgnoreCase)) - return new ImageResourceEntryNode(key, data); + return new ImageResourceEntryNode(key, (Stream)data); } return null; } diff --git a/ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs b/ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs index fa2cff797..da58bde8f 100644 --- a/ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs +++ b/ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs @@ -62,7 +62,7 @@ namespace ICSharpCode.ILSpy.TreeNodes this.data = data; } - public static ILSpyTreeNode Create(string key, Stream data) + public static ILSpyTreeNode Create(string key, object data) { ILSpyTreeNode result = null; foreach (var factory in App.CompositionContainer.GetExportedValues()) { @@ -70,7 +70,7 @@ namespace ICSharpCode.ILSpy.TreeNodes if (result != null) break; } - return result ?? new ResourceEntryNode(key, data); + return result ?? new ResourceEntryNode(key, data as Stream); } public override void Decompile(Language language, ITextOutput output, DecompilationOptions options) diff --git a/ILSpy/TreeNodes/ResourceNodes/ResourcesFileTreeNode.cs b/ILSpy/TreeNodes/ResourceNodes/ResourcesFileTreeNode.cs index 1b686c2da..ede880e10 100644 --- a/ILSpy/TreeNodes/ResourceNodes/ResourcesFileTreeNode.cs +++ b/ILSpy/TreeNodes/ResourceNodes/ResourcesFileTreeNode.cs @@ -43,7 +43,7 @@ namespace ICSharpCode.ILSpy.TreeNodes return null; } - public ILSpyTreeNode CreateNode(string key, Stream data) + public ILSpyTreeNode CreateNode(string key, object data) { return null; } @@ -78,12 +78,12 @@ namespace ICSharpCode.ILSpy.TreeNodes return; } foreach (DictionaryEntry entry in reader.Cast().OrderBy(e => e.Key.ToString())) { - if (entry.Value is Stream) - Children.Add(ResourceEntryNode.Create(entry.Key.ToString(), (Stream)entry.Value)); + if (entry.Value is String) + filteredEntries.Add(new KeyValuePair(entry.Key.ToString(), (string)entry.Value)); else if (entry.Value is byte[]) Children.Add(ResourceEntryNode.Create(entry.Key.ToString(), new MemoryStream((byte[])entry.Value))); - else if (entry.Value is String) - filteredEntries.Add(new KeyValuePair(entry.Key.ToString(), (string)entry.Value)); + else + Children.Add(ResourceEntryNode.Create(entry.Key.ToString(), entry.Value)); } } } diff --git a/ILSpy/TreeNodes/ResourceNodes/XamlResourceNode.cs b/ILSpy/TreeNodes/ResourceNodes/XamlResourceNode.cs index 13912e348..d148d1f4b 100644 --- a/ILSpy/TreeNodes/ResourceNodes/XamlResourceNode.cs +++ b/ILSpy/TreeNodes/ResourceNodes/XamlResourceNode.cs @@ -35,10 +35,10 @@ namespace ICSharpCode.ILSpy.Xaml return null; } - public ILSpyTreeNode CreateNode(string key, Stream data) + public ILSpyTreeNode CreateNode(string key, object data) { - if (key.EndsWith(".xaml", StringComparison.OrdinalIgnoreCase)) - return new XamlResourceEntryNode(key, data); + if (key.EndsWith(".xaml", StringComparison.OrdinalIgnoreCase) && data is Stream) + return new XamlResourceEntryNode(key, (Stream)data); else return null; } diff --git a/ILSpy/TreeNodes/ResourceNodes/XmlResourceNode.cs b/ILSpy/TreeNodes/ResourceNodes/XmlResourceNode.cs index ce2f1e1d4..9aa8d96ea 100644 --- a/ILSpy/TreeNodes/ResourceNodes/XmlResourceNode.cs +++ b/ILSpy/TreeNodes/ResourceNodes/XmlResourceNode.cs @@ -41,12 +41,16 @@ namespace ICSharpCode.ILSpy.Xaml return null; } - public ILSpyTreeNode CreateNode(string key, Stream data) + public ILSpyTreeNode CreateNode(string key, object data) { + if (!(data is Stream)) + return null; foreach (string fileExt in xmlFileExtensions) + { if (key.EndsWith(fileExt, StringComparison.OrdinalIgnoreCase)) - return new XmlResourceEntryNode(key, data); - return null; + return new XmlResourceEntryNode(key, (Stream)data); + } + return null; } }