/ src / Ryujinx.Common / Utilities / EmbeddedResources.cs
EmbeddedResources.cs
  1  using Ryujinx.Common.Memory;
  2  using Ryujinx.Common.Utilities;
  3  using System;
  4  using System.IO;
  5  using System.Linq;
  6  using System.Reflection;
  7  using System.Threading.Tasks;
  8  
  9  namespace Ryujinx.Common
 10  {
 11      public static class EmbeddedResources
 12      {
 13          private readonly static Assembly _resourceAssembly;
 14  
 15          static EmbeddedResources()
 16          {
 17              _resourceAssembly = Assembly.GetAssembly(typeof(EmbeddedResources));
 18          }
 19  
 20          public static byte[] Read(string filename)
 21          {
 22              var (assembly, path) = ResolveManifestPath(filename);
 23  
 24              return Read(assembly, path);
 25          }
 26  
 27          public static Task<byte[]> ReadAsync(string filename)
 28          {
 29              var (assembly, path) = ResolveManifestPath(filename);
 30  
 31              return ReadAsync(assembly, path);
 32          }
 33  
 34          public static byte[] Read(Assembly assembly, string filename)
 35          {
 36              using var stream = GetStream(assembly, filename);
 37              if (stream == null)
 38              {
 39                  return null;
 40              }
 41  
 42              return StreamUtils.StreamToBytes(stream);
 43          }
 44  
 45          public static MemoryOwner<byte> ReadFileToRentedMemory(string filename)
 46          {
 47              var (assembly, path) = ResolveManifestPath(filename);
 48  
 49              return ReadFileToRentedMemory(assembly, path);
 50          }
 51  
 52          public static MemoryOwner<byte> ReadFileToRentedMemory(Assembly assembly, string filename)
 53          {
 54              using var stream = GetStream(assembly, filename);
 55  
 56              return stream is null
 57                  ? null
 58                  : StreamUtils.StreamToRentedMemory(stream);
 59          }
 60  
 61          public async static Task<byte[]> ReadAsync(Assembly assembly, string filename)
 62          {
 63              using var stream = GetStream(assembly, filename);
 64              if (stream == null)
 65              {
 66                  return null;
 67              }
 68  
 69              return await StreamUtils.StreamToBytesAsync(stream);
 70          }
 71  
 72          public static string ReadAllText(string filename)
 73          {
 74              var (assembly, path) = ResolveManifestPath(filename);
 75  
 76              return ReadAllText(assembly, path);
 77          }
 78  
 79          public static Task<string> ReadAllTextAsync(string filename)
 80          {
 81              var (assembly, path) = ResolveManifestPath(filename);
 82  
 83              return ReadAllTextAsync(assembly, path);
 84          }
 85  
 86          public static string ReadAllText(Assembly assembly, string filename)
 87          {
 88              using var stream = GetStream(assembly, filename);
 89              if (stream == null)
 90              {
 91                  return null;
 92              }
 93  
 94              using var reader = new StreamReader(stream);
 95              return reader.ReadToEnd();
 96          }
 97  
 98          public async static Task<string> ReadAllTextAsync(Assembly assembly, string filename)
 99          {
100              using var stream = GetStream(assembly, filename);
101              if (stream == null)
102              {
103                  return null;
104              }
105  
106              using var reader = new StreamReader(stream);
107              return await reader.ReadToEndAsync();
108          }
109  
110          public static Stream GetStream(string filename)
111          {
112              var (assembly, path) = ResolveManifestPath(filename);
113  
114              return GetStream(assembly, path);
115          }
116  
117          public static Stream GetStream(Assembly assembly, string filename)
118          {
119              var @namespace = assembly.GetName().Name;
120              var manifestUri = @namespace + "." + filename.Replace('/', '.');
121  
122              var stream = assembly.GetManifestResourceStream(manifestUri);
123  
124              return stream;
125          }
126  
127          public static string[] GetAllAvailableResources(string path, string ext = "")
128          {
129              return ResolveManifestPath(path).Item1.GetManifestResourceNames()
130                  .Where(r => r.EndsWith(ext))
131                  .ToArray();
132          }
133  
134          private static (Assembly, string) ResolveManifestPath(string filename)
135          {
136              var segments = filename.Split('/', 2, StringSplitOptions.RemoveEmptyEntries);
137  
138              if (segments.Length >= 2)
139              {
140                  foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
141                  {
142                      if (assembly.GetName().Name == segments[0])
143                      {
144                          return (assembly, segments[1]);
145                      }
146                  }
147              }
148  
149              return (_resourceAssembly, filename);
150          }
151      }
152  }