using System; using System.IO; using System.Text; using System.Threading.Tasks; namespace RobloxFiles { /// /// Represents a loaded *.rbxl/*.rbxm Roblox file. /// The contents of the RobloxFile are stored as its children. /// public abstract class RobloxFile : Instance { protected abstract void ReadFile(byte[] buffer); public abstract void Save(Stream stream); /// /// Opens a RobloxFile using the provided buffer. /// public static RobloxFile Open(byte[] buffer) { if (buffer.Length > 14) { string header = Encoding.UTF7.GetString(buffer, 0, 14); RobloxFile file = null; if (header == BinaryRobloxFile.MagicHeader) file = new BinaryRobloxFile(); else if (header.StartsWith(" /// Opens a Roblox file by reading from a provided Stream. /// /// The stream to read the Roblox file from. public static RobloxFile Open(Stream stream) { byte[] buffer; using (MemoryStream memoryStream = new MemoryStream()) { stream.CopyTo(memoryStream); buffer = memoryStream.ToArray(); } return Open(buffer); } /// /// Opens a Roblox file from a provided file path. /// /// A path to a Roblox file to be opened. public static RobloxFile Open(string filePath) { byte[] buffer = File.ReadAllBytes(filePath); return Open(buffer); } /// /// Creates and runs a Task to open a Roblox file from a byte sequence that represents the file. /// /// A byte sequence that represents the file. public static Task OpenAsync(byte[] buffer) { return Task.Run(() => Open(buffer)); } /// /// Creates and runs a Task to open a Roblox file using a provided Stream. /// /// The stream to read the Roblox file from. public static Task OpenAsync(Stream stream) { return Task.Run(() => Open(stream)); } /// /// Opens a Roblox file from a provided file path. /// /// A path to a Roblox file to be opened. public static Task OpenAsync(string filePath) { return Task.Run(() => Open(filePath)); } } }