nifm.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "core/core.h"
  5. #include "core/hle/ipc_helpers.h"
  6. #include "core/hle/kernel/event.h"
  7. #include "core/hle/service/nifm/nifm.h"
  8. #include "core/hle/service/service.h"
  9. namespace Service::NIFM {
  10. class IScanRequest final : public ServiceFramework<IScanRequest> {
  11. public:
  12. explicit IScanRequest() : ServiceFramework("IScanRequest") {
  13. static const FunctionInfo functions[] = {
  14. {0, nullptr, "Submit"},
  15. {1, nullptr, "IsProcessing"},
  16. {2, nullptr, "GetResult"},
  17. {3, nullptr, "GetSystemEventReadableHandle"},
  18. };
  19. RegisterHandlers(functions);
  20. }
  21. };
  22. class IRequest final : public ServiceFramework<IRequest> {
  23. public:
  24. explicit IRequest() : ServiceFramework("IRequest") {
  25. static const FunctionInfo functions[] = {
  26. {0, &IRequest::GetRequestState, "GetRequestState"},
  27. {1, &IRequest::GetResult, "GetResult"},
  28. {2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"},
  29. {3, &IRequest::Cancel, "Cancel"},
  30. {4, nullptr, "Submit"},
  31. {5, nullptr, "SetRequirement"},
  32. {6, nullptr, "SetRequirementPreset"},
  33. {8, nullptr, "SetPriority"},
  34. {9, nullptr, "SetNetworkProfileId"},
  35. {10, nullptr, "SetRejectable"},
  36. {11, &IRequest::SetConnectionConfirmationOption, "SetConnectionConfirmationOption"},
  37. {12, nullptr, "SetPersistent"},
  38. {13, nullptr, "SetInstant"},
  39. {14, nullptr, "SetSustainable"},
  40. {15, nullptr, "SetRawPriority"},
  41. {16, nullptr, "SetGreedy"},
  42. {17, nullptr, "SetSharable"},
  43. {18, nullptr, "SetRequirementByRevision"},
  44. {19, nullptr, "GetRequirement"},
  45. {20, nullptr, "GetRevision"},
  46. {21, nullptr, "GetAppletInfo"},
  47. {22, nullptr, "GetAdditionalInfo"},
  48. {23, nullptr, "SetKeptInSleep"},
  49. {24, nullptr, "RegisterSocketDescriptor"},
  50. {25, nullptr, "UnregisterSocketDescriptor"},
  51. };
  52. RegisterHandlers(functions);
  53. auto& kernel = Core::System::GetInstance().Kernel();
  54. event1 = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IRequest:Event1");
  55. event2 = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IRequest:Event2");
  56. }
  57. private:
  58. void GetRequestState(Kernel::HLERequestContext& ctx) {
  59. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  60. IPC::ResponseBuilder rb{ctx, 3};
  61. rb.Push(RESULT_SUCCESS);
  62. rb.Push<u32>(0);
  63. }
  64. void GetResult(Kernel::HLERequestContext& ctx) {
  65. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  66. IPC::ResponseBuilder rb{ctx, 2};
  67. rb.Push(RESULT_SUCCESS);
  68. }
  69. void GetSystemEventReadableHandles(Kernel::HLERequestContext& ctx) {
  70. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  71. IPC::ResponseBuilder rb{ctx, 2, 2};
  72. rb.Push(RESULT_SUCCESS);
  73. rb.PushCopyObjects(event1, event2);
  74. }
  75. void Cancel(Kernel::HLERequestContext& ctx) {
  76. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  77. IPC::ResponseBuilder rb{ctx, 2};
  78. rb.Push(RESULT_SUCCESS);
  79. }
  80. void SetConnectionConfirmationOption(Kernel::HLERequestContext& ctx) {
  81. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  82. IPC::ResponseBuilder rb{ctx, 2};
  83. rb.Push(RESULT_SUCCESS);
  84. }
  85. Kernel::SharedPtr<Kernel::Event> event1, event2;
  86. };
  87. class INetworkProfile final : public ServiceFramework<INetworkProfile> {
  88. public:
  89. explicit INetworkProfile() : ServiceFramework("INetworkProfile") {
  90. static const FunctionInfo functions[] = {
  91. {0, nullptr, "Update"},
  92. {1, nullptr, "PersistOld"},
  93. {2, nullptr, "Persist"},
  94. };
  95. RegisterHandlers(functions);
  96. }
  97. };
  98. class IGeneralService final : public ServiceFramework<IGeneralService> {
  99. public:
  100. IGeneralService();
  101. private:
  102. void GetClientId(Kernel::HLERequestContext& ctx) {
  103. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  104. IPC::ResponseBuilder rb{ctx, 4};
  105. rb.Push(RESULT_SUCCESS);
  106. rb.Push<u64>(0);
  107. }
  108. void CreateScanRequest(Kernel::HLERequestContext& ctx) {
  109. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  110. rb.Push(RESULT_SUCCESS);
  111. rb.PushIpcInterface<IScanRequest>();
  112. LOG_DEBUG(Service_NIFM, "called");
  113. }
  114. void CreateRequest(Kernel::HLERequestContext& ctx) {
  115. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  116. rb.Push(RESULT_SUCCESS);
  117. rb.PushIpcInterface<IRequest>();
  118. LOG_DEBUG(Service_NIFM, "called");
  119. }
  120. void RemoveNetworkProfile(Kernel::HLERequestContext& ctx) {
  121. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  122. IPC::ResponseBuilder rb{ctx, 2};
  123. rb.Push(RESULT_SUCCESS);
  124. }
  125. void CreateTemporaryNetworkProfile(Kernel::HLERequestContext& ctx) {
  126. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  127. rb.Push(RESULT_SUCCESS);
  128. rb.PushIpcInterface<INetworkProfile>();
  129. LOG_DEBUG(Service_NIFM, "called");
  130. }
  131. void IsWirelessCommunicationEnabled(Kernel::HLERequestContext& ctx) {
  132. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  133. IPC::ResponseBuilder rb{ctx, 3};
  134. rb.Push(RESULT_SUCCESS);
  135. rb.Push<u8>(0);
  136. }
  137. void IsEthernetCommunicationEnabled(Kernel::HLERequestContext& ctx) {
  138. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  139. IPC::ResponseBuilder rb{ctx, 3};
  140. rb.Push(RESULT_SUCCESS);
  141. rb.Push<u8>(0);
  142. }
  143. void IsAnyInternetRequestAccepted(Kernel::HLERequestContext& ctx) {
  144. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  145. IPC::ResponseBuilder rb{ctx, 3};
  146. rb.Push(RESULT_SUCCESS);
  147. rb.Push<u8>(0);
  148. }
  149. };
  150. IGeneralService::IGeneralService() : ServiceFramework("IGeneralService") {
  151. static const FunctionInfo functions[] = {
  152. {1, &IGeneralService::GetClientId, "GetClientId"},
  153. {2, &IGeneralService::CreateScanRequest, "CreateScanRequest"},
  154. {4, &IGeneralService::CreateRequest, "CreateRequest"},
  155. {5, nullptr, "GetCurrentNetworkProfile"},
  156. {6, nullptr, "EnumerateNetworkInterfaces"},
  157. {7, nullptr, "EnumerateNetworkProfiles"},
  158. {8, nullptr, "GetNetworkProfile"},
  159. {9, nullptr, "SetNetworkProfile"},
  160. {10, &IGeneralService::RemoveNetworkProfile, "RemoveNetworkProfile"},
  161. {11, nullptr, "GetScanDataOld"},
  162. {12, nullptr, "GetCurrentIpAddress"},
  163. {13, nullptr, "GetCurrentAccessPointOld"},
  164. {14, &IGeneralService::CreateTemporaryNetworkProfile, "CreateTemporaryNetworkProfile"},
  165. {15, nullptr, "GetCurrentIpConfigInfo"},
  166. {16, nullptr, "SetWirelessCommunicationEnabled"},
  167. {17, &IGeneralService::IsWirelessCommunicationEnabled, "IsWirelessCommunicationEnabled"},
  168. {18, nullptr, "GetInternetConnectionStatus"},
  169. {19, nullptr, "SetEthernetCommunicationEnabled"},
  170. {20, &IGeneralService::IsEthernetCommunicationEnabled, "IsEthernetCommunicationEnabled"},
  171. {21, &IGeneralService::IsAnyInternetRequestAccepted, "IsAnyInternetRequestAccepted"},
  172. {22, nullptr, "IsAnyForegroundRequestAccepted"},
  173. {23, nullptr, "PutToSleep"},
  174. {24, nullptr, "WakeUp"},
  175. {25, nullptr, "GetSsidListVersion"},
  176. {26, nullptr, "SetExclusiveClient"},
  177. {27, nullptr, "GetDefaultIpSetting"},
  178. {28, nullptr, "SetDefaultIpSetting"},
  179. {29, nullptr, "SetWirelessCommunicationEnabledForTest"},
  180. {30, nullptr, "SetEthernetCommunicationEnabledForTest"},
  181. {31, nullptr, "GetTelemetorySystemEventReadableHandle"},
  182. {32, nullptr, "GetTelemetryInfo"},
  183. {33, nullptr, "ConfirmSystemAvailability"},
  184. {34, nullptr, "SetBackgroundRequestEnabled"},
  185. {35, nullptr, "GetScanData"},
  186. {36, nullptr, "GetCurrentAccessPoint"},
  187. {37, nullptr, "Shutdown"},
  188. };
  189. RegisterHandlers(functions);
  190. }
  191. class NetworkInterface final : public ServiceFramework<NetworkInterface> {
  192. public:
  193. explicit NetworkInterface(const char* name) : ServiceFramework{name} {
  194. static const FunctionInfo functions[] = {
  195. {4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"},
  196. {5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"},
  197. };
  198. RegisterHandlers(functions);
  199. }
  200. void CreateGeneralServiceOld(Kernel::HLERequestContext& ctx) {
  201. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  202. rb.Push(RESULT_SUCCESS);
  203. rb.PushIpcInterface<IGeneralService>();
  204. LOG_DEBUG(Service_NIFM, "called");
  205. }
  206. void CreateGeneralService(Kernel::HLERequestContext& ctx) {
  207. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  208. rb.Push(RESULT_SUCCESS);
  209. rb.PushIpcInterface<IGeneralService>();
  210. LOG_DEBUG(Service_NIFM, "called");
  211. }
  212. };
  213. void InstallInterfaces(SM::ServiceManager& service_manager) {
  214. std::make_shared<NetworkInterface>("nifm:a")->InstallAsService(service_manager);
  215. std::make_shared<NetworkInterface>("nifm:s")->InstallAsService(service_manager);
  216. std::make_shared<NetworkInterface>("nifm:u")->InstallAsService(service_manager);
  217. }
  218. } // namespace Service::NIFM