mirror of
https://github.com/AssetRipper/AssetRipper.git
synced 2025-12-11 20:15:29 +01:00
84 lines
2.3 KiB
C#
84 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 || file.Stream.Length < unchecked((long)(offset + size)))
|
|
{
|
|
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);
|
|
}
|