Files
2026-03-30 20:11:57 +07:00

95 lines
2.5 KiB
C#

//
// Author:
// Jb Evain (jbevain@gmail.com)
//
// Copyright (c) 2008 - 2015 Jb Evain
// Copyright (c) 2008 - 2011 Novell, Inc.
//
// Licensed under the MIT/X11 license.
//
using System;
using System.IO;
namespace MonoFN.Cecil
{
public sealed class EmbeddedResource : Resource
{
private readonly MetadataReader reader;
private uint? offset;
private byte[] data;
private Stream stream;
public override ResourceType ResourceType
{
get { return ResourceType.Embedded; }
}
public EmbeddedResource(string name, ManifestResourceAttributes attributes, byte[] data) : base(name, attributes)
{
this.data = data;
}
public EmbeddedResource(string name, ManifestResourceAttributes attributes, Stream stream) : base(name, attributes)
{
this.stream = stream;
}
internal EmbeddedResource(string name, ManifestResourceAttributes attributes, uint offset, MetadataReader reader) : base(name, attributes)
{
this.offset = offset;
this.reader = reader;
}
public Stream GetResourceStream()
{
if (stream != null)
return stream;
if (data != null)
return new MemoryStream(data);
if (offset.HasValue)
return new MemoryStream(reader.GetManagedResource(offset.Value));
throw new InvalidOperationException();
}
public byte[] GetResourceData()
{
if (stream != null)
return ReadStream(stream);
if (data != null)
return data;
if (offset.HasValue)
return reader.GetManagedResource(offset.Value);
throw new InvalidOperationException();
}
private static byte[] ReadStream(Stream stream)
{
int read;
if (stream.CanSeek)
{
int length = (int)stream.Length;
byte[] data = new byte [length];
int offset = 0;
while ((read = stream.Read(data, offset, length - offset)) > 0)
offset += read;
return data;
}
byte[] buffer = new byte [1024 * 8];
MemoryStream memory = new();
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
memory.Write(buffer, 0, read);
return memory.ToArray();
}
}
}