2025-05-07 14:11:34 -07:00

85 lines
2.3 KiB
C#

using AssetRipper.Assets.Collections;
using AssetRipper.IO.Files.ResourceFiles;
using AssetRipper.SourceGenerated.Subclasses.StreamedResource;
namespace AssetRipper.SourceGenerated.Extensions
{
public static class StreamedResourceExtensions
{
internal static bool CheckIntegrity(Utf8String? path, ulong offset, ulong size, AssetCollection collection)
{
if (Utf8String.IsNullOrEmpty(path))
{
return true;
}
if (offset > long.MaxValue || size > long.MaxValue || offset + size > long.MaxValue)
{
return false;
}
if (size == 0)
{
// Data might be read by its type for this verison, so we can't even export raw data.
return false;
}
ResourceFile? file = collection.Bundle.ResolveResource(path.String);
if (file == null)
{
return false;
}
return file.Stream.Length <= unchecked((long)(offset + size));
}
internal static byte[]? GetContent(Utf8String? path, ulong offset, ulong size, AssetCollection collection)
{
if (Utf8String.IsNullOrEmpty(path))
{
return null;
}
if (offset > long.MaxValue || size > long.MaxValue || offset + size > long.MaxValue)
{
return null;
}
if (size == 0)
{
// Data might be read by its type for this verison, so we can't even export raw data.
return null;
}
ResourceFile? file = collection.Bundle.ResolveResource(path.String);
if (file == null)
{
return null;
}
byte[] data = new byte[size];
file.Stream.Position = (long)offset;
file.Stream.ReadExactly(data);
return data;
}
public static bool CheckIntegrity(this IStreamedResource streamedResource, AssetCollection collection)
{
return CheckIntegrity(streamedResource.Source, streamedResource.Offset, streamedResource.Size, collection);
}
public static byte[]? GetContent(this IStreamedResource streamedResource, AssetCollection file)
{
return GetContent(streamedResource.Source, streamedResource.Offset, streamedResource.Size, file);
}
public static bool TryGetContent(this IStreamedResource streamedResource, AssetCollection file, [NotNullWhen(true)] out byte[]? data)
{
data = streamedResource.GetContent(file);
return !data.IsNullOrEmpty();
}
public static bool IsSet(this IStreamedResource streamedResource) => !Utf8String.IsNullOrEmpty(streamedResource.Source);
}
}