using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; namespace FastReport.Web.Services { /// /// Internal implementation of . /// Loads requested resources from embedded resources of the current assembly /// internal sealed class InternalResourceLoader : IResourceLoader { static readonly string AssemblyName; static readonly Assembly _assembly; static InternalResourceLoader() { _assembly = Assembly.GetExecutingAssembly(); AssemblyName = _assembly.GetName().Name; } readonly ConcurrentDictionary cache1 = new ConcurrentDictionary(); readonly ConcurrentDictionary cache2 = new ConcurrentDictionary(); public string GetContent(string name) { if (cache1.TryGetValue(name, out string value)) return value; var fullname = $"{AssemblyName}.Resources.{name}"; var resourceStream = _assembly.GetManifestResourceStream(fullname); if (resourceStream == null) return null; using (var reader = new StreamReader(resourceStream, Encoding.UTF8)) { var res = reader.ReadToEnd(); cache1[name] = res; return res; } } public async ValueTask GetContentAsync(string name) { if (cache1.TryGetValue(name, out string value)) return value; var fullname = $"{AssemblyName}.Resources.{name}"; var resourceStream = _assembly.GetManifestResourceStream(fullname); if (resourceStream == null) return null; using (var reader = new StreamReader(resourceStream, Encoding.UTF8)) { var res = await reader.ReadToEndAsync(); cache1[name] = res; return res; } } public byte[] GetBytes(string name) { if (cache2.TryGetValue(name, out byte[] value)) return value; var fullname = $"{AssemblyName}.Resources.{name}"; var resourceStream = _assembly.GetManifestResourceStream(fullname); if (resourceStream == null) return null; var buffer = new byte[resourceStream.Length]; resourceStream.Read(buffer, 0, buffer.Length); cache2[name] = buffer; return buffer; } public async ValueTask GetBytesAsync(string name, CancellationToken cancellationToken = default) { if (cache2.TryGetValue(name, out byte[] value)) return value; var fullname = $"{AssemblyName}.Resources.{name}"; var resourceStream = _assembly.GetManifestResourceStream(fullname); if (resourceStream == null) return null; var buffer = new byte[resourceStream.Length]; await resourceStream.ReadAsync(buffer, 0, buffer.Length, cancellationToken); cache2[name] = buffer; return buffer; } } }