Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

122 lines
3.5 KiB
C#

//
// CopyImageVisitor.cs
//
// Author:
// Jb Evain (jbevain@gmail.com)
//
// (C) 2005 Jb Evain
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
namespace Mono.Cecil.Binary {
sealed class CopyImageVisitor : BaseImageVisitor {
Image m_newImage;
Image m_originalImage;
public CopyImageVisitor (Image originalImage)
{
m_originalImage = originalImage;
}
public override void VisitImage (Image img)
{
m_newImage = img;
if (m_originalImage.DebugHeader != null)
m_newImage.AddDebugHeader ();
m_newImage.CLIHeader.Flags = m_originalImage.CLIHeader.Flags;
}
public override void VisitDebugHeader (DebugHeader dbgHeader)
{
DebugHeader old = m_originalImage.DebugHeader;
dbgHeader.Age = old.Age;
dbgHeader.Characteristics = old.Characteristics;
dbgHeader.FileName = old.FileName;
dbgHeader.Signature = old.Signature;
dbgHeader.TimeDateStamp = ImageInitializer.TimeDateStampFromEpoch();
dbgHeader.Type = old.Type;
}
public override void VisitSectionCollection (SectionCollection sections)
{
Section old = null;
foreach (Section s in m_originalImage.Sections)
if (s.Name == Section.Resources)
old = s;
if (old == null)
return;
Section rsrc = new Section ();
rsrc.Characteristics = old.Characteristics;
rsrc.Name = old.Name;
sections.Add (rsrc);
}
public override void TerminateImage (Image img)
{
if (m_originalImage.ResourceDirectoryRoot == null)
return;
m_newImage.ResourceDirectoryRoot = CloneResourceDirectoryTable (m_originalImage.ResourceDirectoryRoot);
}
ResourceDirectoryTable CloneResourceDirectoryTable (ResourceDirectoryTable old)
{
ResourceDirectoryTable rdt = new ResourceDirectoryTable ();
foreach (ResourceDirectoryEntry oldEntry in old.Entries)
rdt.Entries.Add (CloneResourceDirectoryEntry (oldEntry));
return rdt;
}
ResourceDirectoryEntry CloneResourceDirectoryEntry (ResourceDirectoryEntry old)
{
ResourceDirectoryEntry rde;
if (old.IdentifiedByName)
rde = new ResourceDirectoryEntry(old.Name);
else
rde = new ResourceDirectoryEntry (old.ID);
if (old.Child is ResourceDirectoryTable)
rde.Child = CloneResourceDirectoryTable (old.Child as ResourceDirectoryTable);
else
rde.Child = CloneResourceDataEntry (old.Child as ResourceDataEntry);
return rde;
}
ResourceDataEntry CloneResourceDataEntry (ResourceDataEntry old)
{
ResourceDataEntry rde = new ResourceDataEntry ();
rde.Size = old.Size;
rde.Codepage = old.Codepage;
rde.ResourceData = old.ResourceData;
return rde;
}
}
}