ServiceMgr.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using Ryujinx.Core.OsHle.IpcServices;
  2. using Ryujinx.Core.OsHle.IpcServices.Acc;
  3. using Ryujinx.Core.OsHle.IpcServices.Am;
  4. using Ryujinx.Core.OsHle.IpcServices.Apm;
  5. using Ryujinx.Core.OsHle.IpcServices.Aud;
  6. using Ryujinx.Core.OsHle.IpcServices.Bsd;
  7. using Ryujinx.Core.OsHle.IpcServices.Friend;
  8. using Ryujinx.Core.OsHle.IpcServices.FspSrv;
  9. using Ryujinx.Core.OsHle.IpcServices.Hid;
  10. using Ryujinx.Core.OsHle.IpcServices.Lm;
  11. using Ryujinx.Core.OsHle.IpcServices.Nifm;
  12. using Ryujinx.Core.OsHle.IpcServices.Ns;
  13. using Ryujinx.Core.OsHle.IpcServices.NvServices;
  14. using Ryujinx.Core.OsHle.IpcServices.Pctl;
  15. using Ryujinx.Core.OsHle.IpcServices.Pl;
  16. using Ryujinx.Core.OsHle.IpcServices.Set;
  17. using Ryujinx.Core.OsHle.IpcServices.Sfdnsres;
  18. using Ryujinx.Core.OsHle.IpcServices.Sm;
  19. using Ryujinx.Core.OsHle.IpcServices.Ssl;
  20. using Ryujinx.Core.OsHle.IpcServices.Time;
  21. using Ryujinx.Core.OsHle.IpcServices.Vi;
  22. using System;
  23. using System.Collections.Generic;
  24. namespace Ryujinx.Core.OsHle
  25. {
  26. class ServiceMgr : IDisposable
  27. {
  28. private Dictionary<string, IIpcService> Services;
  29. public ServiceMgr()
  30. {
  31. Services = new Dictionary<string, IIpcService>();
  32. }
  33. public IIpcService GetService(string Name)
  34. {
  35. lock (Services)
  36. {
  37. string LookUpName;
  38. //Same service with different privileges.
  39. if (Name.EndsWith(":a") ||
  40. Name.EndsWith(":m") ||
  41. Name.EndsWith(":s") ||
  42. Name.EndsWith(":su") ||
  43. Name.EndsWith(":u") ||
  44. Name.EndsWith(":u0") ||
  45. Name.EndsWith(":u1"))
  46. {
  47. LookUpName = Name.Substring(0, Name.IndexOf(':'));
  48. }
  49. else
  50. {
  51. LookUpName = Name;
  52. }
  53. if (!Services.TryGetValue(LookUpName, out IIpcService Service))
  54. {
  55. switch (Name)
  56. {
  57. case "acc:u0": Service = new ServiceAcc(); break;
  58. case "aoc:u": Service = new ServiceNs(); break;
  59. case "apm": Service = new ServiceApm(); break;
  60. case "apm:p": Service = new ServiceApm(); break;
  61. case "appletOE": Service = new ServiceAppletOE(); break;
  62. case "audout:u": Service = new ServiceAudOut(); break;
  63. case "audren:u": Service = new ServiceAudRen(); break;
  64. case "bsd:s": Service = new ServiceBsd(); break;
  65. case "bsd:u": Service = new ServiceBsd(); break;
  66. case "friend:a": Service = new ServiceFriend(); break;
  67. case "fsp-srv": Service = new ServiceFspSrv(); break;
  68. case "hid": Service = new ServiceHid(); break;
  69. case "lm": Service = new ServiceLm(); break;
  70. case "nifm:u": Service = new ServiceNifm(); break;
  71. case "nvdrv": Service = new ServiceNvDrv(); break;
  72. case "nvdrv:a": Service = new ServiceNvDrv(); break;
  73. case "pctl:a": Service = new ServicePctl(); break;
  74. case "pl:u": Service = new ServicePl(); break;
  75. case "set": Service = new ServiceSet(); break;
  76. case "set:sys": Service = new ServiceSetSys(); break;
  77. case "sfdnsres": Service = new ServiceSfdnsres(); break;
  78. case "sm:": Service = new ServiceSm(); break;
  79. case "ssl": Service = new ServiceSsl(); break;
  80. case "time:s": Service = new ServiceTime(); break;
  81. case "time:u": Service = new ServiceTime(); break;
  82. case "vi:m": Service = new ServiceVi(); break;
  83. case "vi:s": Service = new ServiceVi(); break;
  84. case "vi:u": Service = new ServiceVi(); break;
  85. }
  86. if (Service == null)
  87. {
  88. throw new NotImplementedException(Name);
  89. }
  90. Services.Add(LookUpName, Service);
  91. }
  92. return Service;
  93. }
  94. }
  95. public void Dispose()
  96. {
  97. Dispose(true);
  98. }
  99. protected virtual void Dispose(bool Disposing)
  100. {
  101. if (Disposing)
  102. {
  103. lock (Services)
  104. {
  105. foreach (IIpcService Service in Services.Values)
  106. {
  107. if (Service is IDisposable DisposableSrv)
  108. {
  109. DisposableSrv.Dispose();
  110. }
  111. }
  112. Services.Clear();
  113. }
  114. }
  115. }
  116. }
  117. }