2010-04-06 Jb Evain <jbevain@novell.com>
[mcs.git] / class / Mono.Cecil / Mono.Cecil.Binary / CopyImageVisitor.cs
blob8a1dec205c86f5b89640af498cde25d74173aad5
1 //
2 // CopyImageVisitor.cs
3 //
4 // Author:
5 // Jb Evain (jbevain@gmail.com)
6 //
7 // (C) 2005 Jb Evain
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 namespace Mono.Cecil.Binary {
31 sealed class CopyImageVisitor : BaseImageVisitor {
33 Image m_newImage;
34 Image m_originalImage;
36 public CopyImageVisitor (Image originalImage)
38 m_originalImage = originalImage;
41 public override void VisitImage (Image img)
43 m_newImage = img;
44 if (m_originalImage.DebugHeader != null)
45 m_newImage.AddDebugHeader ();
47 m_newImage.CLIHeader.Flags = m_originalImage.CLIHeader.Flags;
50 public override void VisitDebugHeader (DebugHeader dbgHeader)
52 DebugHeader old = m_originalImage.DebugHeader;
53 dbgHeader.Age = old.Age;
54 dbgHeader.Characteristics = old.Characteristics;
55 dbgHeader.FileName = old.FileName;
56 dbgHeader.Signature = old.Signature;
57 dbgHeader.TimeDateStamp = ImageInitializer.TimeDateStampFromEpoch();
58 dbgHeader.Type = old.Type;
61 public override void VisitSectionCollection (SectionCollection sections)
63 Section old = null;
64 foreach (Section s in m_originalImage.Sections)
65 if (s.Name == Section.Resources)
66 old = s;
68 if (old == null)
69 return;
71 Section rsrc = new Section ();
72 rsrc.Characteristics = old.Characteristics;
73 rsrc.Name = old.Name;
75 sections.Add (rsrc);
78 public override void TerminateImage (Image img)
80 if (m_originalImage.ResourceDirectoryRoot == null)
81 return;
83 m_newImage.ResourceDirectoryRoot = CloneResourceDirectoryTable (m_originalImage.ResourceDirectoryRoot);
86 ResourceDirectoryTable CloneResourceDirectoryTable (ResourceDirectoryTable old)
88 ResourceDirectoryTable rdt = new ResourceDirectoryTable ();
89 foreach (ResourceDirectoryEntry oldEntry in old.Entries)
90 rdt.Entries.Add (CloneResourceDirectoryEntry (oldEntry));
92 return rdt;
95 ResourceDirectoryEntry CloneResourceDirectoryEntry (ResourceDirectoryEntry old)
97 ResourceDirectoryEntry rde;
98 if (old.IdentifiedByName)
99 rde = new ResourceDirectoryEntry(old.Name);
100 else
101 rde = new ResourceDirectoryEntry (old.ID);
103 if (old.Child is ResourceDirectoryTable)
104 rde.Child = CloneResourceDirectoryTable (old.Child as ResourceDirectoryTable);
105 else
106 rde.Child = CloneResourceDataEntry (old.Child as ResourceDataEntry);
108 return rde;
111 ResourceDataEntry CloneResourceDataEntry (ResourceDataEntry old)
113 ResourceDataEntry rde = new ResourceDataEntry ();
114 rde.Size = old.Size;
115 rde.Codepage = old.Codepage;
116 rde.ResourceData = old.ResourceData;
118 return rde;