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

Reply via email to