PrepoIpcServer.cs
1 using Ryujinx.Horizon.Prepo.Types; 2 using Ryujinx.Horizon.Sdk.Arp; 3 using Ryujinx.Horizon.Sdk.Sf.Hipc; 4 using Ryujinx.Horizon.Sdk.Sm; 5 6 namespace Ryujinx.Horizon.Prepo 7 { 8 class PrepoIpcServer 9 { 10 private const int MaxSessionsCount = 12; 11 private const int TotalMaxSessionsCount = MaxSessionsCount * 6; 12 13 private const int PointerBufferSize = 0x80; 14 private const int MaxDomains = 64; 15 private const int MaxDomainObjects = 16; 16 private const int MaxPortsCount = 6; 17 18 private static readonly ManagerOptions _managerOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false); 19 20 private SmApi _sm; 21 private ArpApi _arp; 22 private PrepoServerManager _serverManager; 23 24 public void Initialize() 25 { 26 HeapAllocator allocator = new(); 27 28 _arp = new ArpApi(allocator); 29 30 _sm = new SmApi(); 31 _sm.Initialize().AbortOnFailure(); 32 33 _serverManager = new PrepoServerManager(allocator, _sm, _arp, MaxPortsCount, _managerOptions, TotalMaxSessionsCount); 34 35 #pragma warning disable IDE0055 // Disable formatting 36 _serverManager.RegisterServer((int)PrepoPortIndex.Admin, ServiceName.Encode("prepo:a"), MaxSessionsCount); // 1.0.0-5.1.0 37 _serverManager.RegisterServer((int)PrepoPortIndex.Admin2, ServiceName.Encode("prepo:a2"), MaxSessionsCount); // 6.0.0+ 38 _serverManager.RegisterServer((int)PrepoPortIndex.Manager, ServiceName.Encode("prepo:m"), MaxSessionsCount); 39 _serverManager.RegisterServer((int)PrepoPortIndex.User, ServiceName.Encode("prepo:u"), MaxSessionsCount); 40 _serverManager.RegisterServer((int)PrepoPortIndex.System, ServiceName.Encode("prepo:s"), MaxSessionsCount); 41 _serverManager.RegisterServer((int)PrepoPortIndex.Debug, ServiceName.Encode("prepo:d"), MaxSessionsCount); // 1.0.0 42 #pragma warning restore IDE0055 43 } 44 45 public void ServiceRequests() 46 { 47 _serverManager.ServiceRequests(); 48 } 49 50 public void Shutdown() 51 { 52 _arp.Dispose(); 53 _serverManager.Dispose(); 54 _sm.Dispose(); 55 } 56 } 57 }