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 }