Author: jbevain
Date: 2005-03-15 17:10:24 -0500 (Tue, 15 Mar 2005)
New Revision: 41866
Modified:
trunk/cecil/lib/Mono.Cecil.Implem/EmbeddedResource.cs
trunk/cecil/lib/Mono.Cecil.Implem/LinkedResource.cs
trunk/cecil/lib/Mono.Cecil.Implem/ModuleDefinition.cs
trunk/cecil/lib/Mono.Cecil.Implem/Resource.cs
trunk/cecil/lib/Mono.Cecil.Implem/StructureReader.cs
Log:
implement embedded manifest resource reading
Modified: trunk/cecil/lib/Mono.Cecil.Implem/EmbeddedResource.cs
===================================================================
--- trunk/cecil/lib/Mono.Cecil.Implem/EmbeddedResource.cs 2005-03-15
21:36:10 UTC (rev 41865)
+++ trunk/cecil/lib/Mono.Cecil.Implem/EmbeddedResource.cs 2005-03-15
22:10:24 UTC (rev 41866)
@@ -20,15 +20,20 @@
private byte [] m_data;
public byte [] Data {
- get { return m_data; }
+ get {
+ if (m_data != null)
+ this.Module.Loader.LoadEmbeddedResource (this);
+ return m_data;
+ }
set { m_data = value; }
}
- public EmbeddedResource (string name, ManifestResourceAttributes
attributes) : base (name, attributes)
+ public EmbeddedResource (string name, ManifestResourceAttributes
attributes, ModuleDefinition owner) : base (name, attributes, owner)
{
}
- public EmbeddedResource (string name, ManifestResourceAttributes
attributes, byte [] data) : base (name, attributes)
+ public EmbeddedResource (string name, ManifestResourceAttributes
attributes, ModuleDefinition owner, byte [] data) :
+ base (name, attributes, owner)
{
m_data = data;
}
Modified: trunk/cecil/lib/Mono.Cecil.Implem/LinkedResource.cs
===================================================================
--- trunk/cecil/lib/Mono.Cecil.Implem/LinkedResource.cs 2005-03-15 21:36:10 UTC
(rev 41865)
+++ trunk/cecil/lib/Mono.Cecil.Implem/LinkedResource.cs 2005-03-15 22:10:24 UTC
(rev 41866)
@@ -30,7 +30,8 @@
set { m_file = value; }
}
- public LinkedResource (string name, ManifestResourceAttributes
attributes, string file) : base (name, attributes)
+ public LinkedResource (string name, ManifestResourceAttributes
attributes, ModuleDefinition owner, string file) :
+ base (name, attributes, owner)
{
m_file = file;
}
Modified: trunk/cecil/lib/Mono.Cecil.Implem/ModuleDefinition.cs
===================================================================
--- trunk/cecil/lib/Mono.Cecil.Implem/ModuleDefinition.cs 2005-03-15
21:36:10 UTC (rev 41865)
+++ trunk/cecil/lib/Mono.Cecil.Implem/ModuleDefinition.cs 2005-03-15
22:10:24 UTC (rev 41866)
@@ -130,12 +130,12 @@
public void DefineEmbeddedResource (string name,
ManifestResourceAttributes attributes, byte [] data)
{
- m_res [name] = new EmbeddedResource (name, attributes, data);
+ m_res [name] = new EmbeddedResource (name, attributes, this, data);
}
public void DefineLinkedResource (string name,
ManifestResourceAttributes attributes, string file)
{
- m_res [name] = new LinkedResource (name, attributes, file);
+ m_res [name] = new LinkedResource (name, attributes, this, file);
}
public void Accept (IReflectionStructureVisitor visitor)
Modified: trunk/cecil/lib/Mono.Cecil.Implem/Resource.cs
===================================================================
--- trunk/cecil/lib/Mono.Cecil.Implem/Resource.cs 2005-03-15 21:36:10 UTC
(rev 41865)
+++ trunk/cecil/lib/Mono.Cecil.Implem/Resource.cs 2005-03-15 22:10:24 UTC
(rev 41866)
@@ -17,9 +17,14 @@
internal abstract class Resource : IResource {
+ private ModuleDefinition m_module;
private string m_name;
private ManifestResourceAttributes m_attributes;
+ public ModuleDefinition Module {
+ get { return m_module; }
+ }
+
public string Name {
get { return m_name; }
set { m_name = value; }
@@ -30,12 +35,17 @@
set { m_attributes = value; }
}
- protected Resource(string name, ManifestResourceAttributes attributes)
+ protected Resource(string name, ManifestResourceAttributes attributes,
ModuleDefinition owner) : this (owner)
{
m_name = name;
m_attributes = attributes;
}
+ private Resource (ModuleDefinition owner)
+ {
+ m_module = owner;
+ }
+
public abstract void Accept(IReflectionStructureVisitor visitor);
}
}
Modified: trunk/cecil/lib/Mono.Cecil.Implem/StructureReader.cs
===================================================================
--- trunk/cecil/lib/Mono.Cecil.Implem/StructureReader.cs 2005-03-15
21:36:10 UTC (rev 41865)
+++ trunk/cecil/lib/Mono.Cecil.Implem/StructureReader.cs 2005-03-15
22:10:24 UTC (rev 41866)
@@ -86,30 +86,44 @@
public void Visit (IResourceCollection resources)
{
- ManifestResourceTable mrt = m_img.MetadataRoot.Streams.TablesHeap
[typeof(ManifestResourceTable)] as ManifestResourceTable;
- if (mrt != null) {
- foreach (ManifestResourceRow mrr in mrt.Rows) {
- EmbeddedResource er = new EmbeddedResource (
- m_img.MetadataRoot.Streams.StringsHeap [mrr.Name],
mrr.Flags);
+ if (!m_img.MetadataRoot.Streams.TablesHeap.HasTable (typeof
(ManifestResourceTable)))
+ return;
- (resources as ResourceCollection) [er.Name] = er;
- }
- }
+ ModuleDefinition module = resources.Container as ModuleDefinition;
- FileTable ft = m_img.MetadataRoot.Streams.TablesHeap
[typeof(FileTable)] as FileTable;
- if (ft != null && ft.Rows.Count > 0) {
- foreach (FileRow fr in ft.Rows) {
- if (fr.Flags ==
Mono.Cecil.FileAttributes.ContainsNoMetaData) {
- LinkedResource lr = new LinkedResource (
- m_img.MetadataRoot.Streams.StringsHeap [fr.Name],
- ManifestResourceAttributes.Public,
- new FileInfo
(m_img.MetadataRoot.Streams.StringsHeap [fr.Name]).FullName);
+ ManifestResourceTable mrTable =
m_img.MetadataRoot.Streams.TablesHeap [typeof(ManifestResourceTable)] as
ManifestResourceTable;
+ FileTable fTable = m_img.MetadataRoot.Streams.TablesHeap
[typeof(FileTable)] as FileTable;
- lr.Hash = m_img.MetadataRoot.Streams.BlobHeap.Read
(fr.HashValue);
+ BinaryReader br = m_ir.GetReader ();
- (resources as ResourceCollection) [lr.Name] = lr;
- }
+ for (int i = 0; i < mrTable.Rows.Count; i++) {
+ ManifestResourceRow mrRow = mrTable [i];
+ if (mrRow.Implementation.RID == 0) {
+ EmbeddedResource eres = new EmbeddedResource (
+ m_img.MetadataRoot.Streams.StringsHeap [mrRow.Name],
mrRow.Flags, module);
+
+ br.BaseStream.Position = m_img.ResolveVirtualAddress (
+ m_img.CLIHeader.Resources.VirtualAddress);
+ br.BaseStream.Position += mrRow.Offset;
+
+ eres.Data = br.ReadBytes (br.ReadInt32 ());
+
+ (resources as ResourceCollection) [eres.Name] = eres;
+ continue;
}
+
+ switch (mrRow.Implementation.TokenType) {
+ case TokenType.File :
+ FileRow fRow = fTable [(int) mrRow.Implementation.RID - 1];
+ LinkedResource lres = new LinkedResource
(m_img.MetadataRoot.Streams.StringsHeap [mrRow.Name], mrRow.Flags,
+ module,
m_img.MetadataRoot.Streams.StringsHeap [fRow.Name]);
+ lres.Hash = m_img.MetadataRoot.Streams.BlobHeap.Read
(fRow.HashValue);
+ (resources as ResourceCollection) [lres.Name] = lres;
+ break;
+ case TokenType.AssemblyRef :
+ // not sure how to implement this
+ break;
+ }
}
}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches