using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Text; namespace Ryujinx.HLE.Loaders.Npdm { public class ServiceAccessControl { public IReadOnlyDictionary Services { get; private set; } /// The stream does not support reading, is , or is already closed. /// An error occured while reading bytes from the stream. /// The end of the stream is reached. /// The stream is closed. /// An I/O error occurred. public ServiceAccessControl(Stream stream, int offset, int size) { stream.Seek(offset, SeekOrigin.Begin); BinaryReader reader = new(stream); int bytesRead = 0; Dictionary services = new(); while (bytesRead != size) { byte controlByte = reader.ReadByte(); if (controlByte == 0) { break; } int length = (controlByte & 0x07) + 1; bool registerAllowed = (controlByte & 0x80) != 0; services[Encoding.ASCII.GetString(reader.ReadBytes(length))] = registerAllowed; bytesRead += length + 1; } Services = new ReadOnlyDictionary(services); } } }