|
|
|
@ -17,7 +17,7 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
private static readonly Dictionary<string, AssemblyDescriptor> AssemblyNameCache |
|
|
|
= new Dictionary<string, AssemblyDescriptor>(); |
|
|
|
|
|
|
|
private AssemblyDescriptor _defaultResmAssembly; |
|
|
|
private AssemblyDescriptor? _defaultResmAssembly; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Initializes a new instance of the <see cref="AssetLoader"/> class.
|
|
|
|
@ -25,7 +25,7 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
/// <param name="assembly">
|
|
|
|
/// The default assembly from which to load resm: assets for which no assembly is specified.
|
|
|
|
/// </param>
|
|
|
|
public AssetLoader(Assembly assembly = null) |
|
|
|
public AssetLoader(Assembly? assembly = null) |
|
|
|
{ |
|
|
|
if (assembly == null) |
|
|
|
assembly = Assembly.GetEntryAssembly(); |
|
|
|
@ -50,7 +50,7 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
/// A base URI to use if <paramref name="uri"/> is relative.
|
|
|
|
/// </param>
|
|
|
|
/// <returns>True if the asset could be found; otherwise false.</returns>
|
|
|
|
public bool Exists(Uri uri, Uri baseUri = null) |
|
|
|
public bool Exists(Uri uri, Uri? baseUri = null) |
|
|
|
{ |
|
|
|
return GetAsset(uri, baseUri) != null; |
|
|
|
} |
|
|
|
@ -66,7 +66,7 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
/// <exception cref="FileNotFoundException">
|
|
|
|
/// The asset could not be found.
|
|
|
|
/// </exception>
|
|
|
|
public Stream Open(Uri uri, Uri baseUri = null) => OpenAndGetAssembly(uri, baseUri).Item1; |
|
|
|
public Stream Open(Uri uri, Uri? baseUri = null) => OpenAndGetAssembly(uri, baseUri).Item1; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Opens the asset with the requested URI and returns the asset stream and the
|
|
|
|
@ -82,7 +82,7 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
/// <exception cref="FileNotFoundException">
|
|
|
|
/// The asset could not be found.
|
|
|
|
/// </exception>
|
|
|
|
public (Stream stream, Assembly assembly) OpenAndGetAssembly(Uri uri, Uri baseUri = null) |
|
|
|
public (Stream stream, Assembly assembly) OpenAndGetAssembly(Uri uri, Uri? baseUri = null) |
|
|
|
{ |
|
|
|
var asset = GetAsset(uri, baseUri); |
|
|
|
|
|
|
|
@ -94,11 +94,11 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
return (asset.GetStream(), asset.Assembly); |
|
|
|
} |
|
|
|
|
|
|
|
public Assembly GetAssembly(Uri uri, Uri baseUri) |
|
|
|
public Assembly? GetAssembly(Uri uri, Uri baseUri) |
|
|
|
{ |
|
|
|
if (!uri.IsAbsoluteUri && baseUri != null) |
|
|
|
uri = new Uri(baseUri, uri); |
|
|
|
return GetAssembly(uri).Assembly; |
|
|
|
return GetAssembly(uri)?.Assembly; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -113,7 +113,7 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
{ |
|
|
|
var assembly = GetAssembly(uri); |
|
|
|
|
|
|
|
return assembly?.Resources.Where(x => x.Key.Contains(uri.AbsolutePath)) |
|
|
|
return assembly?.Resources?.Where(x => x.Key.Contains(uri.AbsolutePath)) |
|
|
|
.Select(x =>new Uri($"resm:{x.Key}?assembly={assembly.Name}")) ?? |
|
|
|
Enumerable.Empty<Uri>(); |
|
|
|
} |
|
|
|
@ -139,7 +139,7 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
return Enumerable.Empty<Uri>(); |
|
|
|
} |
|
|
|
|
|
|
|
private Uri EnsureAbsolute(Uri uri, Uri baseUri) |
|
|
|
private Uri EnsureAbsolute(Uri uri, Uri? baseUri) |
|
|
|
{ |
|
|
|
if (uri.IsAbsoluteUri) |
|
|
|
return uri; |
|
|
|
@ -153,7 +153,7 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
return new Uri(baseUri, uri); |
|
|
|
} |
|
|
|
|
|
|
|
private IAssetDescriptor GetAsset(Uri uri, Uri baseUri) |
|
|
|
private IAssetDescriptor? GetAsset(Uri uri, Uri? baseUri) |
|
|
|
{ |
|
|
|
if (uri.IsAbsoluteUri && uri.Scheme == "resm") |
|
|
|
{ |
|
|
|
@ -166,10 +166,9 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
"don't know where to look up for the resource, try specifying assembly explicitly."); |
|
|
|
} |
|
|
|
|
|
|
|
IAssetDescriptor rv; |
|
|
|
|
|
|
|
var resourceKey = uri.AbsolutePath; |
|
|
|
asm.Resources.TryGetValue(resourceKey, out rv); |
|
|
|
IAssetDescriptor? rv = null; |
|
|
|
asm.Resources?.TryGetValue(resourceKey, out rv); |
|
|
|
return rv; |
|
|
|
} |
|
|
|
|
|
|
|
@ -193,7 +192,7 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
return (asm, uri.AbsolutePath); |
|
|
|
} |
|
|
|
|
|
|
|
private AssemblyDescriptor GetAssembly(Uri uri) |
|
|
|
private AssemblyDescriptor? GetAssembly(Uri? uri) |
|
|
|
{ |
|
|
|
if (uri != null) |
|
|
|
{ |
|
|
|
@ -205,9 +204,8 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
if (uri.Scheme == "resm") |
|
|
|
{ |
|
|
|
var qs = ParseQueryString(uri); |
|
|
|
string assemblyName; |
|
|
|
|
|
|
|
if (qs.TryGetValue("assembly", out assemblyName)) |
|
|
|
if (qs.TryGetValue("assembly", out var assemblyName)) |
|
|
|
{ |
|
|
|
return GetAssembly(assemblyName); |
|
|
|
} |
|
|
|
@ -222,8 +220,7 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
if (name == null) |
|
|
|
throw new ArgumentNullException(nameof(name)); |
|
|
|
|
|
|
|
AssemblyDescriptor rv; |
|
|
|
if (!AssemblyNameCache.TryGetValue(name, out rv)) |
|
|
|
if (!AssemblyNameCache.TryGetValue(name, out var rv)) |
|
|
|
{ |
|
|
|
var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); |
|
|
|
var match = loadedAssemblies.FirstOrDefault(a => a.GetName().Name == name); |
|
|
|
@ -275,7 +272,8 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
|
|
|
|
public Stream GetStream() |
|
|
|
{ |
|
|
|
return _asm.GetManifestResourceStream(_name); |
|
|
|
var s = _asm.GetManifestResourceStream(_name); |
|
|
|
return s ?? throw new InvalidOperationException($"Could not find manifest resource stream '{_name}',"); |
|
|
|
} |
|
|
|
|
|
|
|
public Assembly Assembly => _asm; |
|
|
|
@ -296,7 +294,9 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
|
|
|
|
public Stream GetStream() |
|
|
|
{ |
|
|
|
return new SlicedStream(Assembly.GetManifestResourceStream(AvaloniaResourceName), _offset, _length); |
|
|
|
var s = Assembly.GetManifestResourceStream(AvaloniaResourceName) ?? |
|
|
|
throw new InvalidOperationException($"Could not find manifest resource stream '{AvaloniaResourceName}',"); |
|
|
|
return new SlicedStream(s, _offset, _length); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -383,9 +383,9 @@ namespace Avalonia.Shared.PlatformSupport |
|
|
|
} |
|
|
|
|
|
|
|
public Assembly Assembly { get; } |
|
|
|
public Dictionary<string, IAssetDescriptor> Resources { get; } |
|
|
|
public Dictionary<string, IAssetDescriptor> AvaloniaResources { get; } |
|
|
|
public string Name { get; } |
|
|
|
public Dictionary<string, IAssetDescriptor>? Resources { get; } |
|
|
|
public Dictionary<string, IAssetDescriptor>? AvaloniaResources { get; } |
|
|
|
public string? Name { get; } |
|
|
|
} |
|
|
|
|
|
|
|
public static void RegisterResUriParsers() |
|
|
|
|